首页 > 其他分享 >Unity 资源管理插件

Unity 资源管理插件

时间:2022-12-13 14:32:34浏览次数:88  
标签:文件 插件 string OtherPaths Object Unity PathValue AssetDatabase 资源管理


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

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


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

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

Unity 资源管理插件_资源管理

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

Unity 资源管理插件_资源管理_02

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

Unity 资源管理插件_资源管理_03

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

Unity 资源管理插件_资源引用_04

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

Unity 资源管理插件_System_05


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

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);
//遍历所有Assets
for (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);
//遍历所有Assets
for (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



标签:文件,插件,string,OtherPaths,Object,Unity,PathValue,AssetDatabase,资源管理
From: https://blog.51cto.com/u_15911199/5934057

相关文章

  • 【Unity】 HTFramework框架(三十三)XLua热更新
    更新日期:2020年3月20日。Github源码:​​​[点我获取源码]​​​Gitee源码:​​[点我获取源码]​​索引​​XLua热更新简介​​​​使用XLua热更新​​​​创建XLua开发环境......
  • 【Unity】 HTFramework框架(三十二)授权验证
    更新日期:2020年3月2日。Github源码:​​​[点我获取源码]​​​Gitee源码:​​[点我获取源码]​​索引​​授权验证简介​​​​使用授权验证​​​​取消永久授权​​​​......
  • Unity插件 - MeshEditor(八)模型镜像特效
    将静态模型(带MeshFilter)按指定轴向、指定距离克隆一个镜像物体出来,思路很简单,将模型的顶点坐标按指定轴取反,并累加上设定的距离值,然后就完毕了!不过,因为镜像体的顶点镜像于之......
  • 【Unity】 HTFramework框架(三十一)全局设置
    更新日期:2020年3月2日。Github源码:​​​[点我获取源码]​​​Gitee源码:​​[点我获取源码]​​索引​​全局设置简介​​​​使用全局设置​​​​打开全局设置面板​​......
  • unity使用ugui自制调色面板
    突然想实现一个调色面板,然后开工...首先找找有没有什么接口可调,木有找到,找到一些调用win32实现的本地颜色面板的调用,感觉不科学,反正多平台肯定是搞不定的。既然没找到,还是老......
  • MBR60200PT-ASEMI大电流、低耐压插件肖特基二极管
    编辑:llMBR60200PT-ASEMI大电流、低耐压插件肖特基二极管型号:MBR60200PT品牌:ASEMI封装:TO-247正向电流:60A反向电压:200V引线数量:3芯片个数:2芯片尺寸:150MIL漏电流:10ua恢复时间:5n......
  • MBR60200PT-ASEMI大电流、低耐压插件肖特基二极管
    编辑:llMBR60200PT-ASEMI大电流、低耐压插件肖特基二极管型号:MBR60200PT品牌:ASEMI封装:TO-247正向电流:60A反向电压:200V引线数量:3芯片个数:2芯片尺寸:150MIL漏电流:10u......
  • 谷歌浏览器安装elasticsearch-head插件
    之前在使用es的时候有插入索引和数据的需求但是对于es操作不适太熟悉,然后就用docker安装了一个es-head进行操作,但是用docker安装的es-head有时候不是太好用(问题后续标注)。......
  • PHP开发中提供效率的VSCode插件推荐(值得收藏)
    本篇文章给大家推荐一些VSCode+PHP开发中实用的插件。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。VSCode官网下载地址:https://code.visualstudio.com......
  • 需要改动node_modules,并且别人也可以同步,插件 patch-package
    patch-package转自:https://www.cnblogs.com/lovewhatIlove/p/15724812.html1、简介:有个功能需要修改node_modules里面的代码,就发现patch-package可以立即修改并保留对np......