Default Actions
Coding Style wiki
ActionSystem 内置 5 种默认动作 (皆继承 ActionBase),通过组合即可构建出各种运行组 (序列、并行、延迟、回调),并可互相嵌套组合 (序列包并行、并行包序列),最后交由 ActionRunner 启动运行。
| 命名空间 | OxGKit.ActionSystem |
| 类型 | SequenceAction、ParallelAction、ParallelDelayAction、DelayAction、DelegateAction (皆继承 ActionBase) |
| 源码 | SequenceAction.cs、ParallelAction.cs、ParallelDelayAction.cs、DelayAction.cs、DelegateAction.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);