using CG.Framework; using System; using System.Collections; using System.Collections.Generic; using Unity.VisualScripting; using UnityEngine; /// /// 控制动画控制器,的脚本控制器 /// namespace ZXK.GYJQR { public class AnimatorEventCtr : ClassSingleton { /// /// 根据 控制器,切换过度条件的时候,播放动画 /// /// /// /// /// /// public void Play(string animName, Animator mAnim, int index, Action beginAction = null, Action endAction = null) { //获取组件 if (mAnim.GetComponent()) { animEvents = mAnim.GetComponent(); } else { mAnim.GetOrAddComponent(); animEvents = mAnim.GetComponent(); } //生成新的 控制动画器 mController = new AnimatorOverrideController(); mController.runtimeAnimatorController = mAnim.runtimeAnimatorController; //给动画帧脚本的两个委托注册 animEvents.startCallBack = beginAction; animEvents.endCallBack = endAction; //设置动画帧数事件的内容 endEvt = new AnimationEvent(); endEvt.time = mController[animName].length; startEvt = new AnimationEvent(); startEvt.time = 0; //设置动画帧数名字 endEvt.functionName = "EndCallBack"; startEvt.functionName = "StartCallBack"; //给当前控制器的这个动画剪辑添加开始与结束帧数 AnimclipName = animName; mController[animName].events = default; mController[animName].AddEvent(endEvt); mController[animName].AddEvent(startEvt); //启动Animator if (!mAnim.enabled) mAnim.enabled = true; //切换过度条件。开始播放动画 mAnim.SetInteger("StepIndex", index); } /// /// 可选择 /// 清除动画帧数脚本 /// 是否重置脚本内容与动画帧数 /// /// /// public void RemoveAnimEvents(string animName, Animator mAnim) { mController = new AnimatorOverrideController(); mController.runtimeAnimatorController = mAnim.runtimeAnimatorController; mController[animName].events = default; //Destroy(mAnim.GetComponent(typeof(CustomAnimEvents))); } CustomAnimEvents animEvents; //控制动画器重写控制器的接口 //从而为给定化身定制动画。 在运行时基于相同的 AnimatorController 交换 Animator.runtimeAnimatorController 和 AnimatorOverrideController 不会重置状态机的当前状态 AnimatorOverrideController mController; //当前动画剪辑的名称 public string AnimclipName; ///动画事件帧 // 结束帧 public AnimationEvent endEvt; // 开始帧 public AnimationEvent startEvt; } }