Unity 之 动画系统 -- AnimationEvent使用

「这是我参与11月更文挑战的第25天,活动详情查看:2021最后一次更文挑战

两种添加事件的方式

第一种是属性面板方式:需注意的是,以前的版本点击添加事件后都弹出注册事件的窗口,现在添加事件后注册事件的窗口被放在Inspector下,,,

第二种则是代码实现了:相对比而言,属性面板能更方便、准确的控制在什么时间出发注册的事件,都可传递0个或者1个参数,只是实现的形式不同,没有本质的区别

代码实现注册动画时间的参考代码如下:

public class AnimationEventDemo : MonoBehaviour
{

    Animation ani;    //声明Animation动画
    AnimationClip aniclip;     //声明aniclip动画剪辑

    void Start () {
        ani = GetComponent<Animation>();   //获取组件

        aniclip = ani.GetClip("walk");     //获取walk的动画剪辑,并赋值给aniclip

        //创建一个AnimationEvent 对象
        AnimationEvent anievent = new AnimationEvent();

        anievent.functionName = "Show";   //注册方法到事件

        anievent.time = aniclip.length * 0.9f;  //设置在动作中触发事件的时间

        anievent.intParameter = 5;        //传方法中相应的参数

        aniclip.AddEvent(anievent);       //将设置好的事件添加到动画

    }
	
    void Update () {
        if (Input.GetKeyDown(KeyCode.Q))
        {
            ani.Play("walk");  //播放walk动作
        }
    }

    public void Show(int i)
    {
        Debug.Log("调用注册方法show参数是:"+i);
    }
}
复制代码

一个报错

'GOName' AnimationEvent 'FunctionName' has no receiver! Are you missing a component?


报错原文:

报错原文

一般遇到这个问题我们的第一反应就是去查看方法名是否书写错误,或者代码中根本就不存在这个方法,

亦或是在Animation面板上的监听的引用丢失,诸如此类的问题查了一遍,还是没有找到问题。

Anim

这我有点不明白了,记得以前就是这么用的啊,现在为什么就不好用了呢,就很奇怪。然而我并没有放弃,我将Animation面板上的事件监听移除,再次运行则不会报错了。

可是这不是我解决问题的根本方法啊,我要的事件回调没有了啊,,,此时,我又使用代码形式做了这个事件的监听,部分代码如下:

 	AnimationClip PokerClip = PokerAnimation.GetClip(AniName);
        AnimationEvent AniEvt = new AnimationEvent();
        //【这个函数需与Animation组件挂载在同一个游戏体上】
        AniEvt.functionName = "OnPlayEndCallBack";
        //设置执行时间
        AniEvt.time = PokerClip.length - 0.28f;
        //注册事件
        PokerClip.AddEvent(AniEvt);
复制代码

到这里我的问题已经解决了,但是原因并不是通过代码添加好用,而在面板上的赋值不好用。原因是:用来监听做函数的脚本需与Animation组件挂载在同一个游戏体上,没错正是上面代码中注释的那句话,

由于Animation不经常用,竟然被这么个小问题,消耗了我近一个小时的时间,真是懊悔,以此记录;也希望通过这篇博文能给遇到类似的问题的你,带来一些思路或者提示。

Guess you like

Origin juejin.im/post/7034294383310536717