之所以写这个插件呢,就是为了方便整理项目中的资源文件,我记得之前好像也用了这么一个插件,但是也没去找,还是自己动手写一个吧,需要什么功能就看自己的需求。

在项目的过程中呢,已经写了一个插件来管理材质,但是跟随模型导入的图片却越来越多,也是自己跟美术沟通不到位,导致根本没办法保证图片的命名规则或者是否有重复的图片,再加上不断的删除或者更新模型,项目中一些无用的图片也堆积了不少。我尝试了自己手动整理,但是没有命名规则的图片和一些靠缩略图甚至无法分辨是不是一样的图片,这样的工作,就相当无力了。

于是呢,就完成了这么一个插件:

1.点击Organize Resources/Editor Window打开插件,点击未使用资源按钮,这里就会罗列出Assets文件夹里所有未被引用的资源,当然当前未被引用肯定不代表他完全没用,还是得靠自己确认然后手动删除

2.点击全部资源,他就会输出所有的文件,并可以通过按钮输出他的GUID、应用和被引用的其他Assets路径,这里主要理清一些资源的关联关系

3.点击重复资源按钮,就可以分类显示当前重复有哪些文件,这里的文件重复判断后面有具体介绍,点击合并按钮,就可以清除掉多余的资源,如果其他本地资源引用了这个文件,合并的文件也会自动替换上去,不用担心其他文件引用会丢失

这里New Material材质引用了fish 2图片,然后我在合并界面随便点一个fish后面的合并按钮

然后,多余的图片已经被清除了,而本来引用fish 2的材质New Material,也变成了引用fish图片,这里就是我当前需要的主要功能

上面的呢,是大概介绍了一些插件的功能,接下来就展示一下主要的功能代码:

1.获取当前Object引用了其他哪些Object,这里在unity是有接口的,返回的就是引用了其他的Object的路径:

string[] _OtherPaths = AssetDatabase.GetDependencies(_PathValue);

2.获取当前Object被其他那些Object引用了,说着感觉有点绕,不过功能也就是根据上面的反正写一个查找功能,获取其他Obejc的引用路径,再与当前的的Object匹配,这里的主要判断依据靠的是Object的GUID

#region 获取其他引用Assets的路径string[] GetUseAssetPaths(string _AssetPath){List<string> _AssetPaths = new List<string>();//使用GUID作为判断标准string _AssetGUID = AssetDatabase.AssetPathToGUID(_AssetPath);//遍历所有Assetsfor (int i = 0; i < _AllAssetsPaths.Count; i++){if (_AllAssetsPaths[i] == _AssetPath)continue;string[] _OtherPaths = AssetDatabase.GetDependencies(_AllAssetsPaths[i]);if (_OtherPaths.Length > 1){for (int j = 0; j < _OtherPaths.Length; j++){string _OtherGUID = AssetDatabase.AssetPathToGUID(_OtherPaths[j]);if (_AssetGUID == _OtherGUID){_AssetPaths.Add(_AllAssetsPaths[i]);}}}}return _AssetPaths.ToArray();}#endregion

3.获取相同的文件,开始使用正常的文件MD5值的验证,发现了一个问题,就是对于外部资源(从外面导入的资源,比如Texture、fbx)的验证是正常的,但是对于unity内部资源(在unity内部创建的文件,比如prefab、material)就不对了,后来读取内部资源的Text发现,他在内部有Object的名称,而Unity里的文件又不能重名,于是文件就不一样了,后来我就直接将他有名称的那行数据先删掉再来获取MD5值,才成功判断相同文件

获取相同文件

