跳到主要内容

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

清空子动作队列。