MyFindObjectsOfType

该函数的遍历顺序为(以Hierarchy窗口为基准)从上到下,由外向内依次遍历。

  • 手动遍历Hierarchy窗口, 对于某些需求(例如获取所有的顶层组件T)在一定程度上能够降低时间复杂度(剪枝),不过需要自己添加限制条件(例如:使用Dictionary记录已经获取过的组件)
  • 同样的,MyFindObjectsOfType的返回值根据项目实际情况自行更改
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public static T[] MyFindObjectsOfType<T>() where T : Component
{
Scene scene = SceneManager.GetActiveScene();
GameObject[] roots = scene.GetRootGameObjects();
List<T> objects = new List<T>();
for (int i = 0; i < roots.Length; i++)
{
/*
如果之前获取过该组件,就不再获取
*/
if (roots[i].TryGetComponent(out T component))
{
objects.Add(component);
}
GetObjectsByType<T>(roots[i].transform, ref objects);
}
return objects as T[];
}
static void GetObjectsByType<T>(Transform transform, ref List<T> objects) where T : Component
{
if (transform.childCount == 0) return;
Transform curChild;
for (int i = 0; i < transform.childCount; i++)
{
curChild = transform.GetChild(i);
/*
如果之前获取过该组件,就不再获取
*/
if (curChild.TryGetComponent(out T component))
{
objects.Add(component);
}
GetObjectsByType<T>(curChild, ref objects);
}
}