在Unity中,要确定Assets文件夹中的资源是否在场景中使用,可以使用Unity Editor的一些工具和脚本来进行检查。

直接上脚本

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文件夹中,选中你想要寻找的资源,运行方法,结果就会打印在控制台中

猜你喜欢

转载自blog.csdn.net/Chj1319261607/article/details/135000521