跳至主要内容

ActionBase

重要 注意 提醒

Coding Style wiki


ActionBaseActionSystem 所有動作的抽象基類,自定義動作需繼承此類,並透過覆寫 OnStart / OnUpdate / OnDone 生命週期方法實作行為,以 SetDuration 控制持續時間 (設置 -1 表示依條件結束,需手動 MarkAsDone);另外內建子動作 (Sub Action) 機制,可在動作內組合子動作。

命名空間OxGKit.ActionSystem
類型public abstract class ActionBase
原始碼ActionBase.cs
using OxGKit.ActionSystem;

提醒 可透過 Right-Click Create/OxGKit/Action System/Template Action.cs 快速建立自定義 Action 腳本模板。

快速上手

計時型動作:於 OnStart 設置持續時間,時間到會自動標記完成 (觸發 OnDone),可搭配 GetTimeElapsedRatio 製作進度漸變效果。

using OxGKit.ActionSystem;
using UnityEngine;

public class FadeOutAction : ActionBase
{
#region Default Constructor
public FadeOutAction()
{
this.name = nameof(FadeOutAction);
}

public FadeOutAction(int uid) : this()
{
this.uid = uid;
}
#endregion

public CanvasGroup canvasGroup;
public float duration;

/// <summary>
/// [Factory Mode] 透過靜態方法建立動作實例
/// </summary>
public static FadeOutAction CreateFadeOutAction(CanvasGroup canvasGroup, float duration)
{
var action = new FadeOutAction();
action.canvasGroup = canvasGroup;
action.duration = duration;
return action;
}

protected override void OnStart()
{
// 設置持續時間 (時間到自動 MarkAsDone)
this.SetDuration(this.duration);
}

protected override void OnUpdate(float dt)
{
// 依經過時間比例 (0 到 1) 進行漸變
this.canvasGroup.alpha = 1f - this.GetTimeElapsedRatio();
}

protected override void OnDone()
{
this.canvasGroup.alpha = 0f;
}
}

條件型動作SetDuration(-1) 表示依條件結束,必須自行呼叫 MarkAsDone

using OxGKit.ActionSystem;

public class WaitForServerAction : ActionBase
{
public WaitForServerAction()
{
this.name = nameof(WaitForServerAction);
}

protected override void OnStart()
{
// -1 = 依條件結束,必須手動呼叫 MarkAsDone
this.SetDuration(-1);

// 條件達成時結束動作
Server.Request(ok => this.MarkAsDone());
}
}

通用規則

生命週期

  1. RunStart:先 Reset() 重置狀態 (旗標、經過時間、子動作),標記為已啟動後觸發 OnStart (於此設置 SetDuration 與初始邏輯)。
  2. RunUpdate(dt):由運行器每幀驅動,累計經過時間;未完成時,持續時間到會自動 MarkAsDone,否則觸發 OnUpdate,並同時更新子動作。
  3. MarkAsDone:觸發 OnDone (僅一次) 並標記完成;當動作本身完成且子動作全部完成時,才會標記全部完成 (IsAllDone),運行器以此判斷移除時機。

完成規則

重要 SetDuration(-1) 的動作永遠不會自動結束,必須保證 MarkAsDone() / MarkAllDone() 的呼叫路徑一定會觸發 (包含錯誤路徑)。

注意 動作為有狀態的一次性物件:重新運行 (RunStart) 會重置內部狀態,但請勿讓兩個運行器同時共用同一個動作實例


成員

成員說明
public int uid動作唯一識別碼,可供 RemoveAction(uid) 依 UID 移除。
public string name動作名稱 (預設類名),用於日誌輸出識別。

保護欄位 (供衍生類使用)

成員說明
protected bool _isStarted是否已啟動旗標。
protected bool _isDone動作本身完成旗標。
protected bool _isAllDone全部完成旗標 (含子動作)。
protected float _duration持續時間 (透過 SetDuration 設置)。
protected float _timeElapsed已累計的經過時間。
protected QueueSet<ActionBase> _queueSubActions子動作佇列 (QueueSet 為先進先出且不重複的佇列集合)。

生命週期覆寫

方法總覽

方法說明
OnStart動作啟動時觸發 (設置持續時間與初始邏輯)。
OnUpdate動作每幀更新時觸發 (完成後不再呼叫)。
OnDone呼叫 MarkAsDone 時觸發 (僅一次)。

OnStart

protected virtual void OnStart() { }

動作啟動時觸發 (由 RunStart 呼叫),通常於此設置 SetDuration 並執行初始邏輯。

