【发布时间】:2016-03-27 06:48:17
【问题描述】:
我正在尝试在 Unity 中使用事件系统(C# 方式),但我在实现它时遇到了问题。
大多数示例显示一个类,您可以在其中定义处理程序;然后您在同一个类中编写与处理程序签名匹配的函数,并将事件编写为静态
public class EventExample : MonoBehaviour
{
public delegate void ExampleEventHandler();
public static event ExampleEventHandler OneDayPassed;
public static void NextTurn()
{
// do stuff then send event
if (OneDayPassed != null)
OneDayPassed();
}
}
然后在另一个类中,您订阅事件,创建一个实际做某事的函数
public class EntityWatcher: MonoBehaviour
{
void Start()
{
EventExample.OneDayPassed += this.PrepareNextDay;
}
public void PrepareNextDay()
{
// Do other stuff that happen after the day is done
}
}
到目前为止没有问题,但我不确定如何设计它,因此任何特定类型的 GameObject 都会订阅此事件。例如,如果您有一个 GO 员工类别,即 8 到 6 点工作,并且您在运行时实例化它们;我应该订阅这个类别的主类,还是应该创建一个附加到游戏对象预制件的脚本来订阅事件?
目标是所有应该在体育中心进行 8 到 6 班轮班的工作人员都知道“一天结束”事件何时启动,但我不想订阅我实例化的每一个预制件.
根据我的理解,我应该在预制件上附加一个包含所需代码的脚本,但我找不到一个实际的例子来说明这是否真的是这样做的方法。
【问题讨论】:
-
嗨,Newb'z。这完全是完全错误的。这些天你只使用
UnityEvent。您不使用并且实际上不能使用十年前的“老式”事件。 -
所以最好依赖仅在 Unity 中使用的东西,而不是语言本身的一部分?
-
嗨@newbiez。是的,这绝对正确。
-
您应该明白,当您使用 Unity 时,您使用的是传统编程的极端扭曲。它不是 OO 系统,而是 ECS。考虑一下我最近提出的这个问题,stackoverflow.com/questions/36251078/… unity 有这些“接口”,实际上完全是乱码,与 c# 中的“接口”相反。
-
我不明白。我看过的其他地方都说原生 C# 事件优于 UnityEvent,即使在 stackoverflow.com/questions/44734580/… 上也是如此,然后这里有一个比较显示原生 C# 事件在这里更好:jacksondunstan.com/articles/3335 但奇怪的是这个问题和 cmets 以及所有答案现在都是说 UnityEvent 更好?我完全糊涂了。