Unity3D RPG游戏Demo开发日记 [物体动画播放控制](二)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/moon_goes/article/details/96738855

今天学习了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取消即可解决。

猜你喜欢

转载自blog.csdn.net/moon_goes/article/details/96738855