OnUpdate

protected virtual void OnUpdate(float dt) { }

動作每幀更新時觸發 (由 RunUpdate 驅動);動作完成後不會再被呼叫。

OnDone

protected virtual void OnDone() { }

當呼叫 MarkAsDone 時觸發 (僅觸發一次),可用於結尾處理 (回調、狀態清理)。


運行控制

方法總覽

方法說明
RunStart啟動動作 (重置狀態並觸發 OnStart)。
RunUpdate更新動作 (含時間累計與子動作更新)。
Reset重置動作狀態 (含清空子動作)。

RunStart

public void RunStart()

啟動動作:先 Reset 重置狀態、標記為已啟動,再觸發 OnStart

提醒 通常由 ActionRunner 或組合動作 (SequenceAction 等) 呼叫,一般不需要自行呼叫。

RunUpdate

public void RunUpdate(float dt)

更新動作 (由運行器每幀驅動):累計經過時間,持續時間到會自動 MarkAsDone,否則觸發 OnUpdate;並同時更新子動作,當動作本身與子動作皆完成時標記全部完成。

Reset

public void Reset()

重置動作狀態 (啟動/完成旗標、經過時間) 並清空子動作。


狀態查詢

方法總覽

方法說明
IsStarted是否已啟動。
IsDone動作本身是否完成。
IsAllDone是否全部完成 (含子動作)。
GetTimeElapsed取得經過時間 (秒)。
GetTimeElapsedRatio取得經過時間比例 (0 到 1)。

IsStarted

public bool IsStarted()

動作是否已啟動 (RunStart 後為 true)。

IsDone

public bool IsDone()

動作本身是否完成 (不含子動作)。

IsAllDone

public bool IsAllDone()

動作是否全部完成 (含子動作);運行器以此判斷動作是否可移除。

GetTimeElapsed

public float GetTimeElapsed()

取得動作啟動後累計的經過時間 (秒)。

GetTimeElapsedRatio

public float GetTimeElapsedRatio()

取得經過時間比例 (0 到 1,依 SetDuration 設置的持續時間計算;duration 小於等於 0 時回傳 0),適合用於漸變 (Lerp) 等進度效果。


完成控制

方法總覽

方法說明
SetDuration設置持續時間 (-1 = 依條件手動結束)。
MarkAsDone標記動作完成 (觸發 OnDone)。
MarkAllDone標記全部完成 (含子動作)。
CheckAndReduceTime檢查持續時間是否已到 (protected)。

SetDuration

public void SetDuration(float duration)

設置動作持續時間 (秒),時間到會自動 MarkAsDone;設置 -1 表示依條件結束。

重要 SetDuration(-1) 的動作永遠不會自動結束,必須自行呼叫 MarkAsDone (請保證回調路徑一定會觸發,包含錯誤路徑)。

MarkAsDone

public void MarkAsDone()

標記動作完成:觸發 OnDone (僅一次);若子動作也全部完成,會一併標記全部完成 (IsAllDone)。

MarkAllDone

public void MarkAllDone()

標記動作全部完成 (含所有子動作);運行器移除動作 (RemoveAction) 時也會呼叫此方法。

CheckAndReduceTime

protected bool CheckAndReduceTime()

檢查持續時間是否已到 (duration-1 時恆回傳 false),由 RunUpdate 自動呼叫,一般不需要自行呼叫。


子動作 (Sub Action)

供衍生類於動作內組合子動作的保護方法,子動作由基類的 RunUpdate 自動更新;當動作本身完成且子動作全部完成時,才會標記全部完成。

方法總覽

方法說明
AddSubAction加入並啟動子動作。
IsSubActionAllDone檢查子動作是否全部完成。
UpdateSubActions更新所有子動作。
MarkSubAllDone標記所有子動作完成。
ClearSubActions清空子動作。

AddSubAction

protected ActionBase AddSubAction(ActionBase action)

加入子動作 (同一實例不會重複加入,加入時會直接觸發其 OnStart),回傳動作本身。

IsSubActionAllDone

protected bool IsSubActionAllDone()

檢查所有子動作是否全部完成 (無子動作時回傳 true)。

UpdateSubActions

protected void UpdateSubActions(float dt)

更新所有子動作 (由 RunUpdate 自動呼叫)。

MarkSubAllDone

protected void MarkSubAllDone()

標記所有子動作為全部完成 (由 MarkAllDone 自動呼叫)。

ClearSubActions

protected void ClearSubActions()

清空子動作佇列。