Unity4.5动画控制状态切换监听脚本

Mecanim动画由状态机控制的情况下,监听动画状态变化的代码。可以根据需要,删减其中的方法。

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class AnimStateMachine : MonoBehaviour {
#region 动画状态机字段
    public Animator _Animator;
    protected AnimatorStateInfo _curAnimState;
    protected AnimatorStateInfo _nextAnimState;
    protected int _animLayer;
    protected bool isInitial;
#endregion
    protected virtual void Awake()
    {
        #region 动画状态机初始化
        _Animator = GetComponent<Animator>();
        #endregion
    }
    public void Init(int Layer)
    {
        isInitial = true;
        _animLayer = Layer;
        _curAnimState = _Animator.GetCurrentAnimatorStateInfo(_animLayer);
        _nextAnimState = _Animator.GetNextAnimatorStateInfo(_animLayer);
    }
    protected virtual void Update()
    {
        if (_Animator == null)
            return;
        if (!isInitial)
            return;
#region 动画状态机判断
        _curAnimState = _Animator.GetCurrentAnimatorStateInfo(_animLayer);
        if (_Animator.IsInTransition(_animLayer))
        {
            if(_nextAnimState.nameHash==0)//刚进入transition状态
            {
                _nextAnimState = _Animator.GetNextAnimatorStateInfo(_animLayer);
                AnimationExit();
                TransitionEnter();
            }
            else//一直在transition状态
            {
                TransitionStay();
            }
        }
        else//不在transition中了
        {
            if (_nextAnimState.nameHash!=0)//刚出transition状态,也是刚进新动画的状态
            {
                _nextAnimState = _Animator.GetNextAnimatorStateInfo(_animLayer);
                TransitionExit();
                AnimationEnter();
            }
            else
            {
                AnimationStay();
            }
        }
#endregion
    }
    #region 动画状态机,内部逻辑
    protected  void TransitionEnter()
    {
        Debug.RedLog("TransitionEnter 变化进入");
        OnTransitionEnter();
    }
    protected  void TransitionStay()
    {
        //Debug.Log("TransitionStay");
        OnTransitionStay();
    }
    protected  void TransitionExit()
    {
        Debug.RedLog("TransitionExit 变化退出");
        OnTransitionExit();
    }
    protected  void AnimationEnter()
    {
        Debug.RedLog("AnimationEnter 动画进入");
        OnAnimationEnter();
    }
    protected  void AnimationStay()
    {
        //Debug.Log("AnimationStay");
        OnAnimationStay();
    }
    protected  void AnimationExit()
    {
        Debug.RedLog("AnimationExit 动画退出");
        OnAnimationExit();
    }
    #endregion
    #region 动画状态机,外部使用
    public virtual void OnTransitionEnter()
    {


    }
    public virtual void OnTransitionStay()
    {


    }
    public virtual void OnTransitionExit()
    {


    }
    public virtual void OnAnimationEnter()
    {


    }
    public virtual void OnAnimationStay()
    {


    }
    public virtual void OnAnimationExit()
    {
    }
    #endregion
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章