string[] GetSameFilePaths(string _PathValue){List<string> _AssetPaths = new List<string>();string _AssetMD5 = GetFileMD5(_PathValue);//遍历所有Assetsfor (int i = 0; i < _AllAssetsPaths.Count; i++){if (_AllAssetsPaths[i] == _PathValue)continue;if (_AssetMD5 == GetFileMD5(_AllAssetsPaths[i]))_AssetPaths.Add(_AllAssetsPaths[i]);}return _AssetPaths.ToArray();}

获取文件的MD5值

#region 获取文件的MD5值string GetFileMD5(string _PathValue){//判断是否为本地资源   因为本地文件里有文件名称 但是在资源名称又不能重复  于是需要去掉名称 来检测md5值Object _ObejctValue = AssetDatabase.LoadAssetAtPath<Object>(_PathValue);bool _isNative =AssetDatabase.IsNativeAsset(_ObejctValue);string _FileMD5 = "";string _TemPath = Application.dataPath.Replace("Assets", "");if (_isNative){string _TempFileText = File.ReadAllText(_TemPath + _PathValue).Replace("m_Name: " + _ObejctValue.name,"");System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();//将字符串转换为字节数组  byte[] fromData = System.Text.Encoding.Unicode.GetBytes(_TempFileText);//计算字节数组的哈希值  byte[] toData = md5.ComputeHash(fromData);_FileMD5 = "";for (int i = 0; i < toData.Length; i++){_FileMD5 += toData[i].ToString("x2");}}else{try{FileStream fs = new FileStream(_TemPath + _PathValue, FileMode.Open);System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();byte[] retVal = md5.ComputeHash(fs);fs.Close();_FileMD5 = "";for (int i = 0; i < retVal.Length; i++){_FileMD5 += retVal[i].ToString("x2");}}catch (System.Exception ex){Debug.Log(ex);}}return _FileMD5;}#endregion

4.合并时,当前文件替换掉其他被清除的文件,这里也是比较简单的,其他Object也是通过文件的GUID来引用文件,这里主要将他的GUID替换掉就可以

 #region 合并void OnRepeatMerge(string _PathValue,List<string> _ListValue){string _FixedGUID= AssetDatabase.AssetPathToGUID(_PathValue);string _AssetsPath = Application.dataPath.Replace("Assets", "");for (int i = 0; i < _ListValue.Count; i++){if (_PathValue == _ListValue[i])continue;string[] _OtherPaths = GetUseAssetPaths(_ListValue[i]);bool _isOtherNative = true;string _OldGUI = AssetDatabase.AssetPathToGUID(_ListValue[i]);for (int j = 0; j < _OtherPaths.Length; j++){Object _OtherUseAsset = AssetDatabase.LoadAssetAtPath<Object>(_OtherPaths[j]);if (AssetDatabase.IsNativeAsset(_OtherUseAsset)){string _RealAllText = File.ReadAllText(_AssetsPath+ _OtherPaths[j]).Replace(_OldGUI,_FixedGUID);File.WriteAllText(_AssetsPath + _OtherPaths[j], _RealAllText);}else_isOtherNative = false;}//如果没有外部资源引用他 就删除if (_isOtherNative){AssetDatabase.DeleteAsset(_ListValue[i]);_ListValue.RemoveAt(i);i--;}}AssetDatabase.Refresh();OnRepeatClick();}#endregion

5.最后总结,在相对较大的项目中,因为会遍历所有的文件,插件的反应速度就不那么尽如人意,想想也不会时时来整理资源,所以也暂时忽略掉了,然后,插件的功能也会在后面慢慢完善

工程链接:https://github.com/coding2233/OrganizeResources

Unity 资源管理插件相关推荐

  1. Unity资源管理(四)-AssetBundle使用模式

    Unity资源管理(四)-AssetBundle使用模式 英文原文:https://unity3d.com/cn/learn/tutorials/topics/best-practices/asset ...

  2. MMD的unity导入插件

    2019独角兽企业重金招聘Python工程师标准>>> 存在一个mmd模型的unity导入插件: 导入了mmd的物理,将模型每个部位通过 custom的joint进行连接,设定物理属 ...

  3. Unity资源管理--AssetBundle学习

    Unity资源目录 当用Unity创建一个工程的时候,目录如下: Assets:存放Unity工程实际的资源目录. Library:存放Unity处理完毕的资源,由unity自动转化生成. Log:存 ...

  4. 使用加密锁加密Unity工程插件源码

    使用加密锁加密Unity工程插件源码 最近在unity3D中开发了一款插件,需要卖给客户,但是公司需要隐藏插件的源码,而且保证客户只有指定的电脑才能使用该插件开发!针对这个问题,分为两个步骤:1.隐藏 ...

  5. Unity网页插件Embedded Browser(ZFBrowser)打包文件无法加载本地网页或网站网址解决方法

    Unity网页插件Embedded Browser(ZFBrowser)打包文件无法加载本地网页或网站网址解决方法 问题:最近使用ZFBrowser开发VR嵌入网页发现出现一个问题,在编辑器模式下场景 ...

  6. Unity常见插件汇总

    Unity常见插件汇总 介绍 收集了相关的Unity插件,供大家学习使用,如果用于商业活动,请购买相关版权 插件列表 1. A* Pathfinding Project 一个功能强大并且易于使用的 U ...

  7. Unity 常用插件

    Unity 常用插件 1.NGUI,算是最常用的UI插件了,下载地址:https://download.csdn.net/download/xiaoyaoACi/21028754 2.FingerGe ...

  8. Unity Spine插件使用

    Unity Spine插件使用 Spine是针对游戏开发的2D骨骼动画.Unity本身并不支持播放spine文件需要安装 Unity Spine插件才能支持. Spine插件下载安装 Spine插件可 ...

  9. Unity 编辑器插件-快速删除组件

    尊重原著:(1条消息) Unity 编辑器插件-快速删除组件_unity 删除组件_菜菜ANY的博客-CSDN博客 实现删除所选物体及子物体中指定组件.自动apply 同时考虑一个物体上挂在多个相同组 ...

  10. 雕刻笔应用开发,3D Systems Openhaptics Unity Plugin插件使用心得

    雕刻笔应用开发,3D Systems Openhaptics Unity Plugin插件使用心得 驱动安装: 1.根据设备型号下载对应驱动. https://3dssupport.microsoft ...

最新文章

  1. 文巾解题 342. 4的幂
  2. DP:Sumsets(POJ 2229)
  3. 编码方式 / Base 64
  4. Java线程的优先级
  5. 使用php吧excel数据存到数据库,php如何存excel数据到数据库
  6. Maven实战. 1.3Maven与极限编程
  7. 封网后聊天就用“飞秋”
  8. cf550D. Regular Bridge(构造)
  9. vb6.0 定义一个公共类_纠正网上的错误:能不能自定义一个类叫java.lang.System/String?...
  10. hibernate----继承
  11. xcode 4.0 以上版本安装新浪微博SDK
  12. 关于egret引擎游戏开发的笔记-1
  13. 【操作系统】进程间通信 — 消息队列
  14. vtk 的vtkimagereslice实现三视图的显示
  15. Netty 中的粘包和拆包详解
  16. 剑指offer之简单题(三)
  17. Vin码查询车辆详细信息
  18. UUI Make StartUp Disk
  19. 高德地图使用(一)---添加自定义标注和标注事件
  20. ffmpeg截取一段视频

热门文章

  1. flask_web 蓝本基模板继承问题
  2. mount: 文件系统类型错误、选项错误、192.168.137.101:/data/wwwroot/pc 上有坏超级块
  3. C语言图片变黑白,用c语言把bmp格式的彩色图片转换成黑白的
  4. TODA项目Part1—后端项目设置与连接数据库
  5. Trading on Sentiment
  6. 02. Compose 可组合组件之 属性 modifier
  7. flask 数据库迁移migration
  8. 苹果即将迎来新应用,一个新行业正在崛起
  9. 深度学习论文阅读图像分类篇(六):SENet《Squeeze-and-Excitation Networks》
  10. 数据科学家:人工智能领域的知识图谱理论总结