跳至主要内容

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