[英]How can I loop over all game objects in hierarchy including disabled objects all children too in both scenes?
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEngine;
public class CompareObjects : EditorWindow
{
string searchString = "";
List<GameObject> items = FindObjectsOfType(typeof(GameObject)).ToList();
void OnGUI()
{
GUILayout.BeginHorizontal(EditorStyles.toolbar);
GUILayout.FlexibleSpace();
searchString = GUILayout.TextField(searchString, EditorStyles.toolbarTextField);
GUILayout.EndHorizontal();
// Do comparison here. For example
for (int i = 0; i < items.Length; i++)
{
if (items[i].name.Contains(searchString))
{
GUI.Label(items[i].name);
}
}
}
}
第一個問題是我無法轉換數組:
FindObjectsOfType(typeof(GameObject))
列出。
秒我如何在兩個場景中循環對象? 我想在場景 a 和場景 b 對象之間進行比較,並且還能夠縮小對具有特定組件的對象的搜索范圍,並在 EditorWindow 中列出結果:列出 A 場景 A 和 B 中具有組件的對象場景 B 中具有組件的對象
例如,如果我在搜索欄中鍵入: Space,BoxCollider 那么它應該會在兩個場景中找到包含名稱 Space 並且還附加了 BoxCollider 或未附加 BoxCollider 的所有對象。
我想知道結果中哪些對象名稱 Space 有 boxcollider 而沒有。
例子:
List A : Space1 BoxCollider -- Scene A
List A : Space2 Empty -- Scene A
List B : Space1 Empty -- Scene B
List B : Space2 BoxCollider -- Scene B
像這樣的比較。
我無法轉換數組
方法FindObjectsOfType(Type)
返回對象數組,要將這些對象轉換為列表,您可以使用 LINQ 方法OfType :
List<GameObject> items = FindObjectsOfType(typeof(GameObject)).OfType<GameObject>.ToList();
或者只是使用方法FindObjectsOfType<T>()
的通用覆蓋
List<GameObject> items = GameObject.FindObjectsOfType<GameObject>().ToList();
秒我如何在兩個場景中循環對象?
您需要 select SceneManager
中的所有場景,並在其GetRootGameObjects()
上進行循環。
如果您需要循環所有對象並進行一些手動計算 - 您可以像這里描述的那樣手動織機。 如果你知道你需要什么組件,你可以使用方法public Component[] GetComponentsInChildren(Type t, bool includeInactive);
使用場景根對象(如果要在非活動對象中搜索,請確保將includeInactive
設置為True
)
我想知道結果中哪些對象名稱 Space 有 boxcollider 而沒有。
using System.Linq;
using UnityEditor;
using UnityEngine;
using UnityEngine.SceneManagement;
public static class Searcher
{
[MenuItem("Tools/PrintSearch")]
public static void PrintSearch()
{
var objectName = "Space";
var componentType = typeof(BoxCollider);
var scenes = Enumerable.Range(0, SceneManager.sceneCount)
.Select(SceneManager.GetSceneAt)
.ToArray();
var objectsWithNames = scenes
.ToDictionary(s => s, s=> GetSceneObjectsWithName(s, objectName.ToLower()));
var forLog = objectsWithNames
.SelectMany(pair => pair.Value.Select(child =>
$"Scene {pair.Key.name}: object name '{child.gameObject.name}' {(child.GetComponent(componentType) != null ? "contains" : "do not contains")} component {componentType.Name}"));
Debug.Log(string.Join("\n", forLog));
}
private static Transform[] GetSceneObjectsWithName(Scene scene, string objectName)
{
return scene.GetRootGameObjects()
.SelectMany(g => GetChildHierarchyRecursively(g.transform))
.Where(t=>t.gameObject.name.ToLower().Contains(objectName))
.ToArray();
}
private static IEnumerable<Transform> GetChildHierarchyRecursively(Transform parentTransform)
{
yield return parentTransform;
if (parentTransform.childCount > 0)
yield return parentTransform;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.