64 lines
2.2 KiB
C#
64 lines
2.2 KiB
C#
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;
|
||
}
|
||
}
|
||
}
|
||
}
|