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
}

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