1. 程式人生 > >Unity3D_01_各種尋找GameObject方法

Unity3D_01_各種尋找GameObject方法

隱藏 頻繁 調用 lse ima 兩個 無法 objects 情況下

1.GameObject.Find():

尋找Hierarchy面板中的activie 不為false的遊戲對象;
路徑如官方事例寫法:
public class ExampleClass : MonoBehaviour {
public GameObject hand;
void Example() {
hand = GameObject.Find(“Hand”);
hand = GameObject.Find(“/Hand”);
hand = GameObject.Find(“/Monster/Arm/Hand”);
hand = GameObject.Find(“Monster/Arm/Hand”);
}
}

註解:
GameObject.Find()使用起來很方便,就是如果你的這個GameObject天生acive = false的話。那麽你用GameObject.Find()是永遠也無法獲取它的對象的。如果對象都獲取不到,那麽對象身上腳本啊 組件啊啥的都是獲取不到的,變成了沒有意義的對象。
GameObject.Find()方法在遊戲中的使用頻率很高。但是它也很消耗性能,你可以想想它的原理肯定也是用類似遞歸的形式來做的,那麽我們就要盡量更少的調用GameObject.Find()方法,可以把獲取的遊戲對象,保存在內存裏,這是再好不過的選擇了。 尤其是在Update方法中不要去 Find()遊戲對象!!

2.Transform.Find()

官方解釋是通過名字獲取到一個子物體(Finds a child by name and returns it),該方法可以獲取到隱藏(inactive)的GameObject,
可以通過先獲得父對象(active必須為true),再通過尋找孩子Transform.Find()

1 GameObject root = GameObject.Find("GameObject");      
2 
3 GameObject xxxx = root.transform.Find("xxxx").gameObject;
4 
5 xxxx.SetActive(true
);

註解:
還記得上面我說過用GameObject無法獲取天生acive = false的遊戲對象,如果你用Transform.Find()的話就可以很好的獲取,另外Unity還提供了一個Transform.FindChind()的方法,這個方法未來會被unity廢棄,大家最好就別用了,用Transform.Find()可以取代。
如下代碼,我們先獲取頂級對象root 。接著用Find()去找它的子節點”xxxx”的對象,無論”xxxx”對象是否active = true 都是可以直接找到對象的。

Find()方法只能直接去找子節點,如果你想找 孫節點,那麽可以用”/“符號把層級關系隔開,找起來很方便。同樣無論”xxxx”對象是否active = true 都是可以直接找到對象的。

   GameObject cube = root.transform.Find("xxxx/Cube").gameObject;

另外要註意的是,Unity規定了比如父節點active = true 並且子節點的 active = true 都滿足的情況下 才能全部顯示。使用Transform.Find()可以很方便的獲取遊戲對象,因為有了遊戲對象,那麽它身上的腳本啊組件啊什麽的都可以很方便的獲取到。

但是Transform.Find()必須要保證你的頂級父對象的activity = true。

舉個例子,你做了一個場景有一些地圖你在場景裏面預先activie = false了, 你希望在遊戲中的某個時間點把它們都打開 setActive(true)

你可以把“map”節點放在一個active = true的GameObject上,無論是關閉 或者 顯示 代碼中寫起來都很方便。 假如你的map節點就是頂級節點,那麽它一旦天生acive = false ,那麽你將無法得到它的對象,更無法設置它的屬性了。

1 GameObject root = GameObject.Find(“GameObject”);        
2 
3 GameObject map =  root.transform.Find(“map”).gameObject;       
4 
5 map.SetActive(true);

3. Unity 還提供了幾個獲取遊戲對象的方法

GameObject.FindGameObjectsWithTag(“tag”)
GameObject.FindWithTag(“tag”)

根據一個標記來獲取遊戲對象,返回一個 或者 一個數組,我個人覺得這個兩個方法沒啥用,因為既然需要用到標記那麽相比這個遊戲對象必然是非常特殊的一個,所以我會把它存在內存中。

Object.FindObjectOfType
Object.FindObjectsOfType
Resources.FindObjectsOfTypeAll

根據一個類型返回Object,比如 GameObject 、Texture、Animation 、甚至還可以是你自己寫的一個腳本 的範型。它找起來很方便,可以返回一個 或者一個數組。 我覺得這幾個方法其實遊戲中也沒啥用,不過在編輯器中使用的確實很頻繁,比如你要做批量檢查場景的工具,查找場景中有沒有使用某個特殊類型的對象。 或者查看內存的占用量,看看當前內存中那些Texture沒有被釋放掉。 等等。

還有一個方法,如果知道自對象的索引,還可以用下面的方法來獲取,參數是index的索引。

transform.GetChild(index);index為索引,0,1,2,3,4代表第幾個child.

Unity3D_01_各種尋找GameObject方法