Unity中检查重复的资源
目的:
检查Unity中资源是否重复,例如有两张贴图,明明是一张,却被复制为两份放在工程中,名字或者所在目录位置不同,这对于资源管理来说是很浪费的。因此需要写一个检查工具来检查项目中是否存在重复的资源。
思路:
Unity引擎内部对资源的管理是否有一个唯一标识,通过这个唯一标识来检查是否有多个资源的此标识相同。
相关知识:
1.Guid:
Unity会为每一个加入到Assets文件夹中的文件,创建一个同级同名的.meta文件,虽然文件类型的不同会影响这个.meta的具体内容,但它们都包含一个用来标记文件身份的File GUID。
文件GUID提供了文件存储位置的抽象,这样一个文件GUID就对应一个具体的文件,因此我们才能随意移动这个文件而不破坏所有相关Object对这个文件的引用,而如果这个meta文件和物体不对应(比如我们SVN提交的时候没有提交修改的Meta文件),那么这个文件的引用就会丢失,造成不可预知的错误。
总结:存储了此文件和其他文件之间的引用关系
2.Localid:
标识了文件内部各个文件之间的引用关系,比如一个Prefab内部的各个gameObject之间的引用关系
3.InstanceId:
Guid和Localid更像是为了文件系统的管理而设计的,那么我们在unity中实际编写代码或者引擎对object进行管理的时候每次去获取这两个大字符串显然是效率很低的,因此Unity在对象层面又通过这两个Id设计了InstanceId。简单来说,我们在工程中可以通过InstanceId来获取任何一个Object的实例。这个Id通过GetInstanceID获得,返回物体的实例ID,即使是同一个Prefab,实例化出的不同GameObject的InstanceId也是不一样的
4.MD5
unity内部通过一种算法来计算资源文件的MD5码(一个字符串),这种方法类似于哈希,将不同文件计算出不同的MD5码,但不同于哈希值的计算,我们希望MD5最好永远不要重复(哈希值计算会出现重复冲突的情况),MD5一般被认为是Unity中区分不同文件的唯一标识,那么有人肯定会疑问,万一这个值真的重复了呢。不错,确实有比较厉害的黑客可以破解Unity所使用的的计算算法,使得不同的资源文件产生相同的MD5码,不过这是非常极端的情况。我们知道热更新的时候也会用到MD5码,来标识我们需要更新哪个文件,那么在这个过程我们最好是对MD5码进行加密的,以防有恶意软件攻击我们热更新的文件。
总结:资源文件的唯一标识,即使是同一个文件(不同名字,目录)这个值也是相同的,因此可以作为我们检查资源是否重复的比较标识
检查工具
思路:计算特定目录下文件的MD5码,将其存入字典中,如果字典中已经存在此key值,说明资源重复
关键:getTextureByte(),根据路径资源文件计算MD5码
using UnityEngine;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using System.Security.Cryptography;
public class ResCheckTool
{
// md5和guidId不相同
[MenuItem("Tools/Find Repeat", false, 10)]
static private void Check()
{
// 定义查找路径
string[] guids = Directory.GetFiles("Assets/Resources/", "*.*", SearchOption.AllDirectories);
// 以MD5值为key的字典
Dictionary<string, string> checkDic = new Dictionary<string, string>();
string fileMd5 = string.Empty;
for (int i = 0, count = guids.Length; i < count; i++)
{
// 过滤meta文件
if (!guids[i].EndsWith(".meta"))
{
MD5 md5 = MD5.Create();
byte[] md5bytes = md5.ComputeHash(getTextureByte(guids[i]));
fileMd5 = System.BitConverter.ToString(md5bytes).Replace("-", "").ToLower();
if (!checkDic.ContainsKey(fileMd5))
{
checkDic.Add(fileMd5, guids[i]);
}
else
{
Debug.Log("重复资源路径:" + guids[i] + "重复资源md5:" + fileMd5);
}
}
}
}
/// <summary>
/// 根据图片路径返回字节流,基本不会重复
/// </summary>
/// <param name="texturePath"></param>
/// <returns></returns>
static private byte[] getTextureByte(string assetsPath)
{
FileStream file = new FileStream(assetsPath, FileMode.Open);
byte[] txByte = new byte[file.Length];
file.Read(txByte, 0, txByte.Length);
file.Close();
return txByte;
}
}
https://www.jianshu.com/p/01a41a095a5c
Unity中检查重复的资源的更多相关文章
- Unity中资源打包成Assetsbundle的资料整理
最近在研究Unity中关于资源打包的东西,网上看了一堆资料,这里做个整合,说整合,其实也就是Ctrl-C + Ctrl-V,不是原创 首先为了尊重原创,先贴出原创者的文章地址: http://blog ...
- 【Unity】Unity中资源动态载入的两种方式之AssetsBundle
首先要说的是,我们的project中有2个脚本.各自是: Build(编辑器类脚本.无需挂载到不论什么物体).可是必需要把Build脚本放到Editor目录中 Load脚本,挂载到摄像机上<pr ...
- Unity中资源动态加载的几种方式比较
http://blog.csdn.net/leonwei/article/details/18406103 初学Unity的过程中,会发现打包发布程序后,unity会自动将场景需要引用到的资源打包到安 ...
- 关于Unity中资源打包
资源包详细说明 Unity很智能只会打包用到的资源,比如sharedassets0.assets中的shader资源,如果场景中有OBJ用到了shader那么就会有shader打进这个包,如果没有就不 ...
- unity中加载场景不销毁以及切换场景重复实例化
问题描述 游戏开发中会有多个场景,有时会有这样的需求,我们需要保证场景跳转但是需要保持某个游戏对象不被销毁,比如:音乐 实现思路 unity中提供了DontDestroyOnLoad(),这个API ...
- 关于Unity中的UGUI优化,你可能遇到这些问题
https://blog.uwa4d.com/archives/QA_UGUI-1.html 关于Unity中的UGUI优化,你可能遇到这些问题 作者:admin / 时间:2016年11月08日 / ...
- 「翻译」Unity中的AssetBundle详解(一)
AssetBundles AssetBundle是一个存档文件,其中包含平台在运行时加载的特定资产(模型,纹理,预制,音频剪辑,甚至整个场景).AssetBundles可以表示彼此之间的依赖关系;例如 ...
- Unity中的资源管理
一.AssetBundle 相关 Q1:Unity中的SerializedFile是怎么产生的?请问用Unload(false)可以清除吗?因为读取了Bundle里面的内容后已经赋值给其他物体了.而且 ...
- 单元测试在Unity中的应用
项目描述:简单演示单元测试在Unity中的应用 项目地址:UnityTestRunner_Tutorial - SouthBegonia 项目版本:2020.3.20f1 项目用法:打开就用,代码都放 ...
- Unity中Mesh分解与边缘高亮加上深度检测
一个比较简单的需求,不过遇到些坑,记录下. 房间有多个模型,每个模型可能多个SubMesh,点击后,需要能具体到是那个SubMesh,并且在这个SubMesh上显示边缘高光,以及能个性这单个SubMe ...
随机推荐
- w3cschool-Python3 高级教程
https://www.w3cschool.cn/python3/python3-reg-expressions.html Python3 正则表达式 re.match 函数 re.match 尝试从 ...
- Codeforces Round 958 (Div. 2)
题目链接:Codeforces Round 958 (Div. 2) 总结:C因为常数没转\(long long\) \(wa\)两发,难绷. A. Split the Multiset fag:模拟 ...
- GD32F103C8T6看门狗
GD32F10x看门狗 两个看门狗设备(独立看门狗IWDG和窗口看门狗WWDG)可用来检测和解决由软件错误引起的故障: 当计数器达到给定的超时值时,触发一个中断(仅适用于窗口型看门狗)或产生系统复位. ...
- java中的文件流File
数据 + 流(转)操作 IO I表示的是:输入Input O表示的是:Output Stream表示流转 java中的管道不止一个.并且管道有可能不是一样的. 有的管道粗有的管道细 File的常用方法 ...
- VScode导入Vue项目
VScode导入Vue项目 1.使用VScode打开文件夹 2.找到运行按钮 3.判断有没有默认的配置文件存在 4.若文件夹存在就检查配置文件是否存在 (1)打开launch.json,把如下代码粘贴 ...
- Kali Linux 安装教程
Kali Linux 安装教程 下载镜像文件 Kali官网下载 访问Kali官网(https://www.kali.org/ ),根据下图所示进行下载 清华大学开源软件镜像站下载 访问清华大学开源软件 ...
- go测试跨包代码覆盖率
Golang虽然只是一门编程语言,但也为我们提供了不少工具,其中测试工具是最常用的,大概 前提概要 以前看书,只说了用什么工具去做覆盖率,和基本的使用,当时看了也没想太多.后面真正做项目了,老大要求比 ...
- VMware与宿主机文件夹共享的方法
首先,在打开的虚拟机的主界面中点选我的电脑上的虚拟机系统,再点击右侧的编辑虚拟机设置. 然后,在弹出的虚拟机设置中点击"选项"标签栏目 点选在"选项"标签栏目中 ...
- 【软件开发】Glob通配符
[软件开发]Glob 通配符 *:匹配除"/"以外的字符. **:匹配所有字符. ?:匹配一个字符. [...]:匹配指定字符,如[ABC]就匹配 ABC 三个字母,添加!还可以反 ...
- Typecho的Joe主题开启文章导航目录树
引言 发现从typora复制过来的markdown代码中的目录导航[toc]语句没生效, 没有像typora或其他markdown编辑器生成导航目录树, 网上搜了下, 发现个解决方法, 在主题设置里插 ...