一、聲明
GameObject[] rock = new GameObject[4];
二、遍歷
可以先聲明一個GameObject的數組GameObject[], 然后把需要遍歷的對象放進去,然后可以用下面兩種方式遍歷:
1、for(int i = 0 ; i < 數組名.Length ; i++){};
2、foreach(GameObject obj in 數組名){};
三、復制出一個gameobject
void Duplicate() { GameObject selectobj = GameObject.Find("Cube"); GameObject clone = (GameObject)Instantiate(selectobj, selectobj.transform.position, selectobj.transform.rotation); i++; clone.name=clone.name+i; }
四、獲取gameobject
1.GameObject.Find()
通過場景里面的名子或者一個路徑直接獲取游戲對象。
GameObject root = GameObject.Find(“GameObject”);
我覺得如果游戲對象沒再最上層,那么最好使用路徑的方法,因為有可能你的游戲對象會有重名的情況,路徑用“/”符號隔開即可。
GameObject root = GameObject.Find(“GameObject/Cube”);
GameObject.Find()使用起來很方便,但是它有個缺陷如下圖所示,就是如果你的這個GameObject天生acive = false的話。那么你用GameObject.Find()是永遠也無法獲取它的對象的。如果對象都獲取不到,那么對象身上腳本啊 組件啊啥的都是獲取不到的,變成了沒有意義的對象。
2 .Transform.Find()
還記得上面我說過用GameObject無法獲取天生acive = false的游戲對象,如果你用Transform.Find()的話就可以很好的獲取,另外Unity還提供了一個Transform.FindChind()的方法,這個方法未來會被unity廢棄,大家最好就別用了,用Transform.Find()可以取代。
如下代碼,我們先獲取頂級對象root 。接着用Find()去找它的子節點”xxxx”的對象,無論”xxxx”對象是否active = true 都是可以直接找到對象的。
GameObject root = GameObject.Find("GameObject"); GameObject xxxx = root.transform.Find("xxxx").gameObject; xxxx.SetActive(true);
Find()方法只能直接去找子節點,如果你想找 孫節點,那么可以用”/“符號把層級關系隔開,找起來很方便。同樣無論”xxxx”對象是否active = true 都是可以直接找到對象的。
1
|
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 ,那么你將無法得到它的對象,更無法設置它的屬性了。
GameObject root = GameObject.Find(“GameObject”);
GameObject map = root.transform.Find(“map”).gameObject;
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(0)