如何在具有 Animator 的 GameObject 外部添加 AnimationEvent receiver/listener?
How can I add an AnimationEvent receiver/listener outside the GameObject that has the Animator?
我有一个带有 Animator 的游戏对象和一些可以触发事件的动画(具有特定的回调函数)。
只要我将脚本添加到与 Animator 相同的游戏对象,包括接收器,一切正常:
public class AnimatorEventReceiver : MonoBehaviour {
void OnAnimationEnd( AnimationEvent animationEvent ) {
// do something
}
}
(这是一个简化的例子,我去掉了不必要的东西)
我的问题是:我必须在包含 Animator 的 GameObject 之外侦听此事件。我可以完全访问 GameObject 本身,如何在外部添加一个“EventListener”来监听这个 AnimationEvent?
我正在寻找 Unity/C# 相当于 Javascript “object.addEventListener( 回调 )”
应该接收 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);
}
}
然后您可以在检查器或“知道”您反对的任何其他对象中添加回调,例如
public AnimatorEventReceiver eventReceiver;
private void Awake ()
{
eventReceiver.OnAnimationEnded.AddListener( HandleAnimationEnded);
}
private void OnDestroy()
{
eventReceiver.OnAnimationEnded.RemoveListener( HandleAnimationEnded);
}
private void HandleAnimationEnded(AnimationEvent animationEvent)
{
// Do something
}
我有一个带有 Animator 的游戏对象和一些可以触发事件的动画(具有特定的回调函数)。
只要我将脚本添加到与 Animator 相同的游戏对象,包括接收器,一切正常:
public class AnimatorEventReceiver : MonoBehaviour {
void OnAnimationEnd( AnimationEvent animationEvent ) {
// do something
}
}
(这是一个简化的例子,我去掉了不必要的东西)
我的问题是:我必须在包含 Animator 的 GameObject 之外侦听此事件。我可以完全访问 GameObject 本身,如何在外部添加一个“EventListener”来监听这个 AnimationEvent?
我正在寻找 Unity/C# 相当于 Javascript “object.addEventListener( 回调 )”
应该接收 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);
}
}
然后您可以在检查器或“知道”您反对的任何其他对象中添加回调,例如
public AnimatorEventReceiver eventReceiver;
private void Awake ()
{
eventReceiver.OnAnimationEnded.AddListener( HandleAnimationEnded);
}
private void OnDestroy()
{
eventReceiver.OnAnimationEnded.RemoveListener( HandleAnimationEnded);
}
private void HandleAnimationEnded(AnimationEvent animationEvent)
{
// Do something
}