获取某个Unity工程中的所有预制体

代码

private List<GameObject> GetAllPrefabs()
{
    List<GameObject> prefabs = new List<GameObject>();
    var resourcesPath = Application.dataPath;
    var absolutePaths = System.IO.Directory.GetFiles(resourcesPath, "*.prefab", System.IO.SearchOption.AllDirectories);
    for (int i = 0; i < absolutePaths.Length; i++)
    {
        EditorUtility.DisplayProgressBar("获取预制体……", "获取预制体中……", (float)i/absolutePaths.Length);

        string path = "Assets" + absolutePaths[i].Remove(0, resourcesPath.Length);
        path = path.Replace("\\", "/");
        GameObject prefab = AssetDatabase.LoadAssetAtPath(path, typeof(GameObject)) as GameObject;
        if (prefab != null)
            prefabs.Add(prefab);
        else
            Debug.Log("预制体不存在! "+path);
    }
    EditorUtility.ClearProgressBar();
    return prefabs;
}

知识点

获取预制体的路径,用于AssetDatabase.LoadAssetAtPath

通过Application.dataPath获取游戏数据所在目录

在不同的平台上该路径是不同的:在编辑器模式下是Assets目录,即:<path to projectfolder>/Assets

通过C#的System.IO.Directory.GetFiles获取游戏数据目录中的所有预制体,参数如下

string path:即游戏数据所在目录

string searchPattern:因要找的是prefab,因此是*.prefab

System.IO.SearchOption searchOption:因要找目录下所有的prefab,包括子孙目录,因此使用AllDirectories(若不在子孙目录中搜索则使用TopDirectoryOnly)

将路径处理为Unity能识别的路径

路径从Assets开始,因此移除前面获取到的路径中包含的游戏数据所在目录的部分,但这样就移除了“Assets”,因此再在开头将其加回

  • 移除字符串子串的方法:string.Remove(要移除的子串的第一个字符在原字符串中的序号,要移除的子串的长度)

将路径中的“\”替换为“/”

进度条ProgressBar

因获取所有预制体可能需要较长的时间,因此用进度条显示当前执行进度

  • 显示进度条:EditorUtility.DisplayProgressBar(string title, string info, float progress)

移除进度条显示:EditorUtility.ClearProgressBar()

  • 若调用了EditorUtility.DisplayProgressBar后不调用 EditorUtility.ClearProgressBar,则原进度条不会消失
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容