这个版本比较通用,部分扩展功能还没有来得级实现,如有特殊要求,还望自行修改。
话不多少说,代码一般,还望见谅。
美术资源匹配工具
--- 功能需求
--- 基本功能
--- 根据文件名自动绑定对应名称的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);
}
}
}
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------