代码
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,则原进度条不会消失