将Flash的Sprite导入Unity(解释说明版)

摘要:
usingUnityEngine;usingUnityEditor;usingSystem.IO;usingSystem.Xml;usingSystem.Reflection;publicclassAutoSliceSpriteSheetWithXML:AssetPostprocessor{privatevoidOnPreprocessTexture(){Debug.Log(1);//获取各种路径
将Flash的Sprite导入Unity(解释说明版)第1张将Flash的Sprite导入Unity(解释说明版)第2张
usingUnityEngine;
usingUnityEditor;
usingSystem.IO;
usingSystem.Xml;
usingSystem.Reflection;

public classAutoSliceSpriteSheetWithXML : AssetPostprocessor
{

    private voidOnPreprocessTexture()
    {
        Debug.Log(1);
        //获取各种路径
        string dataPath = Application.dataPath.Substring(0, Application.dataPath.LastIndexOf("/") + 1);
        string fullPath = dataPath +assetPath;
        string fileName_without_extension =Path.GetFileNameWithoutExtension(fullPath);
        string extension =Path.GetExtension(fullPath);
        string dirPath =Path.GetDirectoryName(fullPath);
        string xml_fileName = fileName_without_extension + ".xml";
        string xml_fullPath =Path.Combine(dirPath, xml_fileName);
        string text = "";
        //检测是否存在同名的.xml文件,不存在则不用处理
        if(File.Exists(xml_fullPath))
        {
            using (StreamReader reader = newStreamReader(xml_fullPath))
            {
                //读一行
                string line =reader.ReadLine();
                while (line != null)
                {
                    //如果这一行里面有abe这三个字符,就不加入到text中,如果没有就加入
                    if (line.IndexOf("version") >= 0 || line.IndexOf("adobe") >= 0)
                    {
                        ;
                    }
                    else{
                        text += line +System.Environment.NewLine;
                    }
                    //一行一行读
                    line =reader.ReadLine();
                }
            }
            //定义一个写入流,将值写入到里面去 
            string newPath = Path.Combine(dirPath, "new" +xml_fileName);
            using (StreamWriter writer = newStreamWriter(newPath))
            {
                writer.Write(text);
            }

            Debug.Log(2);
            //根据XML参数进行自动进行图片切割
            XmlDocument doc = newXmlDocument();
            //加载xml文件
doc.Load(newPath);

            //从xml中读取第一个节点,该节点imagePath是对应图片的名字,再次确定查看是否和图片的名字匹配
Debug.Log(doc.FirstChild.ToString());
            string target_path = (doc.FirstChild as XmlElement).GetAttribute("imagePath");
            if (target_path != fileName_without_extension +extension)
            {
                Debug.Log(target_path.ToString());
                throw new System.Exception("当前xml不是对应图片的xml...");
            }
            

            //将导入对象转换为TextureImporter对象,注意,这里最好在前面加上判断是否是贴图文件
            var importer = assetImporter asTextureImporter;
            //将贴图文件的类型修改由默认的单张精灵切片修改为多张精灵切片类型
            importer.spriteImportMode =SpriteImportMode.Multiple;

            //通过反射获取导入图片的长和宽,为什么要获取长和宽,因为unity中以左上角为起点,大部分图集工具中是以左下角为原点,需要转换
            object[] args = new object[2];
            MethodInfo methodInfo = typeof(TextureImporter).GetMethod("GetWidthAndHeight", BindingFlags.NonPublic |BindingFlags.Instance);
            methodInfo.Invoke(importer, args);

            int texture_width = (int)args[0];
            int texture_height = (int)args[1];

            //获取所有的目标节点
            var xml_nodes =doc.FirstChild.ChildNodes;

            //新建精灵切片数据集合
            var spriteMetaDatas = newSpriteMetaData[xml_nodes.Count];

            Debug.Log(xml_nodes.Count);

            //遍历所有节点信息
            for (int i = 0; i < xml_nodes.Count; i++)
            {
                var node =xml_nodes[i];
                XmlElement element = node asXmlElement;

                //获取节点中所带的信息
                string sprite_name = element.GetAttribute("name");

                float x = float.Parse(element.GetAttribute("x"));
                float y = float.Parse(element.GetAttribute("y"));
                float width = float.Parse(element.GetAttribute("width"));
                float height = float.Parse(element.GetAttribute("height"));
                Debug.Log(x);
                Debug.Log(y);
                Debug.Log(width);
                Debug.Log(height);
                Debug.Log("ok");

                //re_y是指反向的y,因为unity处理贴图默认以左上角为原点,大部分图集工具中是以左下角为原点,从而导致y值错误,所以这里重新计算y正确的值
                float re_y = texture_height - y -height;

                //新建精灵切片数据对象用于保存单个切片信息
                SpriteMetaData one_SpriteMetaData = newSpriteMetaData();
                one_SpriteMetaData.name =sprite_name;
                one_SpriteMetaData.alignment = (int)SpriteAlignment.Center;
                one_SpriteMetaData.rect = newRect(x, re_y, width, height);
                spriteMetaDatas[i] =one_SpriteMetaData;
            }
            Debug.Log(3);
            //将所有精灵切片信息数据绑定到TextureImporter上完成设置
            importer.spritesheet =spriteMetaDatas;
            Debug.Log(4);
        }
    }
}
View Code

准备工作:

在Unity项目的AssetsEditor下新增AutoSliceSpriteSheetWithXML.cs,粘贴上述代码。

使用流程:

Flash的Sprite选中后进行“导出png序列”操作,将产生一个包含各帧内容的png文件以及用来描述如何切割为不同帧的xml文件。

在Unity对Project的AssetsEditorAutoSliceSpriteSheetWithXML进行右键,选择import new assert,先导入xml,而后导入png。

脚本将自动产生new前缀文件(可删除),并对png进行切割。

代码解析:

png导入后,脚本将寻找同目录下的同名xml文件,删除其中Flash版本号与注释,创建new前缀文件并写入。该操作目的是简化后续的first child与sibling处理。

而后遍历new前缀文件的SubTexture元素,根据其中坐标与长宽对png进行切割。需要注意的是Flash坐标的Y轴与Unity坐标的Y轴反向,因而切割时脚本需要重新计算其Y轴。

免责声明:文章转载自《将Flash的Sprite导入Unity(解释说明版)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇munge源码编译liquibase之快速入门下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

文件上传细节处理

文件上传中,我们会遇到很多问题,例如: 1、上传文件名的中文乱码和上传数据的中文乱码: upload.setHeaderEncoding("UTF-8"); //解决上传文件名的中文乱码//表单为文件上传,设置request编码无效,只能手工转换1.1 value = new String(value.getBytes("iso8859-1"),"UTF-...

Java: 获取当前执行位置的文件名/类名/方法名/行号

在 JAVA 程序有时需要获取当前代码位置, 于是就利用 Thread.currentThread().getStackTrace() 写了下面这个工具类, 用来获取当前执行位置处代码的文件名/类名/方法名/行号. 当然通过 new Throwable().getStackTrace() 也能得到同样信息, 在处理异常时用这种方法还行, 否则需要 new...

delphi 文件的操作

转载至:http://hi.baidu.com/endlesslove137/blog/item/86f1669990a7ed046f068ced.html //判断文件是否存在 FileExists//判断文件夹是否存在 DirectoryExists//删除文件 DeleteFile; Windows.DeleteFile//删除文件夹 Remove...

SparkSQL学习笔记

概述冠状病毒来临,宅在家中给国家做贡献之际,写一篇随笔记录SparkSQL的学习笔记,目的有二,一是记录整理之前的知识作为备忘录,二是分享技术,大家共同进步,有问题也希望大家不吝赐教。总体而言,大数据主要包含三种操作:长时间运行的批量数据处理;交互式运行的数据查询;实时数据流处理。sparkSQL特点:数据兼容,不仅兼容hive,还可以从rdd,parqu...

Android Studio中一套代码多版本打包

一套代码达到以下效果: 打包不同applicationId能同时安装在同一手机上 不同logo,app名称, 不同第三方SDK接入配置(例如微信分享appid,激光推送appkey) 能区分debug和release配置 甚至不同的so文件,不同的依赖jar包 (待补充) 使用到的功能:productFlavor和buildTypes 原理:优先级bu...

【工具类用法】Hutool里的生成唯一Id唯的工具类

目录 一、介绍 二、使用 2.1 UUID 2.2 ObjectId 2.3 Snowflake 三、测试类 3.1 测试类 3.2 测试结果 一、介绍在分布式环境中,唯一ID生成应用十分广泛,生成方法也多种多样,Hutool针对一些常用生成策略做了简单封装。 唯一ID生成器的工具类,涵盖了: UUIDObjectId(MongoDB)Snowflake(...