首先先说一下unity中我已知的三种动画操作方式(分别是Animator Animation Override AnimatorOverrideController)
第一种:Animator
Animaor 是一种通过控制动画切换条件来达到动画之间的过度的
有以下四种条件控制 分别是一个float (小数) int(整数)bool(真或假) Trigger(触发)
里面还有一个子状态机的操作,相当于是导航的的层级可以进行比较复杂的动画控制
整数小数可以用来控制切换不同状态,boo一般用来控制两个动画之间的切换 ,Trigger可以用来处理受击动画等(就像触发开始的那个函数)
使用方法 获取到人物身上的Animator组件
animator.SetBool("动画名称", true);
animator.SetInteger("动画名称", 0);
animator.SetFloat("动画名称", 1.0f);
animator.SetTrigger("动画名称");
当然这个东西也是满足你要切换的条件后再去调用
第二种:Animation
1.这个东西一般都是成品不会我们来绘制,但是我们也是可以用它来录制一些简单的动画的,就像上面一样,每一个点对任务骨骼或者位移旋转的做出改变。
2.还可以选中一组场景中的图片用Ctrl+6来处理其成为帧动画
3.接下来就是对他的使用了,在人物身上添加Animation组件来控制AnimationClip进行操作
他的操作很简单一个方法 animation.Play();播放动画 animation.Stop();停止播放
这样就拖上去,就可以来通过名字找到动画然后播放了
第三种 :AnimatorOverrideController
这个东西吧,你看这个名字 Override 是不是很熟悉 ,没错就是覆盖,他是一个通过控制别的动画状态机来进行播放动画的,可以将他当成提线木偶中哪个提线的人,或者是代码中的管理类,
他可以这样来创建,也可以通过代码
AnimatorOverrideController aoc = new AnimatorOverrideController();
当然虽然他可以创建很多,但是不需要那么多,一个就够了
首先需要一个 AnimatorOverrideController 可以是代码创建的,也可以是资源中的
然后需要一个AnimatorController 来然他
接下来
public void SetAniation(AnimationClip clip)
{
RuntimeAnimatorController runtimeAnimator = Resources.Load<RuntimeAnimatorController>("anim");
overRideCtrl.runtimeAnimatorController = runtimeAnimator;
Animator animator = player.GetComponent<Animator>();
animator.runtimeAnimatorController = overRideCtrl;
overRideCtrl["idle0"] = clip;
animator.Play("idle0");
}
这个例子是用clip这个动画片段去替换了原动画控制器中的idle0这个动画,然后你再去播放idle0的时候,他播放的就是新的动画啦,当然,他也是可以和animator中的控制条件配合使用的,比如你之前动画状态机中拥有一个待机动画和跑步动画,他们之间用一个bool值来控制 你默认的是待机动画,之后你用overrideCtrl八两个动画都改变了,那么你的boo再去切换的话,就是两个新的动画之间的切换
最后是这次遇到的问题在使用Animation 和 动画覆盖器的时候,用到人物身上的动画,他出现了找不到动画的情况,《'player_1(Clone)' AnimationEvent has no function name specified!》由于动画上添加的帧事件,但是并没有绑定,导致他找不到该动画。解决方案有二 1.删除该动画上的所有关键帧 2.为该动画的关键帧进行一个绑定
那么好,这个问题解决后,还是不能显示,但是他不会给我们报错了可以去尝试改变一个这个地方
点击Debug,将Legacy这个属性勾选上
但是这个动画属性改掉以后,该动画不能拖到TimeLine中了
到这我这次的问题解决掉了。