今天学习了Animator组件对动画播放的控制。
1.在需要控制的物体下创建一个Animator组件,再创建一个Animator Controller拖到Controller下。
2.进入Controller对要播放的动画顺序进行编辑,在此暂时只有三个动作动画的切换,分别是站立、行走和跑。创建一个参数speed用来界定动画播放。物体默认站立状态,当物体运动速度大于0,切换为行走,大于1,从行走切换为跑。
player_speed = this.GetComponent<CharacterController>().velocity.magnitude;//获取人物运动速度
anima.SetFloat("speed", player_speed);
SetFloat方法接收两个参数,一个是animator中的参数名,另外一个是你要传递给它的参数。我的理解是方法把传递的参数作为它的实参套用到前者的约束中。
获取物体移动速度可以从CharacterController组件中获取,通过velocity,注意要用magnitude获取数值大小。
可以添加的参数有四种类型,可以按需求选择。
7/22
做控制人物攻击动画的时候先是使用了Bool类型的参数,true播放攻击动画,false返回原状态。
if (Input.GetKey(KeyCode.Q))//按下Q键触发动画播放
{
attack();
}
void attack()//攻击动画
{
anima.SetBool("attack", true);
}
animator中转换条件是attack为true转为攻击状态。
但是此处出现了一个bug(目前未解决),就是attack动画会反复播放,并不会返回原先的状态。改错思路尝试过计算attack动画长度,采用一个float类型的变量存储动画时长,timer-=Time.deltaTime timer<=0则设置attack为false,并没有如期运行。
随后学习了trigger变量,trigger变量在按下按键时变更为true,然后动画播放完自动返回false状态,于是攻击动画采用了trigger实现。
if (Input.GetKey(KeyCode.Q))
{
attack();
}
void attack()//攻击方法
{
anima.SetTrigger("attack");//SetTrigger只接受参数名,不用设置true or false
}
7/23
控制攻击动画播放还存在两个问题,一是动画会播放了一小段又从头开始播放,这个问题通过修改GetKey为GetKeyDonw后得到解决,但这引发第二问题,触发的动画循环播放,不返回原状态。是因为没有取消动画的Loop Time。
在动画设置界面将Loop Time取消即可解决。