我自己的情境是想要找到掛載某個Script腳本的GameObject
而Unity 其實本身提供了幾個方法可以找到關於是誰引用了物件,包含指令輸入以及透過程式碼搜尋
指令輸入
- 首先在你的Unity 專案畫面中,可以從Project 視圖中找到你想要搜尋的目標
- 找到之後對著目標點選右鍵,可以看到Find References In Scene (在場景中尋找引用)
點選之後,你就可以發現你的Scene視圖變成灰白兩色的顯示,而這時候在Hierarchy中可以看到下方的搜尋列顯示了
ref:你搜尋的檔案於專案資料匣的相對路徑
理論上這樣就能找到到底是誰在當下開啟的這個場景引用了這個腳本啦
搭配Console可以讓開發效率變得更好喔 >.^
程式碼搜尋
一般來說,使用程式碼搜尋,根據你要找的是GameObject 或是已被掛載的目標元件, 我們有數種方法可以使用
- 一種是GameObject.FindGameObjectWithTag,這樣的方法可以根據GamObject所設定的Tag直接把物件搜尋出來
- 以及GameObject.FindObjectOfType<T>(),根據元件的類別直接搜尋,如果是Script腳本就直接輸入對應名稱
- 最後一種是使用 gameObject.GetComponent,這種方法則要先理解子母物件的關係
GameObject.FindGameObjectWithTag
這種方法其實分為單一結果及全部符合的結果回傳,差別只在你呼叫的方法是FindGameObjectWithTag或是FindGameObjectsWithTag
如果你當初新增物件時候就有設定,就可以輕易的在程式碼中寫個存取修飾詞為public的GameObject以便在inspector視圖中觀察
如果沒有,一般來說只有MainCamera會預設有設定Tag
gameObject.GetComponent
在Hierarchy視圖中一般我們看到物件名稱旁邊有個像音樂播放器的Play鈕,就是代表他的身份為母物件,底下有與其對應的子物件存在
子物件除了會跟母物件形成一個新的本地座標系,也會共享一些元件屬性,甚至於等等我們要使用到的Tag在設定時候,一般設定在母物件時也會直接套用到子物件上
然後GetComponent的用法基本上就是
- GetComponent<目標型別>()
- 單一:GetComponentsInParent<目標型別>() ; 多數:GetComponentInParent<目標型別>()
- 單一:GetComponentsInChildren<目標型別>() ; 多數:GetComponentInChildren<目標型別>()
基本上根據需求,我們可以假設我們要找的東西可能在某個子物件/母物件底下,根據預設的情形我們把腳本掛載上GameObject,可以依照下面使用
那至於FindObjectOfType呢?其實就跟上面的用法一樣,只是不考慮子父繼承關係
感謝觀看,若你能夠留下一些建議與感想
都會成為我寫文章的動力,感謝!!