美文网首页
Unity检查动画Animator状态

Unity检查动画Animator状态

作者: 远行_2a22 | 来源:发表于2019-03-30 19:59 被阅读0次

Unity射击游戏,在换弹动画中,因为想实现在换弹成功后,子弹数再更新,而且换弹过程中要禁用射击。因此必须知道当前的换弹动画是否结束。

方法1:AnimatorStateInfo

在脚本中添加代码

 //检查是否正在播放reload动画.
 AnimatorStateInfo stateinfo = anim.GetCurrentAnimatorStateInfo(1);   # 参数表示动画层的id
 bool play_ing_flag = stateinfo.IsName("handgun_combat_reload");

当处于状态handgun_combat_reload,则stateinfo.IsName返回true

注意

  • anim.GetCurrentAnimatorStateInfo(1)的形参表示的是动画层的id,经测试从上到下的层,id分别为0,1,2...。本代码中的动画状态handgun_combat_reload在层body_layer,因此这里参数为1
  • 代码中要自己切换状态,将装弹状态变为idle。否则,装弹动画在播放结束后,Animator仍然处于装弹状态,那么上述代码无法检测出什么时候装弹结束了。
    状态图如图所示:
    未命名1553946510.png

完整代码如下:

  // 装弹函数
 void ReloadEvent()
 {      
      // 更换弹药
            if (load_bullet_success == 0)  // 0 表示开始装弹,则播放装弹动画  
                anim.SetBool("reload_bullet", true);
            else   // 注意,不能判断if (load_bullet_success == -1)  ,因为当装弹中状态为1时,因为没有"reload_bullet" = false,永远无法播放完毕,始终停留在装弹动画
                anim.SetBool("reload_bullet", false);

            //检查是否正在播放reload动画.
            AnimatorStateInfo stateinfo = anim.GetCurrentAnimatorStateInfo(1);
            bool play_ing_flag = stateinfo.IsName("handgun_combat_reload");

            //检查是否正在播放reload动画.
            if (load_bullet_success == 0 && play_ing_flag)
                load_bullet_success = 1;  // 1表示装弹中

            //如果现在没有在装弹,且上次为装弹中, 表示装弹结束
            if (load_bullet_success == 1 && (!play_ing_flag))
                load_bullet_success = 2;   //表示装弹结束
}

方法2:继承StateMachineBehaviour

Animator的每个状态都可以挂载脚本,将脚本load_bullet.cs挂载在对应的状态上即可。代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class load_bullet : StateMachineBehaviour
{
    private GameObject player;


    override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        
        Debug.Log("------OnStateEnter------------");
    }

    // OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks
    //override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    //{
    //    
    //}

    // OnStateExit is called when a transition ends and the state machine finishes evaluating this state
    override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        Debug.Log("-------------OnStateExit-----------------");
    }

    // OnStateMove is called right after Animator.OnAnimatorMove()
    //override public void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    //{
    //    // Implement code that processes and affects root motion
    //}

    // OnStateIK is called right after Animator.OnAnimatorIK()
    //override public void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    //{
    //    // Implement code that sets up animation IK (inverse kinematics)
    //}
}




参考:

相关文章

  • Unity检查动画Animator状态

    Unity射击游戏,在换弹动画中,因为想实现在换弹成功后,子弹数再更新,而且换弹过程中要禁用射击。因此必须知道当前...

  • Unity3D 动画系统(Animation)

    现版本unity提供自带的两种动画状态机Animation和Animator用来控制场景中动画的运行,其实就是前面...

  • Finite-state Machine 有限状态机

    FSM 有限状态机和Unity的Animator类似,不过FSM除了动画还可以应用在如AI状态等。 FSM框架 S...

  • Unity基础(23)-动画系统

    Unity3D动画系统 分为旧版动画系统和新版动画(Mecanim)系统即Animation 与 Animator...

  • Mecanim动画系统

    Unity3D动画系统分为旧版动画系统和新版动画(Mecanim)系统即Animation 与 Animator ...

  • 认识Unity动画

    前言:在Unity中的动画有两种:Animation和Animator,而在工作中Animator更常使用,Ani...

  • 动画控制

    使用unity原生的animator的,直接使用最简化的animator,只把动画拖进去,通过代码控制切换 因为做...

  • Unity动画 Animator 状态机使用

    简介: 了解了 AnimatorController 和 Animation 后,我们就可以更深一步的来了解状态机...

  • 跟诸子学游戏 动画

    在unity3d中,有6种动画可以使用 animation animator TimeLine 自定义动画(如:定...

  • Unity高级动画(Animation)-动画状态机

    一、动态系统种类: Animation动画状态机:是旧版的动画状态机 Animator动画状态机:是新版的动画状态...

网友评论

      本文标题:Unity检查动画Animator状态

      本文链接:https://www.haomeiwen.com/subject/ctbsbqtx.html