在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
}