Unity 獲取遊戲物件詳解

2021-08-02 22:30:48 字數 3538 閱讀 3125

我覺得unity裡面的transform 和 gameobject就像兩個雙胞胎兄弟一樣,這倆哥們很要好,我能直接找到你,你也能直接找到我。我看很多人喜歡在類裡面去儲存gameobject物件。解決gameobject.find()無法獲取天生activie = false的問題。

private gameobject root ;

我覺得你最好不要儲存gameobject ,而是去儲存transform ,因為transform下的方法要比gameobject多,使用頻率也要高很多。

private transform root ;

其實我心裡一直有個疑問,為什麼unity不把gameobject和transform合併成乙個物件。

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()去找它的子節點」***x」的物件,無論」***x」物件是否active = true 都是可以直接找到物件的。

1

2

3

4

gameobject

root

=gameobject

.find

("gameobject");

gameobject

***x

=root

.transform

.find

("***x").

gameobject;

***x

.setactive

(true);

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

1

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);

3. unity 還提供了幾個獲取遊戲物件的方法,但是我個人覺得使用頻率不高,這裡也簡單說兩句。

gameobject.findgameobjectswithtag(「tag」)

gameobject.findwithtag(「tag」)

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

object.findobjectoftype

object.findobjectsoftype

resources.findobjectsoftypeall

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

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

transform.getchild(0)

unity獲取遊戲物件

recttransform tr this.getcomponent recttransform rect this.transform as recttransform 直接獲得物件身上的其它元件 類 button bb this.getcomponent panel center left bt...

unity獲取物件

unity提供了多種獲取某個物件的方法,1.gameobject.find name 2.gameobject.findgameobjectwithtag tag 3.gameobject.findwithtag tag find方法都是全場景尋找,算是unity裡最耗事的一種方法,通過tag尋找次...

Unity獲取未啟用遊戲物件的方法

一 獲取已啟用遊戲物件 1 gameobject.find 遊戲物件名 根據物件名直接獲取遊戲物件 這個方法可以找到指定的物件,但是一些缺陷。第一,如果場景中有重名,此方法找到的是hierarchy從上至下第一次出現此物件名的物件。第二,如果物件的activeself為false,那麼這個方法永遠無...