Wie nennt Unity in Unity auf magische Weise alle „Interfaces“?

Unity hat eine "Schnittstelle":

IPointerDownHandler ( doco)

Sie implementieren einfach OnPointerDown ...

public class Whoa:MonoBehaviour,IPointerDownHandler
    {
    public void OnPointerDown (PointerEventData data)
        { Debug.Log("whoa!"); }
    }

and Unity wird "magisch" das @ aufrufOnPointerDown in einem solchen MonoBehavior.

Sie müssen sie NICHT registrieren, kein Ereignis festlegen oder etwas anderes tun.

Alles, was Sie syntaktisch tun, ist das Hinzufügen von "IPointerDownHandler" und "public void OnPointerDown" zu einer Klasse, und Sie können diese Nachrichten auf magische Weise abrufen.

(Wenn du kein Unity-Entwickler bist - es funktioniert sogar, wenn du während des Spiels plötzlich einen im Editor hinzufügst!)

Wie zum Teufel machen sie das und wie kann ich das machen?

Also, ich möchte das machen:

public interface IGetNews
 {
 void SomeNews(string s);
 }

und dann kann ich hinzufügenSomeNews auf ein beliebiges MonoBehavior.

Die alternativen Lösungen liegen auf der Hand. Ich möchte genau wissen, wie Unity dieses "magische" Verhalten erreicht.

(Übrigens: Ich denke, sie hätten diese "Schnittstellen" nicht nennen sollen, da es im Grunde @ isnichts wie eine Schnittstelle - das Gegenteil ist der Fall! Man könnte sagen, sie haben auf magische Weise einen Weg gefunden, von mehr als einer abstrakten Klasse zu erben, denke ich.)

Beiseite

wenn Sie Unity noch nicht verwendet haben, können Sie auf herkömmliche Weise - da wir keinen Zugriff auf Unity Magic haben - Ihrem Daemon nur ein UnityEvent hinzufügen, das die betreffende Nachricht sendet:

public class BlahDaemon:MonoBehaviour
  {
  public UnityEvent onBlah;

    ...
    onBlah.Invoke();

Sagen Sie, Sie haben Klassen Aaa, Bbb, Ccc, die die Nachricht erhalten möchten. Verbinden Sie einfach das Unity-Ereignis (entweder durch Ziehen im Editor oder im Code), Beispiel:

public class Aaa:MonoBehaviour
  {
  void Awake()
    {
    BlahDaemon b = Object.FindObjectOfType<BlahDaemon>();
    b.onBlah.AddListener(OnBlah);
    }

  public void OnBlah()
    {
    Debug.Log("almost as good as Unity's");
    }
  }

Sie "registrieren" Ihren Anruf im Grunde inAwake, du bist in der Tat Huckepack auf die magische Einheit verwenden - was auch immer es ist. Aber ich möchte die Magie direkt nutzen.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage