跳至主要内容

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);