Unity 获取一个资源被那些资源引用
在 API 只知道了一个资源依赖其他资源的方法 AssetDatabase.GetDependencies 当删除一个资源时往往害怕它被其他资源引用,导致错误,往往需要找到具体哪些文件引用了该资源,Unity 没有提供方法,可以通过 AssetDatabase.GetDependencies 收集项目中所有资源的引用关系,比如项目中资源 A 引用了 D, B 引用了 C, 则 反向查找可以确定 D 被 A 引用了, C 被 B 引用了
在 Editor文件夹中新建脚本 AssetBeDepend.cs
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class AssetBeDepend
{
private static Dictionary<string, List<string>> referenceCacheDic = new Dictionary<string, List<string>>();
[MenuItem("Assets/AssetBeDepend")]
static void Select()
{
CollectDepend();
string[] guids = Selection.assetGUIDs;
foreach (var guid in guids)
{
string assetPath = AssetDatabase.GUIDToAssetPath(guid);
IsBeDepend(assetPath);
}
}
static void CollectDepend()
{
int count = 0;
string[] guids = AssetDatabase.FindAssets("");
foreach (string guid in guids)
{
string assetPath = AssetDatabase.GUIDToAssetPath(guid);
string[] dependencies = AssetDatabase.GetDependencies(assetPath, false);
foreach (var filePath in dependencies)
{
List<string> list = null;
if (!referenceCacheDic.TryGetValue(filePath, out list))
{
list = new List<string>();
referenceCacheDic[filePath] = list;
}
list.Add(assetPath);
}
count++;
EditorUtility.DisplayProgressBar("Search Dependencies", "Dependencies", (float)(count * 1.0f / guids.Length));
}
EditorUtility.ClearProgressBar();
}
static bool IsBeDepend(string filePath)
{
List<string> list = null;
if (!referenceCacheDic.TryGetValue(filePath, out list))
{
return false;
}
foreach(var file in list)
{
Debug.LogError(filePath + " 被:" + file + " 引用");
}
return true;
}
}
代码中注释比较详细了,不在详解代码
测试方法:在 Assets 文件夹下选中一个、多个文件,鼠标右键,在弹出面板中点击 AssetBeDepend 按钮
|