跳到主要内容

Default Actions

重要 注意 提醒

Coding Style wiki


ActionSystem 内置 5 种默认动作 (皆继承 ActionBase),通过组合即可构建出各种运行组 (序列、并行、延迟、回调),并可互相嵌套组合 (序列包并行、并行包序列),最后交由 ActionRunner 启动运行。

命名空间OxGKit.ActionSystem
类型SequenceActionParallelActionParallelDelayActionDelayActionDelegateAction (皆继承 ActionBase)
源码SequenceAction.csParallelAction.csParallelDelayAction.csDelayAction.csDelegateAction.cs
using OxGKit.ActionSystem;

快速上手

using OxGKit.ActionSystem;
using UnityEngine;

// 并行组:同时执行,全部完成后结束
var parAction = new ParallelAction("Burst");
parAction
.AddAction(DelayAction.CreateDelayAction(1f, () => Debug.Log("Delay 1s done")))
.AddAction(DelayAction.CreateDelayAction(2f, () => Debug.Log("Delay 2s done")));

// 序列组:依序执行 (Step 1 -> 延迟 1 秒 -> Step 2 -> 并行组)
var seqAction = new SequenceAction("OpenFlow");
seqAction
.AddAction(DelegateAction.CreateDelegateAction(() => Debug.Log("Step 1")))
.AddAction(DelayAction.CreateDelayAction(1f))
.AddAction(DelegateAction.CreateDelegateAction(() => Debug.Log("Step 2")))
.AddAction(parAction);

// 通过 ActionRunner 启动 (由拥有者驱动 DriveUpdate)
this._runner.RunAction(seqAction);

通用规则

组合规则

  • 默认动作皆继承 ActionBase,可互相嵌套组合AddAction 皆可链式调用
  • 每种默认动作皆提供 ()(int uid)(string name)(string name, int uid) 四种构造函数,可自定义名称 (日志识别) 与 UID (供 RemoveAction 移除)。

注意 组合动作 (SequenceAction / ParallelAction / ParallelDelayAction) 内部以 SetDuration(-1) 运行,完成时机由子项动作决定 (全部完成才结束)。

动作总览

动作说明
SequenceAction序列动作,依序执行子项动作 (一次一个)。
ParallelAction并行动作,同时执行所有子项动作。
ParallelDelayAction交错并行动作,依延迟间隔依序启动子项动作后并行执行。
DelayAction延迟动作,延迟指定秒数后结束 (可附带结束回调)。
DelegateAction委托动作,启动时触发回调 (可附带延迟)。

SequenceAction

public class SequenceAction : ActionBase

序列动作:依加入顺序一次一个执行子项动作,前一个动作全部完成 (IsAllDone) 后才会启动下一个;所有子项动作完成后,序列动作即完成 (若启动时没有任何动作会直接标记完成)。

构造函数

public SequenceAction()

public SequenceAction(int uid)

public SequenceAction(string name)

public SequenceAction(string name, int uid)

方法总览

方法说明
AddAction加入动作 (启动前组合)。
QueueAction排队动作 (运行中追加)。
RemoveAction依 UID 移除动作。

AddAction

public SequenceAction AddAction(ActionBase action)

加入动作至准备清单 (同一实例不会重复加入),返回序列动作本身,可链式调用

注意 AddAction 需于序列动作启动前加入 (启动时会将准备清单转入待执行队列);若序列已在运行中要追加动作,请改用 QueueAction

var seqAction = new SequenceAction("OpenFlow");
seqAction
.AddAction(DelegateAction.CreateDelegateAction(() => Debug.Log("Step 1")))
.AddAction(DelayAction.CreateDelayAction(1f))
.AddAction(DelegateAction.CreateDelegateAction(() => Debug.Log("Step 2")));

this._runner.RunAction(seqAction);

QueueAction

public SequenceAction QueueAction(ActionBase action)

运行中排队追加动作 (可链式调用),于下一次更新时并入待执行队列,接续于现有动作之后依序执行。

RemoveAction

public void RemoveAction(int uid)

uid 从当前执行/待执行/排队队列中移除动作 (标记全部完成并输出移除日志)。


ParallelAction

public class ParallelAction : ActionBase

