簡體   English   中英

C# 統一。 如果某個游戲對象中存在某個方法,則調用該方法

[英]C# Unity. Calling a method if it exists within a certain gameobject

我試過在網上四處尋找解決這個問題的方法,但我似乎找不到任何東西。 在我的游戲中,我有一個 Interactor(玩家)和一個 Interacted(目標對象)。 我試圖找到一種方法來檢查我選擇與之交互的 object 是否具有包含方法“交互”的 MonoBehaviour,如果是,則運行它。

這就是我的代碼現在的樣子,或者至少是重要的部分。 選擇交互時,OnInteract 運行良好。 foreach 循環也將正確返回所選變換中的每個 MonoBehaviour。 但是,我無法在獲得 MonoBehaviour 后運行方法,因為它尚未識別出該方法存在。 有沒有辦法讓我檢查該方法是否存在然后運行它,或者我應該完全采取不同的路線? 謝謝你。

因此,有一種聰明的方法可以做到這一點,也有一種愚蠢/蠻力的方法。

聰明的方法是給你打算與這樣的界面交互的所有 MonoBehaviours:

public interface IInteractable
{
    void Interacted();
}

然后在所有必需的 MonoBehaviours 中實現接口,這迫使您實現 Interacted 方法:

public class InteractableMonobehaviour12 : MonoBehaviour, IInteractable

然后您可以通過檢查來使用它:

if (interacted.TryGetComponent<IInteractable>(out IInteractable interactable))
    interactable.Interacted();

愚蠢的方法是完全按照您的要求執行並遍歷所有 Monobehaviours,然后在其中搜索方法 - 您可以使用 C# 反射來實現這一點,但在這種情況下,除非您無法控制您的類,否則絕對不需要想打電話給Interacted,所以我就不告訴你細節了。 如果您確實想深入研究, 此頁面上的第一個代碼示例查找類型方法並在沒有編譯時約束和檢查的情況下執行它。

如果您希望多個組件在一個 object 上實現 IInteractable,那么如果您獲得第一個匹配項,您可能想要迭代 MonoBehaviours,以防萬一有第二個匹配項(我不認為 GetComponents 在這里與接口一起使用,盡管可能已經改變)。 在這種情況下,您可以檢查 MonoBehaviour 是否實現了該接口:

if (component is IInteractable)
    ((IInteractable)component).Interacted();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM