Unity3d獲取遊戲對象的幾種方法

序列化變量後拖遊戲對象的方法就不說了,最簡單也是最麻煩的方法。html

1.GameObject.Find()

經過場景裏面的名子或者一個路徑直接獲取遊戲對象。 數組

GameObject root = GameObject.Find(「GameObject」);

我以爲若是遊戲對象沒再最上層,那麼最好使用路徑的方法,由於有可能你的遊戲對象會有重名的狀況,路徑用「/」符號隔開便可。編輯器

GameObject root = GameObject.Find(「GameObject/Cube」);

GameObject.Find()使用起來很方便,可是它有個缺陷以下圖所示,就是若是你的這個GameObject天生acive = false的話。那麼你用GameObject.Find()是永遠也沒法獲取它的對象的。若是對象都獲取不到,那麼對象身上腳本啊 組件啊啥的都是獲取不到的,變成了沒有意義的對象。 就這個問題我查過不少資料,最終也無果。。可是我用另一個巧妙的辦法能夠解決它。(後面詳解)或者你也能夠提早把全部的遊戲對象保存在內存中。工具

GameObject.Find()方法在遊戲中的使用頻率很高。可是它也很消耗性能,你能夠想一想它的原理確定也是用相似遞歸的形式來作的,那麼咱們就要儘可能更少的調用GameObject.Find()方法,能夠把獲取的遊戲對象,保存在內存裏,這是再好不過的選擇了。 尤爲是在Update方法中不要去 Find()遊戲對象!!性能

2 .Transform.Find()

還記得上面我說過用GameObject沒法獲取天生acive = false的遊戲對象,若是你用Transform.Find()的話就能夠很好的獲取,另外Unity還提供了一個Transform.FindChind()的方法,這個方法將來會被unity廢棄,你們最好就別用了,用Transform.Find()能夠取代。
以下代碼,咱們先獲取頂級對象root 。接着用Find()去找它的子節點」xxxx」的對象,不管」xxxx」對象是否active = true 都是能夠直接找到對象的。
       3d

GameObject root = GameObject.Find("GameObject");
GameObject xxxx =  root.transform.Find("xxxx").gameObject;
xxxx.SetActive(true);

Find()方法只能直接去找子節點,若是你想找 孫節點,那麼能夠用」/「符號把層級關係隔開,找起來很方便。一樣不管」xxxx」對象是否active = true 都是能夠直接找到對象的。code

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 ,那麼你將沒法獲得它的對象,更沒法設置它的屬性了。orm

GameObject root = GameObject.Find(「GameObject」);     
GameObject map =  root.transform.Find(「map」).gameObject;      
map.SetActive(true);**

3. GameObject.FindGameObjectsWithTag(「tag」)/GameObject.FindWithTag(「tag」)

根據一個標記來獲取遊戲對象,返回一個 或者 一個數組,我我的以爲這個兩個方法沒啥用,由於既然須要用到標記那麼相比這個遊戲對象必然是很是特殊的一個,因此我會把它存在內存中。
Object.FindObjectOfType
Object.FindObjectsOfType
Resources.FindObjectsOfTypeAll 
根據一個類型返回Object,好比 GameObject 、Texture、Animation 、甚至還能夠是你本身寫的一個腳本 的範型。它找起來很方便,能夠返回一個 或者一個數組。 我以爲這幾個方法其實遊戲中也沒啥用,不過在編輯器中使用的確實很頻繁,好比你要作批量檢查場景的工具,查找場景中有沒有使用某個特殊類型的對象。 或者查看內存的佔用量,看看當前內存中那些Texture沒有被釋放掉。 等等。
還有一個方法,若是你知道自對象的索引,還能夠用下面的方法來獲取,參數是index的索引。
transform.GetChild(0)htm

找到了一個即便隱藏root節點gameObject也能進行查找的方法。http://answers.unity3d.com/questions/52560/gameobjectfind-work-on-inactive-objects.html對象

相關文章
相關標籤/搜索