前言
自己寫的編輯器擴展中要操作scene中的GameObject,用Selection.objects需要手動選擇比較麻煩,於是找到了如下方法自動獲取所有場景中的對象。需要注意要把操作的場景放到build setting裏。
代碼
foreach (UnityEditor.EditorBuildSettingsScene S in UnityEditor.EditorBuildSettings.scenes)
{
//在built setting中被勾選的scene
if (S.enabled)
{
//得到場景的名稱
string name = S.path;
//打開這個場景
UnityEditor.SceneManagement.EditorSceneManager.OpenScene(name);
// 遍歷場景中的GameObject
// 注意FindObjectsOfTypeAll雖然會找到所有對象,但是也會找到場景中沒有的東西,而且會出現重複查找的情況,最好是進行篩選一下
foreach (GameObject obj in Resources.FindObjectsOfTypeAll(typeof(GameObject)))
{
Debug.Log(obj.name);
}
}
}
優化版(加了篩選和防重):
List<int> objId = new List<int>();
// 遍歷build setting中的場景
foreach (UnityEditor.EditorBuildSettingsScene S in UnityEditor.EditorBuildSettings.scenes)
{
//在built setting中被勾選
if (S.enabled)
{
//得到場景的名稱
string name = S.path;
//打開這個場景
UnityEditor.SceneManagement.EditorSceneManager.OpenScene(name);
// 遍歷場景中的GameObject
// 注意FindObjectsOfTypeAll雖然會找到所有對象,但是也會找到場景中沒有的東西,而且會出現重複查找的情況,最好是進行篩選一下
foreach (GameObject obj in (Resources.FindObjectsOfTypeAll(typeof(GameObject)) as GameObject[]).Where(_ => _.GetComponent<Text>()))
{
//每個對象的InstanceID是唯一的
if (objId.Contains(obj.GetInstanceID()))
return;
objId.Add(obj.GetInstanceID());
Debug.Log("scene name:" + S.path + " object name:" + obj.name);
}
}
}