這是我參與8月更文挑戰的第5天,活動詳情查看:8月更文挑戰數組
一篇小白也能看懂的查找遊戲物體的方式解析 -- Unity 之 查找物體的幾種方式(一)。本文經過實際測試得出使用結論,你們進行簡單記錄,在使用時想不起來能夠再來看看,多用幾回基本就沒有問題了。markdown
Object.Find()
:根據名稱找到遊戲對象並返回它。ide
void ObjectFind()
{
// 找父級
GameObject parent = GameObject.Find("GameObject");
Debug.Log("找父級物體,是否找到:" + (parent != null));
// 找子級
GameObject child = GameObject.Find("Child");
Debug.Log("找子級物體,是否找到:" + (child != null));
// 找父級隱藏物體
GameObject parentHide = GameObject.Find("GameObjectHide");
Debug.Log("找父級隱藏物體,是否找到:" + (parentHide != null));
// 找子級隱藏物體
GameObject childHide = GameObject.Find("ChildHide");
Debug.Log("找子級隱藏物體,是否找到:" + (childHide != null));
}
複製代碼
測試結果以下圖: post
當有使用GameObject.Find("GameObject")
, 場景中有多個名爲「GameObject」的物體存在時,將每一個「GameObject」設置爲不一樣的標籤,多運行幾回查看結果。測試
測試場景以下: ui
測試代碼以下:spa
// 找同名物體
GameObject nameObj = GameObject.Find("GameObject");
Debug.Log("找同名,是否找到:" + nameObj.tag);
複製代碼
測試結果: 查找順序是:「自身」(掛載腳本的物體) --> 和自身同層級上面物體 --> 和自身同層級下面物體 --> 自身子物體 --> 自身父物體。翻譯
Object.Find()得出結論:3d
使用建議: 有同名物體存在時,儘可能不要使用Object.Find()
進行查找,或者說使用Object.Find()
進行查找時,應控制查找物體命名惟一。code
GameObject.FindGameObjectWithTag()
根據標籤查找遊戲物體並返回。 GameObject.FindGameObjectsWithTag()
根據標籤查找當前場景中全部這個標籤的遊戲物體並返回全部物體的數組。
將以下場景:除主攝像機~(Main Camera)外的全部遊戲物體的標籤(Tag)~都修改成Player,進行測試。
測試代碼以下:
void GameObjectFindWithTag()
{
GameObject tagObj = GameObject.FindGameObjectWithTag("MainCamera");
Debug.Log("根據標籤查找遊戲物體,是否查到:" + (tagObj != null));
GameObject[] tagObjs = GameObject.FindGameObjectsWithTag("Player");
for (int i = 0; i < tagObjs.Length; i++)
{
Debug.Log("根據標籤查找遊戲物體名稱:" + tagObjs[i].name);
}
}
複製代碼
測試結果:
查找不存在的標籤測試:
GameObject tagObj = GameObject.FindGameObjectWithTag("MainCamera1");
Debug.Log("根據標籤查找遊戲物體,是否查到:" + (tagObj != null));
複製代碼
報錯:UnityException: Tag: MainCamera1 is not defined.
翻譯: MainCamera1是一個未定義的標籤
FindGameObjectWithTag()得出結論:
FindGameObjectWithTag
此方式查找單一遊戲體,由於查找順序會受到層級影響;和上面根據標籤查找的邏輯差很少。
GameObject.FindObjectOfType<類型>();
:根據類型(組件/自定義腳本)查找並返回這個類。 GameObject.FindObjectsOfType<類型>()
:根據類型(組件/自定義腳本)查找當前場景中全部這個類並返回一個這個類的數組。
void FindObjectOfType()
{
Camera typeCamera = GameObject.FindObjectOfType<Camera>();
Debug.Log("根據類型查找物體,是否查到:" + (typeCamera != null));
Transform[] typeTransArr = GameObject.FindObjectsOfType<Transform>();
for (int i = 0; i < typeTransArr.Length; i++)
{
Debug.Log("根據類型查找到的物體名稱:" + typeTransArr[i].name);
}
}
複製代碼
FindObjectOfType()得出結論:
一般使用狀況爲:初始化時在一個腳本中獲取另外一個腳本的引用,經過這種形式查找。【後多被單例取代】
好了本文就介紹這裏了,感謝你觀看至此。若對你有所幫助,但願能夠三連支持下。若你還相關問題沒有獲得解決或者更好的處理方案,也但願你留言評論。
Unity基礎 之 查找遊戲物體的幾種方式解析(二):juejin.cn/editor/draf…