首页 > 其他分享 >Unity中检查重复的资源

Unity中检查重复的资源

时间:2024-12-21 17:42:53浏览次数:10  
标签:文件 检查 重复 guids 标识 Unity MD5

目的:
检查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

标签:文件,检查,重复,guids,标识,Unity,MD5
From: https://www.cnblogs.com/gangtie/p/18620991

相关文章

  • Unity 学习记录
    大二做游戏的学习记录2D地图制作Tilemap是用来创建2d游戏地图的工具,允许使用Tile(瓦片)来拼接和绘制出一个大型的2D游戏场景只适用于显示地图,不直接进行物理交互如何使用Tilemap制作地图?步骤1:创建Tilemap游戏对象创建一个2D项目(如果你还没有创建的话)。在Hierarchy......
  • Unity中实现通过控制Scroll View内物体顺序来做排序
    Unity中实现通过控制ScrollView内物体顺序来做在Unity开发中,ScrollView是一个非常常用的UI组件,用于展示一系列可以滚动查看的内容。有时候,我们可能需要允许玩家或用户通过按键来控制这些内容的顺序,比如在一个游戏的选择界面或菜单中。本文将介绍如何实现这一功能。一、......
  • Unity复刻胡闹厨房复盘 模块一 新输入系统订阅链与重绑定
            本文仅作学习交流,不做任何商业用途        郑重感谢siki老师的汉化教程与代码猴的免费教程以及搬运烤肉的小伙伴                                                         版本:Unity6......
  • 【Unity实用技巧】Transform组件位置快速对齐(编辑器扩展)
    前言在Unity项目开发中,经常需要调整物体的位置。特别是在处理3D模型时,我们可能需要将一个父物体移动到其所有子物体的中心位置或底部中心位置。本文将介绍如何通过Unity编辑器扩展来实现这个功能,让美术同学在摆放模型时更加方便。一、效果演示二、完整代码这里直接上......
  • 【Unity基础】Unity中拖拽3D物体的过程分析和实现方法
    我们先来分析一下Unity中拖拽物体的过程:第一步:先检测拖拽的输入方式,可以鼠标,触摸,可以用InputManager输入,也可以使用InputSystem输入第二步:获取触碰点的位置,并计算offset。第三步:在每一帧里改变物体的位置。其实3D物体拖拽的过程可以分为上面几个清晰的步骤,而每一步都有......
  • 【实用技巧】MD5 的重复请求应用以及性能测试
    1 前言大家可能都遇到幂等或者娇艳重复提交的问题,比如重复的JSON请求、文件上传相同的文件重复上传了两次等,当然了确实存在某种情况比如人家用户一会上传了一个文件隔了一会儿又上传一个同样的文件是合理的,我们要做的就是短时间内的重复提交。这个时候我们可以通过计算请求......
  • 【Unity 低多边形3D 资源包】POLYGON Prototype - Low Poly 3D Art by Synty 专为游戏
    POLYGONPrototype-LowPoly3DArtbySynty是一款由知名工作室SyntyStudios提供的高质量低多边形(LowPoly)3D资源包,专为游戏开发者打造,适用于快速创建原型、概念演示和低多边形风格的游戏项目。它提供了一个全面的低模资产集合,既能满足开发需求,又具有出色的美术表现力......
  • 【Unity 军事基地和战争环境插件】Military Base Megapack 高质量的军事基地场景、建
    MilitaryBaseMegapack是一款为Unity开发者设计的插件,提供了一系列高质量的军事基地场景、建筑物、车辆、道具和其他环境资源,专门用于构建军事主题的游戏或应用。该插件以细致的3D建模和高效的资源管理为特色,适用于需要丰富战场、军事设施和战斗环境的项目。无论是战术类、......
  • 【Unity 计算机视觉插件】OpenCV for Unity 轻松实现图像处理、目标检测、物体识别、A
    OpenCVforUnity是一款功能强大的Unity插件,将著名的计算机视觉库OpenCV无缝集成到Unity中,为开发者提供丰富的计算机视觉功能支持。通过该插件,开发者可以轻松实现图像处理、目标检测、物体识别、AR增强现实等复杂功能,适用于多种平台,包括Windows、macOS、Android、iOS等。功......
  • 459_重复的子字符串
    Leetcode459重复的子字符串问题描述给定一个非空的字符串s,检查是否可以通过由它的一个子串重复多次构成。1.示例1:-输入:s="abab"-输出:true-解释:可由子串"ab"重复两次构成。2.示例2:-输入:s="aba"-输出:false3.示例3:-输入:......