C# Unity预制体绑定spine SkeleDataAsset 工具 v1版

导语

这个版本比较通用,部分扩展功能还没有来得级实现,如有特殊要求,还望自行修改。
话不多少说,代码一般,还望见谅。

美术资源匹配工具
    --- 功能需求
	
	    --- 基本功能
	        --- 根据文件名自动绑定对应名称的Unity 预制件
	        --- 检查源文加夹和对应文件夹的重名情况
			
		--- 扩展功能
		    --- 指定文件名操作绑定Unity 预制件
			--- 大批量更新
		
	--- 需求文件
	    --- 美术资源源文件夹(UI文件)
		--- 项目路径下的美术资源文件夹(../animation/sprite)
		--- 项目路径下的Unity预制件文件夹(../Modules/Sprite)
		
	--- 基本功能逻辑流程
	    --- 获取美术资源文件夹地址
	
	    --- 默认项目路径下的美术资源文件夹(../animation/sprite)
		
		--- 默认项目路径下的Unity预制件文件夹(../Modules/Sprite)
		
	    --- 检索美术资源源文件夹下所有文件
		    --- 检查同名文件下是否包含( .atlas.txt/.skel.bytes/.png/_Atlas.asset/_Material/_SkeletonData.asset)
			    --- 缺少对应文件打印错误信息
				--- 生成错误文本(时间 + ".txt")
				--- 把错误信息写入错误文本
				--- 跳过该文件
					
		--- 检查项目路径下的美术资源文件夹下所有文件
		    --- 检查源文件夹中对应同名文件是否齐全,应包含( .atlas.txt/.skel.bytes/.png/_Atlas.asset/_Material/_SkeletonData.asset)
			    --- 文件缺失
				    --- 从源文件夹下复制该文件到目标文件夹
				--- 文件齐全
				    --- 创建对应文件名.prefab文件到项目路径下的Unity预制件文件夹(../Modules/Sprite)
		
		--- 资源设置绑定
		    --- 设置Rect Trasform 的 position X,Y,Z为0,Width,Height 为 100,Scale为1
		    --- 添加脚本组件(Skeleton Graphic)
			    --- 通过该资源名找到项目路径下的美术资源文件夹目录的同名_SkeletonData.asset("1231545"+_SkeletonData.asset)
				--- 绑定到脚本组件(Skeleton Graphic)下的Skeleton Data Asset下
				--- 绑定完成后打印完成信息(name+".prefab绑定完成")
	   
		--- 退出功能

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
		
	---扩展功能逻辑流程
	
	    --- 指定操作绑定Unity预制件
		
	        --- 索引项目路径下的美术资源文件夹
		        --- 找到指定文件名("123456231")
		        --- 创建对应Unity 预制件("123456231" + ".prefab")
				--- 进入资源设置绑定逻辑
				
		--- 大批量更新
		
		    --- 找到美术资源源文件夹(UI文件)
			     --- 检索美术资源源文件夹下所有文件
		             --- 检查同名文件下是否包含( .atlas.txt/.json/.png/_Atlas.asset/_Material/_SkeletonData.asset)
			         --- 缺少对应文件打印错误信息
					 --- 生成错误文本(时间 + "大批量更新错误.txt")
				     --- 把错误信息写入错误文本
				     --- 中断程序运行
					 
		    --- 找到项目路径下的美术资源文件夹(../animation/sprite)
			    --- 清空所有文件
				
			--- 找到项目路径下的Unity预制件文件夹(../Modules/Sprite)
			    --- 清空所有文件
			
			--- 进入基本功能逻辑流程
			
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
具体实现

using System;
using System.IO;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;


/// 
/// author:pigsohappy(CSDN论坛名)
/// 功能需求:
/// 针对美术资源引用需求做的小工具,还可以继续优化添加功能
/// 
/// 准备工作:
/// 使用前请手动修改 ArtResource(美术资源文件夹) aimFile(项目内存放文件夹第一层Resources目录下) preFile(项目内保存预制的文件夹)
/// 
/// 工具入口:
/// Unity窗口工具栏Tools/ArtResource
/// 
/// 具体功能:
/// Examine(检查导入)直接从美术资源目录导入到工程内目标目录(.png,.atlas.txt,.skel.bytes三种格式文件。注意:扩展名不符合将不会被导入项目工程内)
/// UpData(更新生成预制)根据项目内目标文件夹的Png文件Id创建同名预制,并且绑定同名的"_SkeletonData"文件
/// Browse(浏览对比美术资源)判断美术资源目录的同id的(.png,.atlas.txt,.skel.bytes三种格式文件)数量、ID是否相同,生成检查和错误日志。
/// 


