跳到主要内容

延迟、重复和取消 GES 事件

TinyGiants
Unity Games & Tools Developer

用 RaiseDelayed 安排炸弹引信到期时触发爆炸,保存返回的 ScheduleHandle,拆除炸弹时就能取消这一次调度,同样可以用句柄管理中毒伤害等重复效果

启动引信并取消调度​

给 onExplode 赋一个无参数 GameEvent,把事件绑定到爆炸回调,放置炸弹时调用 Arm(),返回的 ScheduleHandle 对应这一次调度,玩家拆除炸弹或炸弹对象被禁用时,用该句柄取消

using TinyGiants.GES.Runtime;
using UnityEngine;

public class BombFuse : MonoBehaviour
{
[GameEventDropdown, SerializeField] private GameEvent onExplode;
[SerializeField] private float fuseSeconds = 2f;
private ScheduleHandle fuse;

public void Arm()
{
Defuse();
fuse = onExplode.RaiseDelayed(fuseSeconds);
fuse.OnCompleted += ClearFuse;
fuse.OnCancelled += ClearFuse;
}

public void Defuse()
{
var currentFuse = fuse;
fuse = null;
currentFuse?.Cancel();
}

private void ClearFuse() => fuse = null;
private void OnDisable() => Defuse();
}

进入 Play Mode 后启动引信并等待爆炸回调,再启动一次引信,这次在延迟结束前调用 Defuse(),确认只有第一轮执行了爆炸回调

让事件重复固定次数​

持续伤害可以用 RaiseRepeating,下例的 onPoisonTick 是已绑定伤害回调的无参数 GameEvent,第一次执行要等一个间隔,OnStep 收到的是已执行次数

ScheduleHandle poison = onPoisonTick.RaiseRepeating(1f, repeatCount: 3);
poison.OnStep += count => Debug.Log($"Applied poison tick {count}");
poison.OnCompleted += () => Debug.Log("Poison finished");
poison.OnCancelled += () => Debug.Log("Poison cancelled");

如果净化效果需要提前结束中毒,由中毒效果的管理对象保存句柄,持续到主动停止的调度使用 repeatCount: -1,在结束时调用 CancelDelayed(handle)、CancelRepeating(handle) 或句柄的 Cancel(),其中 Cancel() 返回 true 表示调度仍存在且已停止

在 Game Event Behavior 中配置时间​

当多处调用 Raise() 都采用同一套时间配置时,在 Schedule Configuration 中设置 Action Delay、Repeat Interval 和 Repeat Count,只设置延迟且间隔为零时执行一次,间隔大于零时按间隔重复,重复次数决定何时停止

Game Event Behavior 的时间字段

延迟和间隔均大于零时,首次执行要等延迟加一个间隔,直接调用 RaiseDelayed 或 RaiseRepeating 时,在代码中传入该次调度的时间

查看调度 API · 运行延迟事件 Demo