并行动作:启动时同时启动所有子项动作并平行更新,全部子项动作完成后即完成 (若启动时没有任何动作会直接标记完成)。

构造函数

public ParallelAction()

public ParallelAction(int uid)

public ParallelAction(string name)

public ParallelAction(string name, int uid)

AddAction

public ParallelAction AddAction(ActionBase action)

加入动作 (同一实例不会重复加入),返回并行动作本身,可链式调用;需于并行动作启动前加入。

var parAction = new ParallelAction("Burst");
parAction
.AddAction(DelayAction.CreateDelayAction(1f, () => Debug.Log("Delay 1s done")))
.AddAction(DelayAction.CreateDelayAction(2f, () => Debug.Log("Delay 2s done")));

this._runner.RunAction(parAction);

ParallelDelayAction

public class ParallelDelayAction : ActionBase

交错并行动作:与 ParallelAction 相似,但启动子项动作时会依 delayTime 间隔依序启动 (交错启动,内部使用 UniTask 延迟),之后并行更新,全部子项动作完成后即完成。

构造函数

public ParallelDelayAction()

public ParallelDelayAction(int uid)

public ParallelDelayAction(string name)

public ParallelDelayAction(string name, int uid)

public ParallelDelayAction(float delayTime)

delayTime 为每个子项动作之间的启动间隔秒数 (大于 0 才会进行交错延迟)。

AddAction

public ParallelDelayAction AddAction(ActionBase action)

加入动作 (同一实例不会重复加入),返回交错并行动作本身,可链式调用;需于动作启动前加入。

// 每隔 0.2 秒启动一个子项动作,之后并行执行
var staggerAction = new ParallelDelayAction(0.2f);
staggerAction
.AddAction(DelegateAction.CreateDelegateAction(() => Debug.Log("Spawn 1")))
.AddAction(DelegateAction.CreateDelegateAction(() => Debug.Log("Spawn 2")))
.AddAction(DelegateAction.CreateDelegateAction(() => Debug.Log("Spawn 3")));

this._runner.RunAction(staggerAction);

DelayAction

public class DelayAction : ActionBase

延迟动作:延迟 delayTime 秒后结束,结束时触发 onEndAction 回调 (可选,触发一次后清空)。

成员

成员说明
public float delayTime延迟秒数 (于 OnStart 作为持续时间设置)。
public Action onEndAction结束回调 (完成时触发一次后清空)。

构造函数

public DelayAction()

public DelayAction(int uid)

public DelayAction(string name)

public DelayAction(string name, int uid)

CreateDelayAction

public static DelayAction CreateDelayAction(float delayTime, Action onEndAction = null)

[Factory] 创建延迟动作,指定延迟秒数与结束回调。

// 延迟 1.5 秒后触发回调
var delayAction = DelayAction.CreateDelayAction(1.5f, () => Debug.Log("1.5s done"));

DelegateAction

public class DelegateAction : ActionBase

委托动作:启动时触发 onAction 回调 (触发一次后清空)。

成员

成员说明
public event Action onAction委托回调 (启动时触发一次后清空)。

构造函数

public DelegateAction()

public DelegateAction(int uid)

public DelegateAction(string name)

public DelegateAction(string name, int uid)

CreateDelegateAction

public static ActionBase CreateDelegateAction(Action onAction, float delayTime = 0f)

[Factory] 创建委托动作,并自动将 MarkAsDone 挂入回调链 (回调触发后即完成);当 delayTime 大于 0 时,会返回包装 DelayAction + DelegateAction 的 SequenceAction (先延迟再触发回调)。

注意 delayTime 大于 0 时返回的是 SequenceAction 包装 (静态类型为 ActionBase),请勿将返回值转换为 DelegateAction

提醒 建议通过 CreateDelegateAction 工厂方法创建;若自行 new DelegateAction() 并订阅 onAction,由于内部以 SetDuration(-1) 运行,必须自行于回调中调用 MarkAsDone() 结束动作。

// 立即触发回调
var callback = DelegateAction.CreateDelegateAction(() => Debug.Log("Hello"));

// 延迟 1 秒后触发回调 (返回 SequenceAction 包装)
var delayedCallback = DelegateAction.CreateDelegateAction(() => Debug.Log("Hello Delayed"), 1f);