Unity имеет "интерфейс", как он его называют IPointerDownHandler
(doco).
Вы просто реализуете OnPointerDown...
public class Whoa:MonoBehaviour,IPointerDownHandler
{
public void OnPointerDown (PointerEventData data)
{ Debug.Log("whoa!"); }
}
и Unity будет "магически" вызывать OnPointerDown
в любом таком MonoBehavior.
Вам не нужно регистрировать их, устанавливать событие или делать что-либо еще.
Все, что вы делаете, это добавить к классу "IPointerDownHandler" и "public void OnPointerDown", и вы можете получать эти сообщения в любое время волшебным образом.
(Если вы не Unity dev - он даже работает, если вы вдруг добавите его в Редактор во время игры!)
Как, черт возьми, они это делают?
Как я могу сделать это с расширением? Это больше похоже на абстрактный класс - как они это делают? Итак, я хочу сделать это:
public interface IGetNews
{
void SomeNews(string s);
}
а затем я могу добавить SomeNews
в любое MonoBehavior и, таким образом, "отправлять новости" этим элементам в любое время.
Я полностью знаком с различными альтернативными решениями. Я хочу знать, как они достигают этого "волшебного" поведения.
(BTW: Я чувствую, что Unity должен не вызывать эти интерфейсы, так как он в основном вообще не похож на интерфейс - это нечто противоположное!. скажем, они волшебным образом намеревались наследовать более чем один абстрактный класс, я думаю.)
Помимо
просто для ясности, если вы раньше не использовали Unity, обычный способ сделать это (т.е. поскольку у нас нет доступа к магии Unity) выглядит так: просто добавьте UnityEvent к вашему демону, который будет отправлять данное сообщение:
public class BlahDaemon:MonoBehaviour
{
public UnityEvent onBlah;
...
onBlah.Invoke();
Скажите, что у вас есть классы Aaa, Bbb, Ccc, которые хотят получить сообщение. Если вы новичок в UnityEvent, часто вы просто "перетаскиваете редактор" с Aaa, Bbb, Ccc на событие в BlahDaemon. Однако вы можете "зарегистрироваться" в коде:
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");
}
}
Это "почти так же хорошо", как использование внутренней магии Unity, хотя и более беспорядочно в коде. Поскольку вы "регистрируетесь", так сказать, в Awake
, вы действительно соглашаетесь с тем же магическим использованием Unity.