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