Unity behavior state machine - animation controller AnimatorController implementation

Function: Behavior Controller Case

/// <summary>
/// 功能:行为控制器案例
/// </summary>
public class UseExample : MonoBehaviour
{
    Animator animator;
    AnimatorEventManager manager;

    private void Start()
    {
        //添加组件
        animator = GetComponentInChildren<Animator>();
        if(animator == null)    Debug.LogError("这个物体不存在动画控制器");
        if(manager == null)     manager = animator.gameObject.AddComponent<AnimatorEventManager>();
        //注册回调
        manager.RegisterAnimatorCallBack("OnIdleEnter",()=>OnIdleEnter());
        manager.RegisterAnimatorCallBack("OnIdleUpdate",()=>OnIdleUpdate());
    }

    void OnIdleEnter()
    {

    }

    void OnIdleUpdate()
    {

    }
}

Function: store and call registered callbacks, skip reflection

/// <summary>
/// 功能:存放和调用注册的回调,跳过反射
/// </summary>
public class AnimatorEventManager : MonoBehaviour
{
    //存储回调:通过一个字典来存储回调方法的名称和回调方法本身
    private Dictionary<string , Action> callBacks = new Dictionary<string, Action>();

    //注册回调:通过注册方法,将回调和回调名存入到字典中
    public void RegisterAnimatorCallBack(string name, Action callBack)
    {
        //try catch捕捉报错
        try
        {
            callBacks[name] = callBack;
        }
        catch(Exception e)
        {
            Debug.LogError("RegisterAnimatorCallBack"+"该名称:"+name+"已被注册");
            Debug.Log(e);
        }
    }

    //调用回调:通过方法名直接在字典中找到对应回调,进行调用。没找到回调则输出日志
    public void Invoke(string name)
    {
        if(callBacks.ContainsKey(name))
        {
            callBacks[name].Invoke();
        }
        else
        {
            Debug.LogError("Invoke"+"该名称回调:"+name+"未被注册");
        }
    }
}

Function: Behavioral response executed when entering the state

/// <summary>
/// 功能:进入状态时    执行的行为响应
/// </summary>
public class OnStateEnterCallBack : StateMachineBehaviour
{
    [SerializeField]  private string[] callBacksName = null;
    private AnimatorEventManager manager;

    /*
        当转换开始并且状态机开始计算这个状态时,OnStateEnter被调用
        (当进入到该脚本所挂载的状态时,该方法会被调用一次)
    */
    // OnStateEnter is called when a transition starts and the state machine starts to evaluate this state
    override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        //组件判空,先获取组件,未挂载组件时代码动态挂载
       if(manager == null)  manager = animator.transform.GetComponent<AnimatorEventManager>();
       if(manager == null)  manager = animator.gameObject.AddComponent<AnimatorEventManager>();

       for(int i = 0 ; i < callBacksName.Length ; i++)
       {
            manager.Invoke(callBacksName[i]);
       }
    }
}

Function: Behavior response that continues to execute while in state

/// <summary>
/// 功能:处于状态时    持续执行的行为响应
/// </summary>
public class OnStateUpdateCallBack : StateMachineBehaviour
{
    [SerializeField]  private string[] callBacksName = null;
    private AnimatorEventManager manager;

    public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        //组件判空,先获取组件,未挂载组件时代码动态挂载
       if(manager == null)  manager = animator.transform.GetComponent<AnimatorEventManager>();
       if(manager == null)  manager = animator.gameObject.AddComponent<AnimatorEventManager>();
    }

    /*
        在OnStateEnter和OnStateExit回调之间的每个更新帧上调用OnStateUpdate
        (当处于该脚本所挂载的状态时,每帧都会调用一次该方法)
    */
    // OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks
    override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        for(int i = 0 ; i < callBacksName.Length ; i++)
        {
            manager.Invoke(callBacksName[i]);
        }
    }
}

Function: When in the state, the behavior performed at intervals of fixed frames has a built-in timer compared to Update

/// <summary>
/// 功能:处于状态时    间隔固定帧执行的行为
/// 相比于Update多内置一个计时器
/// </summary>
public class OnYieldUpdateCallBack : StateMachineBehaviour
{
    [SerializeField]  private float waitTime;
    [SerializeField]  private string[] callBacksName = null;
    private float timer;
    private AnimatorEventManager manager;

    override public void OnStateEnter(Animator animator, AnimatorStateInfo animatorStateInfo, int layerIndex)
    {
        //组件判空,先获取组件,未挂载组件时代码动态挂载
       if(manager == null)  manager = animator.transform.GetComponent<AnimatorEventManager>();
       if(manager == null)  manager = animator.gameObject.AddComponent<AnimatorEventManager>();
    }

    /*
        在OnStateEnter和OnStateExit回调之间的每个更新帧上调用OnStateUpdate
        (当处于该脚本所挂载的状态时,每帧都会调用一次该方法)
    */
    // OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks
    override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        if(timer < waitTime)
        {
            timer += Time.deltaTime;
        }
        else
        {
            for(int i = 0 ; i < callBacksName.Length ; i++)
            {
                manager.Invoke(callBacksName[i]);
            }
            timer = 0;
        }
    }
}

Function: Behavior response performed when leaving the state

/// <summary>
/// 功能:离开状态时    执行的行为响应
/// </summary>
public class OnStateExitCallBack : StateMachineBehaviour
{
    [SerializeField]  private string[] callBacksName = null;
    private AnimatorEventManager manager;

    public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        //组件判空,先获取组件,未挂载组件时代码动态挂载
       if(manager == null)  manager = animator.transform.GetComponent<AnimatorEventManager>();
       if(manager == null)  manager = animator.gameObject.AddComponent<AnimatorEventManager>();
    }

    /*
        当转换结束且状态机完成此状态的计算时,将调用OnStateExit
        (当该脚本所挂载的状态转到其他状态时,该方法会被调用一次)
    */
    // 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)
    {
        for(int i = 0 ; i < callBacksName.Length ; i++)
        {
            manager.Invoke(callBacksName[i]);
        }
    }
}

Guess you like

Origin blog.csdn.net/weixin_51669718/article/details/128445826