[Unity] 以 Interface 介面搜尋場景上所有物件

2021.05.27 / Unity 引擎
有在 Unity 用過 Interface 介面的工程師們應該都知道 GetComponent<介面名稱>; 的用法,但卻沒辦法用 FindObjectsByType

有在 Unity 用過 Interface 介面的工程師們應該都知道 GetComponent<介面名稱>; 的用法,但卻沒辦法用 FindObjectsByType<介面名稱> 來找物件。

而在 2014 年的 Unity 論壇中有人提出的 How can I find all objects that have a script that implements a certain interface? 討論串中有人以 LINQ 實作出用介面找物件的功能。

但為了要能更方便使用,我將它重寫成擴充功能,但這個目前沒研究出來能直接在 MonoBehaviour 中使用的辦法,所以就先讓它依附在 GameObject 之下。

編寫邏輯

先新開一個腳本,儲存以下程式碼:

前往 GitHub 檢視此 Gist

簡單來說就是,因為我們不能直接搜尋 Interface,所以就往更上層的 MonoBehaviour 搜尋,再往下去找有指定介面的物件,感覺就超吃效能,慎用。

用法如下,它會回傳一個 List。

前往 GitHub 檢視此 Gist

使用範例

IReady 是我自己寫的介面,裡面有個 Ready() 函數。上面先以 iReady 儲存它用 FindInterfacesOfType 找出來的物件 List,再透過 foreach 呼叫 Ready()。

前往 GitHub 檢視此 Gist

切記,別把這個玩意兒塞在 Update 中讓它瘋狂執行,Find 與 LINQ 系列的程式碼都很吃效能的!

相關文章

Ted Liou

雲科碩士在讀中,專注於 Unity C#、TouchDesigner 技術,常把技術筆記分享到部落格,偶爾還直接挪用文章來當教材的研究生。