直接上脚本
using UnityEngine;
using UnityEditor;
using System.Collections.Generic;
using System.Linq;
public class BatchFindReferences : MonoBehaviour
{
[MenuItem("工具/批量查找资源引用")]
static void BatchFindReferencess()
{
// 获取在Project视图中选中的所有对象
UnityEngine.Object[] selectedObjects = Selection.GetFiltered(typeof(UnityEngine.Object), SelectionMode.Assets);
foreach (UnityEngine.Object selectedObject in selectedObjects)
{
// 为每个选中的对象查找引用
FindReferences(selectedObject);
}
}
static void FindReferences(UnityEngine.Object targetObject)
{
// 获取所有场景中的GameObject
GameObject[] allObjects = GameObject.FindObjectsOfType<GameObject>();
bool referencesFound = false;
// 遍历场景中的所有对象
foreach (GameObject obj in allObjects)
{
// 跳过目标对象本身
if (obj == null)
continue;
// 检查当前对象是否引用目标资源
if (ObjectReferencesAsset(obj, targetObject))
{
referencesFound = true;
break; // 找到引用就跳出循环,无需继续查找
}
}
// 输出结果到控制台
if (referencesFound)
{
//Debug.Log($"资源 {targetObject.name} 已在场景中被引用。");
Debug.Log("已在场景中被引用。");
}
else
{
//Debug.Log($"资源 {targetObject.name} 未在场景中被引用。");
Debug.Log("未在场景中被引用。");
}
}
static bool ObjectReferencesAsset(GameObject obj, UnityEngine.Object targetObject)
{
PrefabAssetType assetType = PrefabUtility.GetPrefabAssetType(obj);
if (assetType == PrefabAssetType.Regular || assetType == PrefabAssetType.Variant)
{
GameObject prefabRoot = PrefabUtility.GetCorrespondingObjectFromSource(obj) as GameObject;
if (prefabRoot != null && PrefabReferencesAsset(prefabRoot, targetObject))
{
return true;
}
}
return obj.name == targetObject.name;
}
static bool PrefabReferencesAsset(GameObject prefabRoot, UnityEngine.Object targetObject)
{
Object[] dependencies = EditorUtility.CollectDependencies(new Object[] {
prefabRoot });
return dependencies.Contains(targetObject);
}
}
将其放在Editor文件夹中,选中你想要寻找的资源,运行方法,结果就会打印在控制台中