using Cielonos.MainGame.Characters; using Cielonos.MainGame.FunctionalAnimation; using Opsive.BehaviorDesigner.Runtime.Tasks; using Opsive.GraphDesigner.Runtime; using Opsive.GraphDesigner.Runtime.Variables; using Opsive.Shared.Utility; using SLSUtilities.FunctionalAnimation; using UnityEngine; namespace Cielonos.MainGame.Characters.AI { [Description("停止正在播放的功能动画(主要用于停止之前开始的循环功能动画),并在停止后有一帧的缓冲然后返回Success。")] [NodeIcon("Assets/Sprites/Icon/Pause.png")] [Category("Cielonos")] public class StopLoopFuncAnim : AutomataActionBase { private AnimationSubcontrollerBase animationSc => self.animationSc; private FunctionalAnimationSubmodule funcAnimSm; [Header("Animation Settings")] [Tooltip("是否选择其他功能动画子模块,默认子模块为全身动作子模块。")] public bool isOtherFuncAnimSm = false; [Tooltip("如果选择了其他功能动画子模块,则需要指定子模块名称。")] public string funcAnimSmName = ""; [Tooltip("要停止动画的打断类型。默认为 ForcedAction 表示强制打断。")] public DisruptionType disruptionType = DisruptionType.ForcedAction; private bool frameBuffer; public override void OnAwake() { base.OnAwake(); funcAnimSm = isOtherFuncAnimSm ? null : animationSc.fullBodyFuncAnimSm; } public override void OnStart() { if (funcAnimSm != null && funcAnimSm.currentRuntimeFuncAnim != null) { if (funcAnimSm.currentRuntimeFuncAnim.isLooping) { funcAnimSm.Stop(disruptionType); } } frameBuffer = false; } public override TaskStatus OnUpdate() { // 无论刚才是否停止,固定缓冲1帧再返回Success if (!frameBuffer) { frameBuffer = true; return TaskStatus.Running; } else { return TaskStatus.Success; } } } }