首先研究下动作的关系,idle默认动作,attack1一击,attack2二击,attack3三击;
idle--->attack1---idle;一击
idle-->attack1---attack2---idle;二连击
idle--attack1---attack2---attack3---idle;三连击
新建Animator Controller,把动画拖进去,接着按照上面的关系连线,如下图
设置一个Trigger类型参数isAttack来控制动画 的播放
idle---Trigger(参数)---attack1---默认空---idle;
idle---Trigger(参数)---attack1---Trigger(参数)---attack2---默认空---idle
idle---Trigger(参数)---attack1---Trigger(参数)---attack2---Trigger(参数)---attack3---默认空---idle
设置参数箭头所指位置,1箭头是动画切换的时间,2箭头是Trigger类型的参数,上面连线的参数
接下来编写代码控制:
- //控制动画状态机
- private Animator animator;
- //记录连击数
- public int count=0;
- private void Awake()
- {
- //获取组件
- animator = GetComponent<Animator>();
- }
- private void Update()
- {
- //按下空格键,执行攻击动画
- if (Input.GetKeyDown(KeyCode.Space))
- {
- //攻击动画的方法
- IsTriggerAttack();
- }
- }
- //攻击动画的方法
- public void IsTriggerAttack()
- {
- //GetCurrentAnimatorStateInfo(1)判断当前动画所在层,
- //IsName(),判断当前播放的动画
- //normalizedTime是当前动画的播放进度,大于1.0f表示播放完毕,0---1.0f之间是播放进度
- //判断当前动画是否是Idle,
- if (animator.GetCurrentAnimatorStateInfo(1).IsName("EmptyState") && animator.GetCurrentAnimatorStateInfo(1).normalizedTime > 1.0f)
- {
- //如果是idle动画,就播放attack1动画, 连击次数为1
- count = 1;
- animator.SetTrigger("isAttack");
- }else if (animator.GetCurrentAnimatorStateInfo(1).IsName("attack01") && animator.GetCurrentAnimatorStateInfo(1).normalizedTime > 0.7f&&count==1)
- {
- //如果是attack1动画,就播放attack2动画,连击次数为2
- count=2;
- animator.SetTrigger("isAttack");
- }
- else
- if (animator.GetCurrentAnimatorStateInfo(1).IsName("attack02") && animator.GetCurrentAnimatorStateInfo(1).normalizedTime > 0.7f&&count==2)
- {
- //如果是attack2动画,就播放attack3动画,连击次数为3
- count=3;
- animator.SetTrigger("isAttack");
- }else
- if (animator.GetCurrentAnimatorStateInfo(1).IsName("attack03") && animator.GetCurrentAnimatorStateInfo(1).normalizedTime > 0.7f && count == 3)
- {
- //如果是attack3动画,不做任何操作,连击次数为3
- count = 3;
- }
- }