Unity基礎 之 查找遊戲物體的幾種方式解析(一)

這是我參與8月更文挑戰的第5天,活動詳情查看:8月更文挑戰數組

前言:

一篇小白也能看懂的查找遊戲物體的方式解析 -- Unity 之 查找物體的幾種方式(一)。本文經過實際測試得出使用結論,你們進行簡單記錄,在使用時想不起來能夠再來看看,多用幾回基本就沒有問題了。markdown

一,Object.Find()

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));
}
複製代碼

測試結果以下圖: ObjectFindpost


當有使用GameObject.Find("GameObject"), 場景中有多個名爲「GameObject」的物體存在時,將每一個「GameObject」設置爲不一樣的標籤,多運行幾回查看結果。測試

測試場景以下: 搭建場景ui

測試代碼以下:spa

// 找同名物體
GameObject nameObj = GameObject.Find("GameObject");
Debug.Log("找同名,是否找到:" + nameObj.tag);
複製代碼

測試結果: 查找順序是:「自身」(掛載腳本的物體) --> 和自身同層級上面物體 --> 和自身同層級下面物體 --> 自身子物體 --> 自身父物體。翻譯

找同名物體

Object.Find()得出結論:3d

  1. 全局查找參數名稱遊戲物體;
  2. 不對禁用(隱藏)物體進行查找;
  3. 如有同名物體時根據層級關係進行查找。

使用建議: 有同名物體存在時,儘可能不要使用Object.Find()進行查找,或者說使用Object.Find()進行查找時,應控制查找物體命名惟一。code


二,FindGameObjectWithTag()

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.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()得出結論:

  • 查找不到禁用物體,使用時需確認要查找的物體是啓用(顯示)狀態;
  • 查找場景中不存在類型時會返回null,不會報錯;

一般使用狀況爲:初始化時在一個腳本中獲取另外一個腳本的引用,經過這種形式查找。【後多被單例取代】


好了本文就介紹這裏了,感謝你觀看至此。若對你有所幫助,但願能夠三連支持下。若你還相關問題沒有獲得解決或者更好的處理方案,也但願你留言評論。

Unity基礎 之 查找遊戲物體的幾種方式解析(二):juejin.cn/editor/draf…

相關文章
相關標籤/搜索