105 lines
3.0 KiB
C#

using CG.Framework;
using System;
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
/// <summary>
/// 控制动画控制器,的脚本控制器
/// </summary>
namespace ZXK.GYJQR
{
public class AnimatorEventCtr : ClassSingleton<AnimatorEventCtr>
{
/// <summary>
/// 根据 控制器,切换过度条件的时候,播放动画
/// </summary>
/// <param name="animName"></param>
/// <param name="mAnim"></param>
/// <param name="Index"></param>
/// <param name="beginAction"></param>
/// <param name="endAction"></param>
public void Play(string animName, Animator mAnim, int index, Action beginAction = null, Action endAction = null)
{
//获取组件
if (mAnim.GetComponent<CustomAnimEvents>())
{
animEvents = mAnim.GetComponent<CustomAnimEvents>();
}
else
{
mAnim.GetOrAddComponent<CustomAnimEvents>();
animEvents = mAnim.GetComponent<CustomAnimEvents>();
}
//生成新的 控制动画器
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);
}
/// <summary>
/// 可选择
/// 清除动画帧数脚本
/// 是否重置脚本内容与动画帧数
/// </summary>
/// <param name="animName"></param>
/// <param name="mAnim"></param>
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;
}
}