c# - 如何在具有 Animator 的 GameObject 之外添加 AnimationEvent 接收器/侦听器?
问题描述
我有一个带有 Animator 的 GameObject 和一些可以触发事件的动画(带有特定的回调函数)。
只要我将脚本添加到与 Animator 相同的 GameObject 中,包括接收器,一切正常:
public class AnimatorEventReceiver : MonoBehaviour {
void OnAnimationEnd( AnimationEvent animationEvent ) {
// do something
}
}
(这是一个简化的例子,我去掉了任何不必要的东西)
我的问题是:我必须在包含 Animator 的 GameObject 之外监听这个事件。我可以完全访问 GameObject 本身,如何在外部添加“EventListener”来监听这个 AnimationEvent?
我正在寻找相当于 Javascript“object.addEventListener(callback)”的 Unity/C#
应该接收 AnimationEvent 的对象是包含 Animator 的 GameObject 的父级 - 如果有帮助的话。
解决方案
您不能直接,但您可以通过正常事件转发它,例如
public class AnimatorEventReceiver : MonoBehaviour
{
public event Action<AnimationEvent> OnAnimationEnded;
void OnAnimationEnd(AnimationEvent animationEvent)
{
AnimationEnded?.Invoke(animationEvent);
}
}
然后任何其他“知道”你反对的对象都可以做,例如
public AnimatorEventReceiver eventReceiver;
private void Awake ()
{
eventReceiver.OnAnimationEnded += HandleAnimationEnded;
}
private void OnDestroy()
{
eventReceiver.OnAnimationEnded += HandleAnimationEnded;
}
private void HandleAnimationEnded(AnimationEvent animationEvent)
{
// Do something
}
或者,您也可以使用 Unity 的内置功能,UnityEvent
这样您就可以在 Inspector 中设置回调(类似于 Button onClick)
// I know .. please come up with a better name :D
[Serializable]
public class AnimationEventEvent : UnityEvent<AnimationEvent> { }
public class AnimatorEventReceiver : MonoBehaviour
{
public AnimationEventEvent OnAnimationEnded;
void OnAnimationEnd(AnimationEvent animationEvent)
{
AnimationEnded.Invoke(animationEvent);
}
}
然后,您可以在 Inspector 或任何其他“知道”您的对象可以执行的对象中添加回调,例如
public AnimatorEventReceiver eventReceiver;
private void Awake ()
{
eventReceiver.OnAnimationEnded.AddListener( HandleAnimationEnded);
}
private void OnDestroy()
{
eventReceiver.OnAnimationEnded.RemoveListener( HandleAnimationEnded);
}
private void HandleAnimationEnded(AnimationEvent animationEvent)
{
// Do something
}
或者,您也可以使用 Unity 的内置功能,UnityEvent
这样您就可以在 Inspector 中设置回调(类似于 Button onClick)
推荐阅读
- python - 在 Python 中填充缺失值无法正常工作
- reactjs - 使用 React 验证手机号码 - 验证器库
- node.js - 标记 30 天后删除 s3 文件
- python - 与 BeautifulSoup 的刮擦不一致
- javascript - 滚动到 div,将其粘贴到中间,直到下一个 div 击中它,然后让它向上滚动
- apache-spark - Spark SQL - 为什么使用托管 Spark 表而不是 Hive 表?
- spss - 在 spss 中使用多重插补来插补缺失数据
- php - 使用单个查询从两个表更新 sql 表
- python - 如何使用多线程加速读写csv - python
- reactjs - 在reactjs中以编辑模式显示复选框的正确值