1

我迫切需要有人向我解释以下案例以及它是如何“在幕后”工作的。这将帮助我在更深层次上理解这个概念。

统一案例:

在 Unity3D 引擎中,如果我们想要检测对 UI 元素的点击,我们只需将其称为“IPointerClickHandler”的预制接口之一实现到我们的自定义类。

public void OnPointerClick(PointerEventData eventData)
{

  // Do whatever you want in here, when you detect click on UI element
}

脚本需要附加到每个单独的元素,但归根结底,它就像一个魅力。

我的情况:

这对我来说很有趣,因为我不确定 Unity 是如何知道我的类实现了它的一个接口并调用了适当的方法。

我想做一个类似的把戏,但我不知道怎么做。例如,我想通知所有实现“IScore”侦听器的类,该侦听器具有“OnScoreChanged(float newScore)”方法;

public float Score;

public interface IScore {

    void OnScoreChanged(float newScore);
}



public void SetScore(int newScore) {

    Score = newScore;
   //Notify all classes that implement IScore interface

   // .OnScoreChanged(newScore);
}``

我可能需要一个引用,所以我的想法是获取对实现“OnScoreChanged”的类的所有引用。上面的例子是正确的方法吗?我怎样才能让它发挥作用?基本上,我想在需要获得新分数通知的类中实现这个接口,并完全忘记如何调用这个方法。这样的事情可能吗?

    public class MyClassB: IScore {
        public void OnScoreChanged(float newScore)
        {
            // This just got called after score 
//changed..and without any additional implementation!
        }
    }

PS我知道我可以将委托与事件一起使用(然后从其他类订阅此事件),但我真的很好奇Unity如何只调用接口方法并保持代码更简洁(因此用户不订阅它的事件等)。

4

1 回答 1

1

自己实现这一点的一种方法是从单个基类派生所有类。这个基类将调用 VIRTUAL 函数OnWhatever()。[注意:您所有的自定义 Unity 组件类都派生自 Monobehavior。]

然后,当您创建派生类时,您可以简单地OnWhatever()使用特定于该组件的版本覆盖虚函数。


但是,如果您只想坚持使用接口:您现在可以使用GetComponents < T >orGetComponentsInChildren < T >并为要查找的类型指定一个接口GetCompoentsInChildren < T > ()通过调用所有场景的“根”对象上的函数,您可以在界面搜索中“更广泛”地进行搜索。

然后,您可以简单地调用/调用接口指定的OnWhatever()函数,以获得所有GetComponents < T >结果。

于 2018-12-25T19:51:48.717 回答