public class ArtTools : Editor                                                        //继承于UnityEditor类
    {
    //统一创建资源路径

    //美术资源
    class ResourcePath
    {
        public string ArtResource = @"E:\UI文件\角色";
        public string aimFile = @"E:\pro\Resources\123";
        public string preFile = @"E:\pro\Assets\Modules\prefab";
        public string [] Pngfiles = Directory.GetFiles(@"E:\UI文件\角色", "*.png", SearchOption.AllDirectories);
        public string [] AssetFiles = Directory.GetFiles(@"E:\UI文件\角色", "*.atlas.txt", SearchOption.AllDirectories);
        public string [] SkelFiles = Directory.GetFiles(@"E:\UI文件\角色", "*.skel.bytes", SearchOption.AllDirectories);
        public string ReportPath = @"E:\pro\Resources\logrecord\";
    }

    //项目内资源目录
    class PrefabFile
    {
        public string[] Png = Directory.GetFiles(@"E:\pro\lzClientDemo1\Assets\LZ\Resources\123", "*.png", SearchOption.AllDirectories);
        public string[] Asset = Directory.GetFiles(@"E:\pro\lzClientDemo1\Assets\LZ\Resources\123", "*.atlas.txt", SearchOption.AllDirectories);
        public string[] Skel = Directory.GetFiles(@"E:\pro\lzClientDemo1\Assets\LZ\Resources\123", "*.skel.bytes", SearchOption.AllDirectories);
        public string[] SkeletonFile = Directory.GetFiles(@"E:\pro\lzClientDemo1\Assets\LZ\Resources\123", "*_SkeletonData.asset", SearchOption.AllDirectories);
    }

    class NameID
    {
        public string PngName;
        public string AssetName;
        public string SkelName;
        public int RES = 0;
    }

    /// 
    /// 把美术资源导入项目指定目录内
    /// 
    [MenuItem("Tools/ArtResource/HeroExamine/Examine")]
    public static void Examine()
    {
        
        ResourcePath ExamineResourcePath = new ResourcePath();
        NameID ExamineID = new NameID();

        if (Directory.Exists(ExamineResourcePath.ArtResource))
        {
            
            Debug.Log("找到指定路径!!" + ExamineResourcePath.ArtResource);

            


            //获取三个文件类型的数量
            var Pngfiles = ExamineResourcePath.Pngfiles;
            var AssetFiles = ExamineResourcePath.AssetFiles;
            var SkelFiles = ExamineResourcePath.SkelFiles;
            if(Pngfiles.Length ==AssetFiles.Length&& AssetFiles.Length == SkelFiles.Length)
            {
                Debug.Log("资源齐全,具体请查看" + ExamineResourcePath.ReportPath + "检查报告");
            }
            else if(Pngfiles.Length == AssetFiles.Length)
            {
                Debug.LogError("将根据最少数量文件导入,具体查看" + ExamineResourcePath.ReportPath + "缺失报告");
            }else if (Pngfiles.Length == SkelFiles.Length)
            {
                Debug.LogError("将根据最少数量文件导入,具体查看" + ExamineResourcePath.ReportPath + "缺失报告");
            }
            

            //创建.skel.bytes两个过滤名
            string skeFullName;
            string SkelTempName;

            //创建过滤后的文件数组
            List FullID = new List();

            
            for (int v = 0; v < Pngfiles.Length; v++)
            {
                ExamineID.PngName = Path.GetFileNameWithoutExtension(Pngfiles[v]).Substring(0, 8);
                for (int i =0;i< AssetFiles.Length;i++)
                {
                    ExamineID.AssetName = Path.GetFileNameWithoutExtension(AssetFiles[i]).Substring(0, 8);
                    if (ExamineID.PngName == ExamineID.AssetName)
                    {
                        for(int n =0;n< SkelFiles.Length; n++)
                        {
                            ExamineID.SkelName = Path.GetFileNameWithoutExtension(SkelFiles[n]).Substring(0, 8);
                            SkelTempName = ExamineID.SkelName + ".skel" + Path.GetExtension(SkelFiles[n]);
                            skeFullName = Path.GetFileName(SkelFiles[n]);
                            if (ExamineID.AssetName == ExamineID.SkelName)
                            {
                                if(skeFullName== SkelTempName)
                                ExamineID.RES = 200;
                                FullID.Add(Pngfiles[v]);
                                FullID.Add(AssetFiles[i]);
                                FullID.Add(SkelFiles[n]);
                            }
                            else
                            {
                                ExamineID.RES = 404;
                            }
                        }
                    }
                    else
                    {
                        ExamineID.RES = 404;
                    }
                }
            }
            if(ExamineID.RES == 200)
            {
                for (int k = 0; k < FullID.Count; k++)
                {
                    Debug.Log("UI文件齐全,开始执行导入");
                    File.Copy(FullID[k], ExamineResourcePath.aimFile + "\\" + Path.GetFileName(FullID[k]), true);
                    Debug.Log("UI文件全部成功导入");
                }
            }else if(ExamineID.RES == 400)
            {
                Debug.LogError(".asset资源文件缺失" + (SkelFiles.Length - AssetFiles.Length) + "个,已停止导入,请使用Browse工具检查");
                Debug.LogError(".skel.bytes资源文件缺失" + (AssetFiles.Length - SkelFiles.Length) + "个,已停止导入,请使用Browse工具检查");
            }
        }
        else
        {
            Debug.LogWarning("没有找到指定路径!!" + ExamineResourcePath.ArtResource);
        }
    }

    /// 
    /// 创建预制体,并绑定相关资源
    /// 
    /// TODO:
    /// 在Resources目录外加载SkeletonDataAsset。
    /// 找到一个创建Spine.Unity.SkeletonDataAsset类的方法,但是需要定义完整属性
    /// 
    ///                         Spine.Unity.SkeletonDataAsset prefabAsset = new Spine.Unity.SkeletonDataAsset();
    ///                         prefabAsset.name = prefabAssetName;
    ///                         new Spine.Unity.SkeletonDataAsset().Clear();
    ///                         Spine.Unity.SkeletonDataAsset prefabAsset = new Spine.Unity.SkeletonDataAsset();
    ///                         prefabAsset.name = prefabAssetName;              Type(string)
    ///                         prefabAsset.skeletonJSON = DataFile;                 Type(TextAsset)
    ///                        
    /// 


    [MenuItem("Tools/ArtResource/HeroExamine/UpData")]
    public static void UpData()
    {
     
        ResourcePath UpDataResourcePath = new ResourcePath();
        PrefabFile UpDataPrefabFile = new PrefabFile();
        NameID UpDataID = new NameID();

        //判断项目内目标路径是否存在
        if (Directory.Exists(UpDataResourcePath.aimFile))
        {
            Debug.Log("找到指定路径!!" + UpDataResourcePath.aimFile);

            //获取三个资源的数量
            var Pngfiles = UpDataPrefabFile.Png;
            Debug.Log("已经获取到需要创建的预制个数:" + Pngfiles.Length);
            var AssetFiles = UpDataPrefabFile.Asset;
            Debug.Log("已经获取到需要创建的资源个数:" + AssetFiles.Length);
            var SkelFiles = UpDataPrefabFile.Skel;
            var SkeletonFile = UpDataPrefabFile.SkeletonFile;
            Debug.Log("已经获取到需要创建的资源个数:" + SkeletonFile.Length);


            for (int i = 0; i < Pngfiles.Length; i++)
            {
                UpDataID.PngName = Path.GetFileNameWithoutExtension(Pngfiles[i]);
                UpDataID.AssetName =Path.GetFileNameWithoutExtension(AssetFiles[i]).Substring(0,8);
                UpDataID.SkelName = Path.GetFileNameWithoutExtension(SkelFiles[i]).Substring(0, 8);
                if(UpDataID.PngName == UpDataID.AssetName)
                {
                    if (UpDataID.AssetName == UpDataID.SkelName)                                                                                          //存在三个同名资源创建预制
                    {
                        GameObject obj = Resources.Load("template") as GameObject;                              //加载模板
                        GameObject prefab = GameObject.Instantiate(obj);                        //实例化模板
                        var prefabAssetName = "123/" + UpDataID.PngName + "_SkeletonData";
                        Spine.Unity.SkeletonDataAsset prefabAsset = Resources.Load(prefabAssetName) as Spine.Unity.SkeletonDataAsset;
                        Spine.Unity.SkeletonGraphic.AddSkeletonGraphicComponent(prefab, prefabAsset);
                        PrefabUtility.CreatePrefab(UpDataResourcePath.preFile + "/" + UpDataID.PngName + ".prefab", prefab);
                        Debug.Log("已创建" + UpDataID.PngName + ".prefab");
                        GameObject.DestroyImmediate(prefab, true);
                    }
                    else
                    {
                        Debug.LogError(UpDataID.PngName + "资源不匹配");
                    }
                  
                }
                else
                {
                    Debug.LogError(UpDataID.PngName + "资源不匹配");
                }
            }
      
        }
        else
        {
            Debug.LogWarning("没有找到指定路径!!" + UpDataResourcePath.aimFile);
        }
       
       
    }

    /// 
    /// 只检查美术资源源文件资源匹配情况,并打印检查和错误日志
    /// 
    [MenuItem("Tools/ArtResource/HeroExamine/Browse")]
    public static void Browse()
    {

        ResourcePath BrowseResourcePath = new ResourcePath();
        NameID BrowseID = new NameID();

        //检查美术资源目录是否存在
        if (Directory.Exists(BrowseResourcePath.ArtResource))
        {
            Debug.Log("找到指定路径!!" + BrowseResourcePath.ArtResource);

            //
            var Pngfiles = BrowseResourcePath.Pngfiles;
            var AssetFiles = BrowseResourcePath.AssetFiles;
            var SkelFiles = BrowseResourcePath.SkelFiles;
            var ReportPath = BrowseResourcePath.ReportPath;

            //删除之前的目录
            Directory.Delete(ReportPath,true);

            //创建检查日志目录
            string logPath = ReportPath + DateTime.Now.ToString("yyyyMMdd") + "检查报告";
            Directory.CreateDirectory(logPath);

            //创建错误日志目录
            string erroPath = ReportPath + DateTime.Now.ToString("yyyyMMdd") + "缺失报告";
            Directory.CreateDirectory(erroPath);

            //创建检查日志文件
            string logName = logPath + "\\" + DateTime.Now.ToString("ddddMMddHH") + "时.txt";
            FileInfo logFile = new FileInfo(logName);
            StreamWriter log = logFile.CreateText();
            log.WriteLine( ".png资源:" + Pngfiles.Length +";" + ".skel.bytes资源:" + SkelFiles.Length + ";" + ".asset资源:" + AssetFiles.Length);
            log.Close();

            //创建错误日志文件
            string eorrName = erroPath + "\\" + DateTime.Now.ToString("ddddMMddHH") + "时.txt";
            FileInfo EorrFile = new FileInfo(eorrName);
            StreamWriter Eorr = EorrFile.CreateText();
            Eorr.WriteLine(".png资源:" + Pngfiles.Length + ";" + ".skel.bytes资源:" + SkelFiles.Length + ";" + ".asset资源:" + AssetFiles.Length);
            Eorr.Close();
                                                 

            List logInfo = new List();                                 //创建检查日志数组
            List eorrInfo = new List();                                //创建错误日志数组

            int P = Pngfiles.Length;                                                               //获取.png资源文件数量
            int S = SkelFiles.Length;                                                              //获取.skel.bytes资源文件数量
            int A = AssetFiles.Length;                                                            //获取.asset资源文件数量
            int k1 = 0;
            int k2 = 0;

            //png文件名检查对比,根据Png数量判断资源完整
            for (int i = 0; i < P; i++)
            {
                BrowseID.PngName = Path.GetFileNameWithoutExtension(Pngfiles[i]);
                
                if (S == P)
                {
                    for(int pi = 0; pi < P; pi++)
                    {
                        BrowseID.SkelName = Path.GetFileNameWithoutExtension(SkelFiles[pi]).Substring(0, 8);
                        if (BrowseID.PngName == BrowseID.SkelName)
                        {
                            BrowseID.RES = 200;
                            break;
                        }
                        if(BrowseID.PngName != BrowseID.SkelName)
                        {
                            BrowseID.RES = 404;
                        }
                    } 
                }
                else if(S < P)
                {
                    if (k1 == i)
                    {
                        for (int si = 0; si < S; si++)
                        {
                            BrowseID.SkelName = Path.GetFileNameWithoutExtension(SkelFiles[si]).Substring(0, 8);
                            if(BrowseID.PngName != BrowseID.SkelName)
                            {
                                BrowseID.RES = 404;
                            }
                            if (BrowseID.PngName == BrowseID.SkelName)
                            {
                                BrowseID.RES = 200;
                                break;
                            }
                        }
                    }
                    else if (k1 == S && k1 < P)
                    {
                        for (int si = S; si < P; si++)
                        {
                            BrowseID.PngName = Path.GetFileNameWithoutExtension(Pngfiles[si]);
                            for (int sv =0; sv < S; sv++)
                            {
                                BrowseID.SkelName = Path.GetFileNameWithoutExtension(SkelFiles[sv]).Substring(0, 8);
                                if(BrowseID.PngName != BrowseID.SkelName)
                                {
                                    BrowseID.RES = 404;
                                }
                                if (BrowseID.PngName == BrowseID.SkelName)
                                {
                                    BrowseID.RES = 200;
                                    break;
                                }
                            }   
                        }
                    }

                    //判断同一名下.skel.bytes资源是否齐全
                    if (BrowseID.RES == 404)
                    {
                        eorrInfo.Add(BrowseID.PngName + ".skel.bytes资源缺失");
                        Debug.Log("对" + BrowseID.PngName + ".skel.bytes检查到异常,已打印日志");
                    }
                    if (BrowseID.RES == 200)
                    {
                        logInfo.Add(BrowseID.PngName + ".skel.bytes资源完整");
                        Debug.Log("对" + BrowseID.PngName + ".skel.bytes资源检查完毕");
                    }
                }
                if (k1 < S-1)
                {
                    k1++;
                }

                if (A == P)
                {
                    for (int ai =0;ai< P;ai++)
                    {
                        BrowseID.AssetName = Path.GetFileNameWithoutExtension(AssetFiles[ai]).Substring(0, 8);
                        if (BrowseID.PngName == BrowseID.AssetName)
                        {
                            BrowseID.RES = 200;
                             break;
                        } 
                        if(BrowseID.PngName != BrowseID.AssetName)
                        {
                            BrowseID.RES = 404;
                        }
                    }
                }
                else if (A < P)
                {
                    if (k2 == i)
                    {
                        for (int av = 0;av  P)
                    {
                        BrowseID.AssetName = Path.GetFileNameWithoutExtension(AssetFiles[i]).Substring(0, 8);
                        for(int pi = 0; pi < P; pi++)
                        {
                            if(BrowseID.PngName == BrowseID.AssetName)
                            {
                                BrowseID.RES = 200;
                                break;
                            }
                            if (BrowseID.PngName != BrowseID.AssetName)
                            {
                                BrowseID.RES = 404;
                            }
                        }
                    }
                    //判断同一名下.png资源是否齐全
                    if (BrowseID.RES == 404)
                    {
                        eorrInfo.Add(BrowseID.PngName + ".png资源缺失");
                        Debug.Log("对" + BrowseID.PngName + ".png资源检查到异常,已打印日志");
                    }

                    if(BrowseID.RES == 200)
                    {
                        logInfo.Add(BrowseID.PngName + ".Png资源齐全");
                        Debug.Log("对" + BrowseID.PngName + ".Png资源检查完毕");
                    }
                }
            }
            
            //输出检查,警告错误日志
            for(int v =0; v < logInfo.Count; v++)
            {
               
                log = logFile.AppendText();
                log.WriteLine(logInfo[v]);
                log.Close();
            }
            for (int c = 0; c < eorrInfo.Count; c++)
            {
                Eorr = EorrFile.AppendText();
                Eorr.WriteLine(eorrInfo[c]);
                Eorr.Close();
            }

        }
        else
        {
            Debug.LogWarning("没有找到指定路径!!" + BrowseResourcePath.ArtResource);
        }
        
    }

}


	--------------------------------------------------------------------------------------------------------------------------------------------------------------------		  
	--------------------------------------------------------------------------------------------------------------------------------------------------------------------		  

你可能感兴趣的:(Unity3D)