IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 留个档,Unity的资源反向引用查询 -> 正文阅读

[游戏开发]留个档,Unity的资源反向引用查询

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.IO;
using System.Linq;
using System;
using System.Text;
using System.Reflection;

public class ReverseDependencies
{
    [MenuItem("优化工具/反向引用/刷新")]
    static void DoLogic()
    {
        DoSeach(null);
    }

    [MenuItem("优化工具/反向引用/刷新 From Config")]
    static void DoLogicIf()
    {
        Load();

		if (m_dicReverseDeps == null)
		{
			DoSeach(null);
		}
	}

    static void DoSeach(System.Action onFinish)
    {
        m_dicReverseDeps = new Dictionary<string, Dictionary<Type, List<string>>>();

        List<string> withoutExtensions = new List<string>() { ".prefab", ".unity", ".asset", ".mat", ".png", ".tga", ".jpg" };

		//string[] files = Directory.GetFiles(@"E:\copywork\UnityArt\Assets\FBX\Effect\Prefab_UI\AnJianTX", "*.*", SearchOption.AllDirectories)
		string[] files = Directory.GetFiles(Application.dataPath, "*.*", SearchOption.AllDirectories)
			.Where(s => withoutExtensions.Contains(Path.GetExtension(s).ToLower())).ToArray();
        int startIndex = 0;

        EditorApplication.update = delegate ()
        {
            string file = files[startIndex];

            bool isCancel = EditorUtility.DisplayCancelableProgressBar("检查资源中", file, (float)startIndex / (float)files.Length);

            ParseOne(file);

            startIndex++;
            if (isCancel || startIndex >= files.Length)
            {
                EditorUtility.ClearProgressBar();
                EditorApplication.update = null;
                startIndex = 0;
                Debug.Log("检查结束");

                Save();

                onFinish?.Invoke();
            }
        };
    }

    /// <summary>
    /// 内容集合, key对象GUID <类型, 引用对象GUID>
    /// </summary>
    private static Dictionary<string, Dictionary<Type, List<string>>> m_dicReverseDeps = null;

    private static void ParseOne(string strPath)
    {
        strPath = strPath.Replace("\\", "/");
        string strLocalPath = strPath.Replace(Application.dataPath, "Assets");

        string strKeyGUID = AssetDatabase.AssetPathToGUID(strLocalPath);    // 获取对象的GUID, 作为键值对的key
        Type typeKey = AssetDatabase.GetMainAssetTypeAtPath(strLocalPath);

        string[] arrDeps = AssetDatabase.GetDependencies(strLocalPath);   // 获取所有依赖;
        for (int i = 0; i < arrDeps.Length; i++)
        {
            string strGUIDDep = AssetDatabase.AssetPathToGUID(arrDeps[i]);

            Dictionary<Type, List<string>> dic;
            if (!m_dicReverseDeps.TryGetValue(strGUIDDep, out dic))
            {
                dic = new Dictionary<Type, List<string>>();
                m_dicReverseDeps.Add(strGUIDDep, dic);
            }

            List<string> list;
            if (!dic.TryGetValue(typeKey, out list))
            {
                list = new List<string>();
                dic.Add(typeKey, list);
            }

            list.Add(strKeyGUID);
        }
    }


    private static void Load()
    {
        string strPath = Path.Combine(Application.dataPath, "..", "reverse_dependencies.txt");
        if (!File.Exists(strPath))
        {
            return;
        }

        m_dicReverseDeps = new Dictionary<string, Dictionary<Type, List<string>>>();

        string strData = File.ReadAllText(strPath, Encoding.UTF8);
        string[] arrLines = strData.Split(new string[] { "\n"}, StringSplitOptions.RemoveEmptyEntries);
		for (int i = 0; i < arrLines.Length; i++)
        {
            var kv = arrLines[i].Split(new string[] { "{k}" }, StringSplitOptions.RemoveEmptyEntries);

            string strKey = kv[0];
            m_dicReverseDeps.Add(strKey, new Dictionary<Type, List<string>>());


            string[] arrParts = kv[1].Split(new string[] { "{p}" }, StringSplitOptions.RemoveEmptyEntries);
			for (int j = 0; j < arrParts.Length; j++)
			{
                string[]arrt2l = arrParts[j].Split(new string[] { "{t}" }, StringSplitOptions.RemoveEmptyEntries);

                string[] arrtype = arrt2l[0].Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
                string[] arrlist = arrt2l[1].Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);


                Assembly asmb = Assembly.LoadFrom(arrtype[0]);
                Type type = asmb.GetType(arrtype[1]);

                m_dicReverseDeps[strKey].Add(type, new List<string>(arrlist));

            }
        }
    }

    private static void Save()
    {
        StringBuilder strBuilder = new StringBuilder();
		foreach (var item in m_dicReverseDeps)
        {
            strBuilder.Append(item.Key);
            strBuilder.Append("{k}");

            Dictionary<Type, List<string>> dic = item.Value;
			foreach (var tl in dic)
			{
                strBuilder.Append(tl.Key.Module.FullyQualifiedName);
                strBuilder.Append(",");
                strBuilder.Append(tl.Key.FullName);
                strBuilder.Append("{t}");

                List<string> list = tl.Value;
				for (int i = 0; i < list.Count; i++)
				{
                    strBuilder.Append(list[i]);
                    strBuilder.Append(",");
                }
                strBuilder.Append("{p}");
            }

            strBuilder.Append("\n");
        }

        string strPath = Path.Combine(Application.dataPath, "..", "reverse_dependencies.txt");
        File.WriteAllText(strPath, strBuilder.ToString(), Encoding.UTF8);
    }

    //----以下 对外 查询接口
    public static List<string> GetReverseDeps(string strGUID, Type type)
    {
        if (m_dicReverseDeps == null)
        {
            return null;
        }

        Dictionary<Type, List<string>> dic;
        if (!m_dicReverseDeps.TryGetValue(strGUID, out dic))
        {
            return null;
        }

        List<string> list;
        if (!dic.TryGetValue(type, out list))
        {
            return null;
        }

        return list;
    }

}


程序学无止尽。
欢迎大家沟通,有啥不明确的,或者不对的,也可以和我私聊
我的QQ 334524067 神一般的狄狄

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-12-16 18:01:25  更:2021-12-16 18:01:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 21:07:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码