Unity 进阶 之 资源文件夹下资源名的重名检查,并简单生产资源表的方法整理

Unity  进阶 之 资源文件夹下资源名的重名检查,并简单生产资源表的方法整理

目录

Unity  进阶 之 资源文件夹下资源名的重名检查,并简单生产资源表的方法整理

一、简单介绍

二、简单实现过程

 三、关键代码


一、简单介绍

Unity中的一些知识点整理。

本节简单介绍在Unity开发中的,在资源管理的时候,为了更好的管理资源,在大的资源文件夹下,可能并不希望不同文件夹下有重名的资源名,这里代码自动检查,并且给出重名提示,最后生成一个资源表,如果你有新的方式也可以留言,多谢。

二、简单实现过程

1、新建一个Unity工程,创建资源文件夹Res 并把相关资源添加到Res 文件夹下

2、在 Editor 文件夹下编写资源检查脚本

3、菜单栏出现资源检查的工具菜单

 4、点击执行 Check Res And Generate MapFile,控制台给出重名提示,并且生成一个简单资源表

 

5、为了避免忘记做资源检查和表生成,每次在Build 的时候,自动做一次资源检查和生成工作,代码如下

6、每次Build的时候就会自动做一次资源检查和生成工作

 三、关键代码

1、CheckResAndGenertateResConfig

using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;
/// <summary>
/// 将Res文件夹中所有的资源 以 名称(如img 无扩展)=路径(Res中的路径如:a/img 无扩展名)的实行导出txt
/// 如果名称重复,则爆出出重复路径, 重复的名称以路径代替,则无法使用名称来映射路径(建议不要使用相同的名称命名资源)
/// </summary>
public class CheckResAndGenertateResConfig : Editor
{
    [MenuItem("Tools/Res/ Check Res And Generate MapFile")]
    public static void Generate()
    {
        string targetDir = "Assets/StreamingAssets";
        string targetFile = targetDir+ "/ResMap.txt";
        if (!Directory.Exists(targetDir))
        {
            Directory.CreateDirectory(targetDir);
        }
        string resourcesPath = Application.dataPath + "/Res";//resources文件文件的路径
        if (!Directory.Exists(resourcesPath))
        {
            Debug.Log($"不存在路径{resourcesPath}");
            if (File.Exists(targetFile))
            {
                File.Delete(targetFile);
            }
            return;
        }
        Dictionary<string, List<string>> dic = new Dictionary<string, List<string>>();
        DirectoryList(resourcesPath, dic);
        //已经获得了Resources文件夹中所有的资源,开始操作
        if (dic.Count == 0)
        {
            if (File.Exists(targetFile))
            {
                File.Delete(targetFile);
            }
        }
        else
        {
            //更新之前的表
            List<string> info = new List<string>();
            List<string> result;
            string warn = "";
            foreach (string key in new List<string>(dic.Keys))
            {
                result = dic[key];
                if (result.Count == 1)
                {
                    info.Add($"{key}={result[0]}");
                    continue;
                }
                foreach (string value in result)//如果存在相同的文件名称在不同的路径当中
                {
                    info.Add($"{value}={value}");
                    if (warn == string.Empty)
                    {
                        warn += value;
                    }
                    else
                    {
                        warn += "   ----   " + value;
                    }
                }
            }
            if (warn != string.Empty)
            {
                warn = "Assets/Res中存在相同名称的资源,这些资源将可能使用路径来获取 : \n" + warn;
                Debug.LogWarning(warn);
            }

            File.WriteAllLines(targetFile, info.ToArray());
        }
        AssetDatabase.Refresh();//刷新
    }

    private static void GetFiles(string path, Dictionary<string, List<string>> dic)
    {
        DirectoryInfo theFolder = new DirectoryInfo(path);
        string name;
        string filePath;
        string suffix;
        foreach (FileInfo file in theFolder.GetFiles())
        {
            name = file.Name;
            suffix = name.Substring(name.LastIndexOf("."));
            if (name.Length > 5 && name.Substring(name.Length - 5) == ".meta") continue;//过滤掉Unity的.meta配置文件
            filePath = file.FullName;
            name = Path.GetFileNameWithoutExtension(filePath);
            filePath = filePath.Substring(filePath.IndexOf(@"Assets\Res\") + @"Assets\Res\".Length);
            filePath = filePath.Replace(@"\", @"/").Replace(suffix, string.Empty);
            if (dic.ContainsKey(name))
            {
                dic[name].Add(filePath);
            }
            else
            {
                dic.Add(name, new List<string>() { filePath });
            }
        }
    }

    private static void DirectoryList(string path, Dictionary<string, List<string>> dic)
    {
        DirectoryInfo theFolder = new DirectoryInfo(path);
        //遍历文件
        GetFiles(path, dic);
        foreach (DirectoryInfo directory in theFolder.GetDirectories())
        {
            DirectoryList(directory.FullName, dic);
        }
    }
}

2、CheckResPreBuildHandler

using UnityEditor.Build;
#if UNITY_EDITOR

public class CheckResPreBuildHandler : IPreprocessBuildWithReport
{
    public int callbackOrder => 0;//回调顺序

    public void OnPreprocessBuild(UnityEditor.Build.Reporting.BuildReport report)
    {
        CheckResAndGenertateResConfig.Generate();//每次在打包前,处理Resources文件夹中的资源映射
    }
}
#endif

猜你喜欢

转载自blog.csdn.net/u014361280/article/details/128737094
今日推荐