unity中查找游戲物體是很尋常的操作,有較多的方法,如下:
unity中提供了獲取對象的方法:
通過對象名稱(Find方法)GameObject.Find
通過標簽獲取單個游戲對象(FindWithTag方法)
通過標簽獲取多個游戲對象(FindGameObjectsWithTags方法)
通過類型獲取單個游戲對象(FindObjectOfType方法)
通過類型獲取多個游戲對象(FindObjectsOfType方法)
--------------------
Find方法:
static GameObject Find (string name)
傳入的name可以是單個的對象的名字,也可以是hierarchy中的一個路徑名,如果找到會返回該對象(活動的),如果找不到就返回null。
注:無論傳值是名字或則路徑名,只有對象存在就能返回該對象。建議傳具體的路徑名,以防有多個相同名字的對象的情況。且當有多個相同名字的對象的時候,返回為查找到的第一個對象。另不建議在每一幀都執行的函數(如update,fixupdate...)中調用該函數, 可以在Start這種函數中定義變量獲取返回值,在其他函數中使用。
注:
1.使用對象名的情況:可查找帶不帶腳本,不查找隱藏(隱藏為active=false)的物體對象,返回的不一定是要查找的對象(有多個名相同物體的情況下)
2.使用目錄結構:可查找帶不帶腳本,能查隱藏,可以確定是要找的對象
注:如果路徑查找中的任何一個父節點active=false,這個對象都將查找不到
---------------------------------------------------------------
對比:
transform.Find()
1.對象名 只能查當前對象下一級子目錄的對象,也基本確定,可查找隱藏對象,根節點需可見
2.目錄結構 可查找帶不帶腳本對象,可以查隱藏物體,可以確定是要找的對象
腳本示例:
1 GameObject.Find("GameObject"); 2 GameObject.Find("GameObject/ChildGameObject);
--------------------
總:使用目錄結構進行查找較通過名字查詢縮短了查詢時間和范圍,也更能確定對象,缺點是一旦路徑或結構調整后,容易影響到程序。方便使用,但效率低下。
---------------------------------------------------------------
FindWithTag方法:
static GameObject FindWithTag (string tag)
返回一個用tag做標識的活動的對象,如果沒有找到則為null。
tag設置:在hierarchy中選擇對象,右側的Inspector面板上面的選擇Tag(可添加自定義:利用下拉列表中的AddTag創建)
---------------------
FindGameObjectsWithTag方法:
static GameObject[] FindGameObjectsWithTag (string tag)
返回一個用tag做標識的活動的游戲物體的列表,如果沒有找到則為null。
---------------------
FindObjectOfType方法:
static Object FindObjectOfType(Type type)
返回類型為type的活動的第一個游戲對象
---------------------
FindObjectsOfType方法:
static Object FindObjectsOfType(Type type)
返回類型為type的所有的活動的游戲對象列表
注意:一定保證對象是active的才會找到
效率問題,建議在初始函數中進行初始化
---------------------
對比:
Transform.Find
1.可以查找隱藏對象
2.支持路徑查找
3.查找隱藏對象的前提是transform所在的根節點必須可見,即active=true
---------------------
Resources.FindObjectsOfTypeAll
返回指定類型的對象列表。主要用於編輯器中,eg。檢測內存泄露、批量查找的功能等
---------------------
GameObject.Find("a"); // 相對路徑查找
GameObject.Find("/a"); // 絕對路徑查找
---------------------
即使隱藏root節點gameObject也能進行查找:
GetComponentsInChildren( typeof(Transform), true );
GetComponent<Transform>(true);