unity编辑器中 一个文件在哪些Prefab或场景中被引用

有时候需要知道一个文件例如一个脚本,一个图片,或者一个动画被哪些Prefab引用,或者出现在哪些场景中

可以用以下工具进行查找

unity编辑器中 一个文件在哪些Prefab或场景中被引用_第1张图片

存在的问题

1.遍历了所有的prefab所以会卡,效率不高(可以分文件夹再遍历)

2.没有仔细测试过只是提供个思路

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using System.IO;

/// 
/// 定位文件位置,查找文件位置
/// 
public class LocatingObject : EditorWindow
{
    enum OPTIONS
    {
        prefab = 0,
        unity
    }

    Object target = null;                        //要查找的目标文件
    List results = new List();   //查找的结果
    OPTIONS findType = OPTIONS.prefab;


    [MenuItem("Tools/Find")]
    static void Init()
    {
        EditorWindow.GetWindow(typeof(LocatingObject));
    }

    void OnGUI()
    {
        findType = (OPTIONS)EditorGUILayout.EnumPopup("查找目标类型", findType);

        GUILayout.Label("查找文件:");
        target = (Object)EditorGUILayout.ObjectField(target, typeof(Object), true);
        if (GUILayout.Button("查找"))
        {
            results.Clear();
            Debug.Log("开始查找.");
            FindOBJ();
        }
        if (results.Count > 0)
        {
            foreach (Object t in results)
            {
                EditorGUILayout.ObjectField(t, typeof(Object), false);
            }
        }
        else
        {
            GUILayout.Label("无数据");
        }
    }

    void FindOBJ()
    {
        //获取到所有要查找类型的文件目录
        string[] files = Directory.GetFiles(Application.dataPath, "*."+ findType.ToString(), SearchOption.AllDirectories);
        Debug.Log(findType.ToString()+"遍历数量:" + files.Length);
        List filelst = new List();
        for (int i = 0; i < files.Length; i++)
        {
            //当前prefab下的所有引用到的资源 .png .FBX .mat .shader .cs .anim .controller .fbx .TTF .tga等
            string[] source = AssetDatabase.GetDependencies(new string[] { files[i].Replace(Application.dataPath, "Assets") });
            for (int j = 0; j < source.Length; j++)
            {
                string str = AssetDatabase.GetAssetPath(target);
                if (source[j] == str)
                {
                    //Debug.Log("包含选取文件prefab地址:" + files[i].ToString());
                    results.Add(AssetDatabase.LoadMainAssetAtPath(files[i].Replace(Application.dataPath, "Assets")));
                }
            }
        }
    }
}
 
  

 

 

 

 

你可能感兴趣的:(unity编辑器)