unity物体的查找


GameObject.Find

通过名字或路径查找游戏对象

(1)使用

GameObject.Find("GameObject"); GameObject.Find("GameObject/ChildGameObject);

(2)注意

①无法查找隐藏对象,只要路径中存在任何一个节点是隐藏的,则查找不到该对象

②查找相当于递归遍历查找,虽使用方便但效率低下,建议在Start()函数中查找对象并保存引用,切忌在Update()中动态查找。

Transform.Find

(1)使用

transform.Find("GameObject");

(2)注意

①可以查找隐藏对象

②支持路径查找

③查找隐藏对象的前提是transform所在的根节点必须可见

GameObject.FindWithTag与GameObject.FindGameObjectsWithTag

通过标签查找物体,使用较少

Resources.FindObjectsOfTypeAll

返回指定类型的对象列表。主要用于编辑器中,eg。检测内存泄露、批量查找的功能等

(1)使用(即使root隐藏也能查找到)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
GameObject[] pAllObjects =(GameObject[])Resources.FindObjectsOfTypeAll(typeof(GameObject)); foreach (GameObject pObject in pAllObjects)
 {
     if (pObject.transform.parent != null) {
          continue;
     }
     if (pObject.hideFlags == HideFlags.NotEditable || pObject.hideFlags == HideFlags.HideAndDontSave) {
          continue;
     }
     if (Application.isEditor) {
          string sAssetPath = AssetDatabase.GetAssetPath(pObject.transform.root.gameObject);
          if (!string.IsNullOrEmpty(sAssetPath)) {
                  continue;
          }
     }
     Debug.Log(pObject.name);
 }