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]);
}
}
}