我正在尝试在 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
}
}
到目前为止没有问题,但我不确定如何设计它,所以特定类型的任何游戏对象都会订阅此事件。例如,如果您有一个工作人员类别 GO,即工作 8 到 6,并且您在运行时实例化它们;我应该订阅这个类别的主类,还是应该创建一个附加到游戏对象预制件的脚本来订阅该事件?
目标是所有应该在体育中心轮类 8 到 6 类的员工都知道“一天结束”事件何时启动,但我不想订阅我实例化的每个预制件.
根据我的理解,我应该在预制件上附加一个包含所需代码的脚本,但我找不到一个实际的例子来说明这是否真的是这样做的方法。
最佳答案
您必须使用 UnityEvent
。
public UnityEvent whoa;
这很容易。
制作脚本BigScript.cs
using UnityEngine;
using System.Collections;
using UnityEngine.Events;
public class BigScript:MonoBehaviour
{
[Header("Here's a cool event! Drag anything here!")]
public UnityEvent whoa;
}
将其放在游戏对象上。现在在检查器中查看它。
您将看到“哇”事件。
只需将您的其他脚本拖到那里,就可以在那些其他脚本上发生一些事情,当“哇”发生时。
就这么简单。要在 BigScript 中调用事件,只需
[Header("Here's a cool event! Drag anything here!")]
public UnityEvent whoa;
private void YourFunction()
{
whoa.Invoke();
}
在极少数情况下,您可能需要通过代码 添加监听器,而不是简单地将其拖动到编辑器中。这是微不足道的:
whoa.AddListener(ScreenMaybeChanged);
(通常您永远不必这样做。只需拖动即可连接。我只是为了完整性才提到这一点。)
仅此而已。
请注意互联网上有关此主题的过时示例代码。
上面显示了如何连接没有参数的简单函数。
如果你确实需要一个参数:
这是一个函数有一个 FLOAT 参数的例子:
只需在文件顶部添加此代码:
[System.Serializable] public class _UnityEventFloat:UnityEvent<float> {}
然后照常进行。就这么简单。
// ...
using UnityEngine.Events;
// add this magic line of code up top...
[System.Serializable] public class _UnityEventFloat:UnityEvent<float> {}
public class SomeThingHappens : MonoBehaviour
{
// now proceed as usual:
public _UnityEventFloat changedLength;
void ProcessValues(float v)
{
// ...
changedLength.Invoke(1.4455f);
}
}
当您从其他函数拖动到此函数的编辑器插槽时:
一定要使用“动态 float ”部分。
(令人困惑的是,您的函数也将在“静态参数”部分中列出!这是 Unity 中的一个大问题!)
关于c# - Unity中的简单事件系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36244660/