「这是我参与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面板上的监听的引用丢失,诸如此类的问题查了一遍,还是没有找到问题。
这我有点不明白了,记得以前就是这么用的啊,现在为什么就不好用了呢,就很奇怪。然而我并没有放弃,我将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不经常用,竟然被这么个小问题,消耗了我近一个小时的时间,真是懊悔,以此记录;也希望通过这篇博文能给遇到类似的问题的你,带来一些思路或者提示。