Unity在Editor模式下遍歷所有scene中的GameObject

前言

自己寫的編輯器擴展中要操作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);
                }
            }
        }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章