获得unity 资源中的MD5值,为资源更新配置文件做准备

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了获得unity 资源中的MD5值,为资源更新配置文件做准备相关的知识,希望对你有一定的参考价值。

 在前面我们说过,如何通过代码设置需要打包的资源的 AssetBundle 的 importer属性,以及简单的一键打包,那么如果资源有了更新,我们怎么得到呢?

在unity 中,编辑器会为我们每个资源都分配一个md5值,这是唯一的,如果我们资源有了变化,那么这个md5值也会有便会,这是毋庸置疑的;

这样,我们就可以得到资源的md5值,从而比对本地资源的md5值以及最新的md5值,从而知道是不是要更新资源

在unityeditor命名空间下,有这样的方法得到这个唯一值   AssetDatabase.AssetPathToGUID(path);

那么我们做个实验。我们选中一个物体,然后得到他的路径,更具路径得到MD5值

[MenuItem("Tools/获得GUID")]
    public static void GetAssetsGuid()
    {
        Object obj = Selection.activeObject;
        string path = AssetDatabase.GetAssetPath(obj);
        Debug.Log(path);
        string str=  AssetDatabase.AssetPathToGUID(path);
        Debug.Log(str);
    }

技术分享

 

从输出可以看到,我已经得到了所需要的MD5值

但是这样太麻烦了,需要一个个去手动设置,真的是哔了狗的心情都有了,我们还是和前面说道的设置importer 一样,通过IO操作,去查找,并获得

   [MenuItem("Tools/设置GUID")]
    public static void SetAssetGUID()
    {
        CheckAssetBundleDir(GetAssetBundleStringPath());
    }

    public static string GetAssetBundleStringPath()  //得到存放打包资源的文件路径
    {
        string path = Application.streamingAssetsPath;
        //Debug.Log(path);
        string[] strs = path.Split(/);
        int idx = 0;
        for (int i = 0; i < strs.Length; i++)
        {
            if (strs[i] == "Assets")
                idx = i;
        }
        // Debug.Log(idx);
        //path = strs[strs.Length - 2] + "/" + strs[strs.Length - 1];
        string str = "";
        for (int i = idx; i < strs.Length; i++)
        {
            if (i != strs.Length - 1)
                str += strs[i] + "/";
            else if (i == strs.Length - 1)
                str += strs[i];
            //Debug.Log(i);
        }
        path = str;
        return path;
        //Debug.Log(path);
    }

    public static void CheckAssetBundleDir(string path)   //是文件,继续向下
    {
        DirectoryInfo directory = new DirectoryInfo(@path);
        FileSystemInfo[] fileSystemInfos = directory.GetFileSystemInfos();

        foreach (var item in fileSystemInfos)
        {
            // Debug.Log(item);
            int idx = item.ToString().LastIndexOf(@"\\");
            string name = item.ToString().Substring(idx + 1);

            if (!name.Contains(".meta"))
            {
                CheckAssetBundleFileOrDirectory(item, path + "/" + name);  //item  文件系统,加相对路径
            }
        }
    }

    public static void CheckAssetBundleFileOrDirectory(FileSystemInfo fileSystemInfo, string path) //判断是文件还是文件夹
    {
        FileInfo fileInfo = fileSystemInfo as FileInfo;
        if (fileInfo != null)
        {
            //Debug.Log(path);
            Debug.Log("不为空==>>"+ GetGUID(path));
        }
        else
        {
            //Debug.Log("为空");
        }
    }

    public static string GetGUID(string path)
    {
        return AssetDatabase.AssetPathToGUID(path);
    }

这里我们同过打印,已经可以得到 父目录下的打包好的资源的 md5值了,下一步我们准备通过一层层查找,得到全部的,下 期再会

以上是关于获得unity 资源中的MD5值,为资源更新配置文件做准备的主要内容,如果未能解决你的问题,请参考以下文章

一个Unity的WebGL的资源更新逻辑

最新完整热更新实战案例学习,包括资源热更新及代码热更新文末送书

Unity3d StreamingAssets资源复制到沙盒

Unity5 如何做资源管理和增量更新

Unity5 怎样做资源管理和增量更新

Unity5 如何做资源管理和增量更新