ActionBase
Coding Style wiki
ActionBase 是 ActionSystem 所有動作的抽象基類,自定義動作需繼承此類,並透過覆寫 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());
}
}
通用規則
生命週期
- RunStart:先
Reset()重置狀態 (旗標、經過時間、子動作),標記為已啟動後觸發 OnStart (於此設置SetDuration與初始邏輯)。 - RunUpdate(dt):由運行器每幀驅動,累計經過時間;未完成時,持續時間到會自動 MarkAsDone,否則觸發 OnUpdate,並同時更新子動作。
- MarkAsDone:觸發 OnDone (僅一次) 並標記完成;當動作本身完成且子動作全部完成時,才會標記全部完成 (
IsAllDone),運行器以此判斷移除時機。
完成規則
重要 SetDuration(-1) 的動作永遠不會自動結束,必須保證 MarkAsDone() / MarkAllDone() 的呼叫路徑一定會觸發 (包含錯誤路徑)。
注意 動作為