分享

如何正确调教Unity BlendTree中的动画事件

 勤奋不止 2022-08-02 发布于北京

这是我在用Mecanim(Animator)做各种音频管理时发现的一个坑。

举个例子,比如说做脚步声的播放一般都会在每个Clip上挂动画事件,但是如果你的移动动画是用的BlendTree,这个脚步声的播放就会直接炸锅。无论你的动画有没有混合到走路的片段里,只要摁一下它就能给你直接播完所有脚步声。这个问题是AudioSource.Stop()也解决不了的。

其实这个问题在Forum上被提及过非常多,解决方案也是有的。

在Unity5.x之后的版本里,AnimationEvent类中添加了名为animationClipInfo的字段,animationClipInfo.weight能返回相应被挂载动画事件的动画当前被混合的权重程度。说白了就是这个动画事件在发出之后会自主判断它本属于的那个动画有没有被播放,没播就是0,播了就是1。

有了这个东西,我们就能更好地控制blendtree中的动画事件了。举个栗子,我在混合树中的walk动画上挂载了一个名叫PlayStep的动画事件,那么接受它的函数应该是这么写的:

void PlayStep(AnimationEvent aEvent)
{
  //权重的阈值完全可以按自己的喜好和项目需求来,不一定要0.5。
  if(aEvent.animationClipInfo.Weight>0.5f)
    audioSource.Play();
}

这样一来,混合树中的动画事件就再也不会乱套了。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多