Unity3d獲取遊戲物件的幾種方法

2021-07-28 12:27:34 字數 2420 閱讀 7933

序列化變數後拖遊戲物件的方法就不說了,最簡單也是最麻煩的方法。

通過場景裡面的名子或者乙個路徑直接獲取遊戲物件。

gameobject root = gameobject.find(「gameobject」);
我覺得如果遊戲物件沒再最上層,那麼最好使用路徑的方法,因為有可能你的遊戲物件會有重名的情況,路徑用「/」符號隔開即可。

gameobject root = gameobject.find(「gameobject/cube」);
gameobject.find()使用起來很方便,但是它有個缺陷如下圖所示,就是如果你的這個gameobject天生acive = false的話。那麼你用gameobject.find()是永遠也無法獲取它的物件的。如果物件都獲取不到,那麼物件身上指令碼啊 元件啊啥的都是獲取不到的,變成了沒有意義的物件。 就這個問題我查過很多資料,最終也無果。。但是我用另外乙個巧妙的辦法可以解決它。(後面詳解)或者你也可以提前把所有的遊戲物件儲存在記憶體中。

gameobject.find()方法在遊戲中的使用頻率很高。但是它也很消耗效能,你可以想想它的原理肯定也是用類似遞迴的形式來做的,那麼我們就要盡量更少的呼叫gameobject.find()方法,可以把獲取的遊戲物件,儲存在記憶體裡,這是再好不過的選擇了。 尤其是在update方法中不要去 find()遊戲物件!!

還記得上面我說過用gameobject無法獲取天生acive = false的遊戲物件,如果你用transform.find()的話就可以很好的獲取,另外unity還提供了乙個transform.findchind()的方法,這個方法未來會被unity廢棄,大家最好就別用了,用transform.find()可以取代。

如下**,我們先獲取頂級物件root 。接著用find()去找它的子節點」***x」的物件,無論」***x」物件是否active = true 都是可以直接找到物件的。

gameobject root = gameobject.find("gameobject");

gameobject ***x =  root.transform.find("***x").gameobject;

***x.setactive(true);

find()方法只能直接去找子節點,如果你想找 孫節點,那麼可以用」/「符號把層級關係隔開,找起來很方便。同樣無論」***x」物件是否active = true 都是可以直接找到物件的。

gameobject cube =  root.transform.find("***x/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);**

根據乙個標記來獲取遊戲物件,返回乙個 或者 乙個陣列,我個人覺得這個兩個方法沒啥用,因為既然需要用到標記那麼相比這個遊戲物件必然是非常特殊的乙個,所以我會把它存在記憶體中。

object.findobjectoftype

object.findobjectsoftype

resources.findobjectsoftypeall 

根據乙個型別返回object,比如 gameobject 、texture、animation 、甚至還可以是你自己寫的乙個指令碼 的范型。它找起來很方便,可以返回乙個 或者乙個陣列。 我覺得這幾個方法其實遊戲中也沒啥用,不過在編輯器中使用的確實很頻繁,比如你要做批量檢查場景的工具,查詢場景中有沒有使用某個特殊型別的物件。 或者檢視記憶體的佔用量,看看當前記憶體中那些texture沒有被釋放掉。 等等。

還有乙個方法,如果你知道自物件的索引,還可以用下面的方法來獲取,引數是index的索引。

transform.getchild(0)

Unity3d獲取遊戲物件的幾種方法

序列化變數後拖遊戲物件的方法就不說了,最簡單也是最麻煩的方法。通過場景裡面的名子或者乙個路徑直接獲取遊戲物件。gameobject root gameobject.find gameobject 我覺得如果遊戲物件沒再最上層,那麼最好使用路徑的方法,因為有可能你的遊戲物件會有重名的情況,路徑用 符號...

Unity3d獲取遊戲物件的幾種方法

序列化變數後拖遊戲物件的方法就不說了,最簡單也是最麻煩的方法。通過場景裡面的名子或者乙個路徑直接獲取遊戲物件。gameobject root gameobject.find gameobject 我覺得如果遊戲物件沒再最上層,那麼最好使用路徑的方法,因為有可能你的遊戲物件會有重名的情況,路徑用 符號...

Unity3D遊戲開發

入門級unity安裝教程 一 unity五大面板 unity3d的介紹 1 介面 選單 面板 元件 unity5.x 編輯器介紹 unity開啟篇 一 滑鼠右鍵 wsadeq前後左右上下移動 shift加速移動 滑鼠右鍵旋轉檢視 滑鼠中鍵移動檢視 alt 右鍵縮放 alt 左鍵旋轉物體視角 q移動場...