Files
Cielonos/Assets/Scripts/MainGame/Characters/Automata/AI/Actions/StopLoopFuncAnim.cs

64 lines
2.2 KiB
C#
Raw Normal View History

2026-03-20 12:07:44 -04:00
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;
}
}
}
}