API参考
GameEvent系统的完整API参考文档。所有事件类型都实现了严格的类型安全接口,具有用于事件驱动架构的全面功能。
所有类和接口都位于TinyGiants.GameEventSystem.Runtime命名空间中。
using TinyGiants.GameEventSystem.Runtime;
事件类型概述
GameEvent系统提供三种事件类型变体
| 类型 | 描述 |
|---|---|
GameEvent | 用于简单通知的无参数事件 |
GameEvent<T> | 用于传递类型化数据的单参数事件 |
GameEvent<TSender, TArgs> | 用于发送者感知通信的双参数事件 |
下面的所有方法都适用于这些类型,具有适当的参数变化。
🚀 事件触发与取消
Raise()
立即触发事件,按执行顺序调用所有注册的监听器。
执行顺序:基础 → 优先级 → 条件 → 持久化 → 触发器 → 链
- GameEvent
- GameEvent<T>
- GameEvent<TSender, TArgs>
void Raise();
示例:
myEvent.Raise();
void Raise(T argument);
参数:
| 名称 | 类型 | 描述 |
|---|---|---|
argument | T | 要传递给所有监听器的数据有效载荷 |
示例:
// 用float值触发
healthEvent.Raise(50.5f);
// 用自定义类型触发
scoreEvent.Raise(new ScoreData { points = 100, combo = 5 });
void Raise(TSender sender, TArgs args);
参数:
| 名称 | 类型 | 描述 |
|---|---|---|
sender | TSender | 触发事件的源对象 |
args | TArgs | 要传递给监听器的数据有效载荷 |
示例:
// 用GameObject sender和伤害数据触发
damageEvent.Raise(this.gameObject, new DamageInfo(10));
// 用player sender触发
playerEvent.Raise(playerInstance, new PlayerAction { type = "Jump" });
Cancel()
停止此事件资产的任何活动的Inspector配置的调度执行(延迟或重复)。
void Cancel();
示例:
// 停止在Inspector中配置的自动重复
myEvent.Cancel();
这仅取消由Inspector的"调度配置"启动的调度。它不会取消通过RaiseDelayed()或RaiseRepeating()创建的手动调度。对于这些,使用CancelDelayed(handle)或CancelRepeating(handle)。
⏱️ 基于时间的调度
RaiseDelayed()
调度事件在指定延迟后触发一次。
- GameEvent
- GameEvent<T>
- GameEvent<TSender, TArgs>
ScheduleHandle RaiseDelayed(float delay);
参数:
| 名称 | 类型 | 描述 |
|---|---|---|
delay | float | 触发事件前等待的时间(秒) |
返回值: ScheduleHandle - 用于取消的句柄
示例:
// 5秒后触发
ScheduleHandle handle = myEvent.RaiseDelayed(5f);
// 如果需要,取消
myEvent.CancelDelayed(handle);
ScheduleHandle RaiseDelayed(T argument, float delay);
参数:
| 名称 | 类型 | 描述 |
|---|---|---|
argument | T | 事件执行时要传递的数据 |
delay | float | 触发事件前等待的时间(秒) |
返回值: ScheduleHandle - 用于取消的句柄
示例:
// 3秒后生成敌人
ScheduleHandle handle = spawnEvent.RaiseDelayed(enemyType, 3f);
// 取消生成
spawnEvent.CancelDelayed(handle);
ScheduleHandle RaiseDelayed(TSender sender, TArgs args, float delay);
参数:
| 名称 | 类型 | 描述 |
|---|---|---|
sender | TSender | 事件执行时要传递的sender |
args | TArgs | 事件执行时要传递的数据 |
delay | float | 触发事件前等待的时间(秒) |
返回值: ScheduleHandle - 用于取消的句柄
示例:
// 延迟伤害应用
ScheduleHandle handle = damageEvent.RaiseDelayed(
attackerObject,
new DamageInfo(25),
2f
);
RaiseRepeating()
调度事件以固定间隔重复触发。
- GameEvent
- GameEvent<T>
- GameEvent<TSender, TArgs>
ScheduleHandle RaiseRepeating(float interval, int repeatCount = -1);
参数:
| 名称 | 类型 | 描述 |
|---|---|---|
interval | float | 每次执行之间的秒数 |
repeatCount | int | 重复次数。使用-1表示无限(默认:-1) |
返回值: ScheduleHandle - 用于取消的句柄
示例:
// 重复10次
ScheduleHandle handle = tickEvent.RaiseRepeating(1f, repeatCount: 10);
// 永远重复(无限循环)
ScheduleHandle infinite = pulseEvent.RaiseRepeating(0.5f);
// 停止无限循环
pulseEvent.CancelRepeating(infinite);
ScheduleHandle RaiseRepeating(T argument, float interval, int repeatCount = -1);
参数:
| 名称 | 类型 | 描述 |
|---|---|---|
argument | T | 每次执行时要传递的数据 |
interval | float | 每次执行之间的秒数 |
repeatCount | int | 重复次数。使用-1表示无限(默认:-1) |
返回值: ScheduleHandle - 用于取消的句柄
示例:
// 每秒造成伤害,5次
ScheduleHandle poison = damageEvent.RaiseRepeating(5, 1f, repeatCount: 5);
// 每30秒无限生成波次
ScheduleHandle waves = waveEvent.RaiseRepeating(waveData, 30f);
ScheduleHandle RaiseRepeating(TSender sender, TArgs args, float interval, int repeatCount = -1);
参数:
| 名称 | 类型 | 描述 |
|---|---|---|
sender | TSender | 每次执行时要传递的sender |
args | TArgs | 每次执行时要传递的数据 |
interval | float | 每次执行之间的秒数 |
repeatCount | int | 重复次数。使用-1表示无限(默认:-1) |
返回值: ScheduleHandle - 用于取消的句柄
示例:
// 每2秒再生生命值,10次
ScheduleHandle regen = healEvent.RaiseRepeating(
playerObject,
new HealInfo(5),
2f,
repeatCount: 10
);
CancelDelayed()
取消用RaiseDelayed()创建的特定延迟事件。
bool CancelDelayed(ScheduleHandle handle);
参数:
| 名称 | 类型 | 描述 |
|---|---|---|
handle | ScheduleHandle | RaiseDelayed()返回的句柄 |
返回值: bool - 如果成功取消则为true,如果已执行或无效则为false
示例:
ScheduleHandle handle = explosionEvent.RaiseDelayed(5f);
// 在爆炸发生前取消
if (explosionEvent.CancelDelayed(handle))
{
Debug.Log("爆炸已拆除!");
}
CancelRepeating()
取消用RaiseRepeating()创建的特定重复事件。
bool CancelRepeating(ScheduleHandle handle);
参数:
| 名称 | 类型 | 描述 |
|---|---|---|
handle | ScheduleHandle | RaiseRepeating()返回的句柄 |
返回值: bool - 如果成功取消则为true,如果已完成或无效则为false
示例:
ScheduleHandle handle = tickEvent.RaiseRepeating(1f);
// 停止重复
if (tickEvent.CancelRepeating(handle))
{
Debug.Log("计时器已停止!");
}
🎧 监听器管理
AddListener()
注册具有标准执行优先级的基础监听器。
- GameEvent
- GameEvent<T>
- GameEvent<TSender, TArgs>
void AddListener(UnityAction call);
参数:
| 名称 | 类型 | 描述 |
|---|---|---|
call | UnityAction | 无参数的回调方法 |
示例:
myEvent.AddListener(OnEventTriggered);
void OnEventTriggered()
{
Debug.Log("事件已触发!");
}
void AddListener(UnityAction<T> call);
参数:
| 名称 | 类型 | 描述 |
|---|---|---|
call | UnityAction<T> | 接收类型化参数的回调方法 |
示例:
scoreEvent.AddListener(OnScoreChanged);
void OnScoreChanged(int newScore)
{
Debug.Log($"分数:{newScore}");
}
void AddListener(UnityAction<TSender, TArgs> call);
参数:
| 名称 | 类型 | 描述 |
|---|---|---|
call | UnityAction<TSender, TArgs> | 接收sender和参数的回调 |
示例:
damageEvent.AddListener(OnDamageDealt);
void OnDamageDealt(GameObject attacker, DamageInfo info)
{
Debug.Log($"{attacker.name}造成了{info.amount}点伤害");
}
如果监听器已存在,它将被删除并重新添加以防止重复。
RemoveListener()
从事件中注销基础监听器。
- GameEvent
- GameEvent<T>
- GameEvent<TSender, TArgs>
void RemoveListener(UnityAction call);
参数:
| 名称 | 类型 | 描述 |
|---|---|---|
call | UnityAction | 无参数的回调方法 |
示例:
myEvent.RemoveListener(OnEventTriggered);
void RemoveListener(UnityAction<T> call);
参数:
| 名称 | 类型 | 描述 |
|---|---|---|
call | UnityAction<T> | 接收类型化参数的回调方法 |
示例:
scoreEvent.RemoveListener(OnScoreChanged);
void RemoveListener(UnityAction<TSender, TArgs> call);
参数:
| 名称 | 类型 | 描述 |
|---|---|---|
call | UnityAction<TSender, TArgs> | 接收sender和参数的回调 |
示例:
damageEvent.RemoveListener(OnDamageDealt);
RemoveAllListeners()
从事件中清除所有基础、优先级和条件监听器。
void RemoveAllListeners();
示例:
// 清理所有监听器
myEvent.RemoveAllListeners();
出于安全原因,不会删除持久化监听器或触发器/链事件。
AddPriorityListener()
注册具有显式执行优先级的监听器。更高的优先级值先执行。
- GameEvent
- GameEvent<T>
- GameEvent<TSender, TArgs>
void AddPriorityListener(UnityAction call, int priority);
参数:
| 名称 | 类型 | 描述 |
|---|---|---|
call | UnityAction | 回调方法 |
priority | int | 执行优先级(越高 = 越早,默认:0) |
示例:
myEvent.AddPriorityListener(CriticalHandler, 100);
myEvent.AddPriorityListener(NormalHandler, 50);
myEvent.AddPriorityListener(LowPriorityHandler, 10);
// 执行顺序:CriticalHandler → NormalHandler → LowPriorityHandler
void AddPriorityListener(UnityAction<T> call, int priority);
参数:
| 名称 | 类型 | 描述 |
|---|---|---|
call | UnityAction<T> | 回调方法 |
priority | int | 执行优先级(越高 = 越早,默认:0) |
示例:
healthEvent.AddPriorityListener(UpdateUI, 100);
healthEvent.AddPriorityListener(PlaySound, 50);
void AddPriorityListener(UnityAction<TSender, TArgs> call, int priority);
参数:
| 名称 | 类型 | 描述 |
|---|---|---|
call | UnityAction<TSender, TArgs> | 回调方法 |
priority | int | 执行优先级(越高 = 越早,默认:0) |
示例:
attackEvent.AddPriorityListener(ProcessCombat, 100);
attackEvent.AddPriorityListener(ShowVFX, 50);
RemovePriorityListener()
注销优先级监听器。
- GameEvent
- GameEvent<T>
- GameEvent<TSender, TArgs>
void RemovePriorityListener(UnityAction call);
参数:
| 名称 | 类型 | 描述 |
|---|---|---|
call | UnityAction | 无参数的回调方法 |
示例:
myEvent.RemovePriorityListener(OnEventTriggered);
void RemovePriorityListener(UnityAction<T> call);
参数:
| 名称 | 类型 | 描述 |
|---|---|---|
call | UnityAction<T> | 接收类型化参数的回调方法 |
示例:
scoreEvent.RemovePriorityListener(OnScoreChanged);
void RemovePriorityListener(UnityAction<TSender, TArgs> call);
参数:
| 名称 | 类型 | 描述 |
|---|---|---|
call | UnityAction<TSender, TArgs> | 接收sender和参数的回调 |
示例:
damageEvent.RemovePriorityListener(OnDamageDealt);
AddConditionalListener()
注册仅在条件评估为true时执行的监听器。
- GameEvent
- GameEvent<T>
- GameEvent<TSender, TArgs>
void AddConditionalListener(UnityAction call, Func<bool> condition, int priority = 0);
参数:
| 名称 | 类型 | 描述 |
|---|---|---|
call | UnityAction | 回调方法 |
condition | Func<bool> | 谓词函数(null = 始终执行) |
priority | int | 执行优先级(默认:0) |
示例:
myEvent.AddConditionalListener(
OnHealthLow,
() => playerHealth < 20,
priority: 10
);
void AddConditionalListener(UnityAction<T> call, Func<T, bool> condition, int priority = 0);
参数:
| 名称 | 类型 | 描述 |
|---|---|---|
call | UnityAction<T> | 回调方法 |
condition | Func<T, bool> | 接收参数的谓词 |
priority | int | 执行优先级(默认:0) |
示例:
scoreEvent.AddConditionalListener(
OnHighScore,
score => score > 1000,
priority: 5
);
void AddConditionalListener(
UnityAction<TSender, TArgs> call,
Func<TSender, TArgs, bool> condition,
int priority = 0
);
参数:
| 名称 | 类型 | 描述 |
|---|---|---|
call | UnityAction<TSender, TArgs> | 回调方法 |
condition | Func<TSender, TArgs, bool> | 接收sender和参数的谓词 |
priority | int | 执行优先级(默认:0) |
示例:
damageEvent.AddConditionalListener(
OnCriticalHit,
(attacker, info) => info.isCritical,
priority: 10
);
RemoveConditionalListener()
注销条件监听器。
- GameEvent
- GameEvent<T>
- GameEvent<TSender, TArgs>
void RemoveConditionalListener(UnityAction call);
参数:
| 名称 | 类型 | 描述 |
|---|---|---|
call | UnityAction | 无参数的回调方法 |
示例:
myEvent.RemoveConditionalListener(OnEventTriggered);
void RemoveConditionalListener(UnityAction<T> call);
参数:
| 名称 | 类型 | 描述 |
|---|---|---|
call | UnityAction<T> | 接收类型化参数的回调方法 |
示例:
scoreEvent.RemoveConditionalListener(OnScoreChanged);
void RemoveConditionalListener(UnityAction<TSender, TArgs> call);
参数:
| 名称 | 类型 | 描述 |
|---|---|---|
call | UnityAction<TSender, TArgs> | 接收sender和参数的回调 |
示例:
damageEvent.RemoveConditionalListener(OnDamageDealt);
AddPersistentListener()
注册在场景更改后存活的全局监听器(DontDestroyOnLoad)。
- GameEvent
- GameEvent<T>
- GameEvent<TSender, TArgs>
void AddPersistentListener(UnityAction call, int priority = 0);
参数:
| 名称 | 类型 | 描述 |
|---|---|---|
call | UnityAction | 回调方法 |
priority | int | 执行优先级(默认:0) |
示例:
globalEvent.AddPersistentListener(OnGlobalAction, priority: 100);
void AddPersistentListener(UnityAction<T> call, int priority = 0);
参数:
| 名称 | 类型 | 描述 |
|---|---|---|
call | UnityAction<T> | 回调方法 |
priority | int | 执行优先级(默认:0) |
void AddPersistentListener(UnityAction<TSender, TArgs> call, int priority = 0);
参数:
| 名称 | 类型 | 描述 |
|---|---|---|
call | UnityAction<TSender, TArgs> | 回调方法 |
priority | int | 执行优先级(默认:0) |
持久化监听器在场景加载间保持活动。用于全局系统,如保存管理或分析。
RemovePersistentListener()
注销持久化监听器。
- GameEvent
- GameEvent<T>
- GameEvent<TSender, TArgs>
void RemovePersistentListener(UnityAction call);
参数:
| 名称 | 类型 | 描述 |
|---|---|---|
call | UnityAction | 无参数的回调方法 |
示例:
myEvent.RemovePersistentListener(OnEventTriggered);
void RemovePersistentListener(UnityAction<T> call);
参数:
| 名称 | 类型 | 描述 |
|---|---|---|
call | UnityAction<T> | 接收类型化参数的回调方法 |
示例:
scoreEvent.RemovePersistentListener(OnScoreChanged);
void RemovePersistentListener(UnityAction<TSender, TArgs> call);
参数:
| 名称 | 类型 | 描述 |
|---|---|---|
call | UnityAction<TSender, TArgs> | 接收sender和参数的回调 |
示例:
damageEvent.RemovePersistentListener(OnDamageDealt);
⚡ 触发器事件(扇出模式)
AddTriggerEvent()
注册在触发此事件时自动触发的目标事件。
- GameEvent
- GameEvent<T>
- GameEvent<TSender, TArgs>
TriggerHandle AddTriggerEvent(
GameEventBase targetEvent,
float delay = 0f,
Func<bool> condition = null,
int priority = 0
);
参数:
| 名称 | 类型 | 描述 |
|---|---|---|
targetEvent | GameEventBase | 要触发的事件 |
delay | float | 可选延迟(秒)(默认:0) |
condition | Func<bool> | 可选谓词来控制执行 |
priority | int | 相对于其他触发器的执行顺序(默认:0) |
返回值: TriggerHandle - 用于安全移除的唯一标识符
示例:
// 简单触发器:门打开 → 灯打开
doorOpenEvent.AddTriggerEvent(lightOnEvent);
// 延迟触发器:2秒后爆炸
fuseEvent.AddTriggerEvent(explosionEvent, delay: 2f);
// 条件触发器
doorOpenEvent.AddTriggerEvent(
alarmEvent,
condition: () => isNightTime
);
// 优先级排序的触发器
bossDefeatedEvent.AddTriggerEvent(stopMusicEvent, priority: 100);
bossDefeatedEvent.AddTriggerEvent(victoryMusicEvent, priority: 90);
bossDefeatedEvent.AddTriggerEvent(showRewardsEvent, priority: 50);
TriggerHandle AddTriggerEvent(
GameEventBase targetEvent,
float delay = 0f,
Func<T, bool> condition = null,
bool passArgument = true,
Func<T, object> argumentTransformer = null,
int priority = 0
);
参数:
| 名称 | 类型 | 描述 |
|---|---|---|
targetEvent | GameEventBase | 要触发的事件 |
delay | float | 可选延迟(秒)(默认:0) |
condition | Func<T, bool> | 接收参数的可选谓词 |
passArgument | bool | 是否将数据传递给目标(默认:true) |
argumentTransformer | Func<T, object> | 可选的数据转换函数 |
priority | int | 执行优先级(默认:0) |
返回值: TriggerHandle - 用于安全移除的唯一标识符
示例:
// 直接传递参数
public Int32GameEvent scoreEvent;
public Int32GameEvent updateUIEvent;
scoreEvent.AddTriggerEvent(updateUIEvent, passArgument: true);
// 转换参数:int → string
public Int32GameEvent scoreEvent;
StringGameEvent notificationEvent;
scoreEvent.AddTriggerEvent(
notificationEvent,
passArgument: true,
argumentTransformer: score => $"分数:{score}"
);
// 带参数检查的条件
SingleGameEvent healthEvent;
GameEvent lowHealthWarningEvent;
healthEvent.AddTriggerEvent(
lowHealthWarningEvent,
condition: health => health < 20f,
passArgument: false
);
TriggerHandle AddTriggerEvent(
GameEventBase targetEvent,
float delay = 0f,
Func<TSender, TArgs, bool> condition = null,
bool passArgument = true,
Func<TSender, TArgs, object> argumentTransformer = null,
int priority = 0
);
参数:
| 名称 | 类型 | 描述 |
|---|---|---|
targetEvent | GameEventBase | 要触发的事件 |
delay | float | 可选延迟(秒)(默认:0) |
condition | Func<TSender, TArgs, bool> | 接收sender和args的可选谓词 |
passArgument | bool | 是否将数据传递给目标(默认:true) |
argumentTransformer | Func<TSender, TArgs, object> | 可选转换函数 |
priority | int | 执行优先级(默认:0) |
返回值: TriggerHandle - 用于安全移除的唯一标识符
示例:
// 将sender和args传递给另一个sender事件
GameObjectDamageInfoGameEvent damageEvent;
GameObjectDamageInfoGameEvent logEvent;
damageEvent.AddTriggerEvent(logEvent, passArgument: true);
// 转换:仅提取伤害值
GameObjectDamageInfoGameEvent damageEvent;
public Int32GameEvent damageNumberEvent;
damageEvent.AddTriggerEvent(
damageNumberEvent,
passArgument: true,
argumentTransformer: (sender, info) => info.amount
);
// 基于sender和args的条件
GameObjectDamageInfoGameEvent damageEvent;
GameEvent criticalHitEvent;
damageEvent.AddTriggerEvent(
criticalHitEvent,
condition: (sender, info) =>
info.isCritical && sender.CompareTag("Player"),
passArgument: false
);
触发器并行执行 - 每个触发器都是独立的。如果一个触发器的条件失败或抛出异常,其他触发器仍然执行。
RemoveTriggerEvent()(按句柄)
使用其唯一句柄安全地移除特定触发器。
void RemoveTriggerEvent(TriggerHandle handle);
参数:
| 名称 | 类型 | 描述 |
|---|---|---|
handle | TriggerHandle | AddTriggerEvent()返回的句柄 |
示例:
TriggerHandle handle = doorEvent.AddTriggerEvent(lightEvent);
// 移除特定触发器
doorEvent.RemoveTriggerEvent(handle);
这是最安全的移除方法,因为它只移除您的特定触发器实例。
RemoveTriggerEvent()(按目标)
移除指向特定目标事件的所有触发器。
void RemoveTriggerEvent(GameEventBase targetEvent);
参数:
| 名称 | 类型 | 描述 |
|---|---|---|
targetEvent | GameEventBase | 要断开连接的目标事件 |
示例:
doorEvent.RemoveTriggerEvent(lightEvent);
这会移除指向此事件的所有触发器,包括其他系统注册的触发器。使用RemoveTriggerEvent(handle)以获得精确性。
RemoveAllTriggerEvents()
从此事件中移除所有触发器事件。
void RemoveAllTriggerEvents();
示例:
myEvent.RemoveAllTriggerEvents();
🔗 链事件(顺序模式)
AddChainEvent()
注册在链中顺序执行的目标事件。
- GameEvent
- GameEvent<T>
- GameEvent<TSender, TArgs>
ChainHandle AddChainEvent(
GameEventBase targetEvent,
float delay = 0f,
float duration = 0f,
Func<bool> condition = null,
bool waitForCompletion = false
);
参数:
| 名称 | 类型 | 描述 |
|---|---|---|
targetEvent | GameEventBase | 要在链中执行的事件 |
delay | float | 执行此节点前的延迟(默认:0) |
duration | float | 执行此节点后的延迟(默认:0) |
condition | Func<bool> | 可选谓词 - 如果为false则链中断 |
waitForCompletion | bool | 执行后等待一帧(默认:false) |
返回值: ChainHandle - 用于安全移除的唯一标识符
示例:
// 简单序列:A → B → C
eventA.AddChainEvent(eventB);
eventB.AddChainEvent(eventC);
// 带延迟的过场动画
fadeOutEvent.AddChainEvent(loadSceneEvent, delay: 1f);
loadSceneEvent.AddChainEvent(fadeInEvent, delay: 0.5f);
// 条件链:仅在满足条件时继续
combatEndEvent.AddChainEvent(
victoryEvent,
condition: () => playerHealth > 0
);
// 带异步操作帧等待的链
showDialogEvent.AddChainEvent(
typeTextEvent,
waitForCompletion: true
);
ChainHandle AddChainEvent(
GameEventBase targetEvent,
float delay = 0f,
float duration = 0f,
Func<T, bool> condition = null,
bool passArgument = true,
Func<T, object> argumentTransformer = null,
bool waitForCompletion = false
);
参数:
| 名称 | 类型 | 描述 |
|---|---|---|
targetEvent | GameEventBase | 要在链中执行的事件 |
delay | float | 执行此节点前的延迟(默认:0) |
duration | float | 执行此节点后的延迟(默认:0) |
condition | Func<T, bool> | 接收参数的可选谓词 |
passArgument | bool | 是否将数据传递给目标(默认:true) |
argumentTransformer | Func<T, object> | 可选转换函数 |
waitForCompletion | bool | 执行后等待一帧(默认:false) |
返回值: ChainHandle - 用于安全移除的唯一标识符
示例:
// 带参数传递的链
public Int32GameEvent damageEvent;
public Int32GameEvent applyDamageEvent;
public Int32GameEvent updateHealthBarEvent;
damageEvent.AddChainEvent(applyDamageEvent, passArgument: true);
applyDamageEvent.AddChainEvent(updateHealthBarEvent, passArgument: true);
// 带转换的链
public Int32GameEvent damageEvent;
SingleGameEvent healthPercentEvent;
damageEvent.AddChainEvent(
healthPercentEvent,
passArgument: true,
argumentTransformer: damage =>
(float)(currentHealth - damage) / maxHealth
);
// 带参数检查的条件链
public Int32GameEvent damageEvent;
GameEvent deathEvent;
damageEvent.AddChainEvent(
deathEvent,
condition: damage => (currentHealth - damage) <= 0,
passArgument: false
);
ChainHandle AddChainEvent(
GameEventBase targetEvent,
float delay = 0f,
float duration = 0f,
Func<TSender, TArgs, bool> condition = null,
bool passArgument = true,
Func<TSender, TArgs, object> argumentTransformer = null,
bool waitForCompletion = false
);
参数:
| 名称 | 类型 | 描述 |
|---|---|---|
targetEvent | GameEventBase | 要在链中执行的事件 |
delay | float | 执行此节点前的延迟(默认:0) |
duration | float | 执行此节点后的延迟(默认:0) |
condition | Func<TSender, TArgs, bool> | 接收sender和args的可选谓词 |
passArgument | bool | 是否将数据传递给目标(默认:true) |
argumentTransformer | Func<TSender, TArgs, object> | 可选转换函数 |
waitForCompletion | bool | 执行后等待一帧(默认:false) |
返回值: ChainHandle - 用于安全移除的唯一标识符
示例:
// 攻击序列链
GameObjectAttackDataGameEvent attackStartEvent;
GameObjectAttackDataGameEvent playAnimationEvent;
GameObjectAttackDataGameEvent dealDamageEvent;
attackStartEvent.AddChainEvent(playAnimationEvent, delay: 0f);
playAnimationEvent.AddChainEvent(dealDamageEvent, delay: 0.5f);
// 提取伤害值
GameObjectAttackDataGameEvent dealDamageEvent;
public Int32GameEvent showDamageNumberEvent;
dealDamageEvent.AddChainEvent(
showDamageNumberEvent,
passArgument: true,
argumentTransformer: (attacker, data) => data.damage
);
// 带条件的胜利链
GameObjectAttackDataGameEvent attackEndEvent;
GameEvent<GameObject, VictoryData> victoryEvent;
attackEndEvent.AddChainEvent(
victoryEvent,
condition: (attacker, data) => data.targetHealth <= 0,
argumentTransformer: (attacker, data) =>
new VictoryData { winner = attacker }
);
链是顺序的(A → B → C)。如果任何节点的条件返回false或抛出异常,整个链在该点停止。
- 触发器 = 并行(A → [B, C, D])- 所有独立执行
- 链 = 顺序(A → B → C)- 严格顺序,失败时停止
RemoveChainEvent()(按句柄)
使用其唯一句柄安全地移除特定链节点。
void RemoveChainEvent(ChainHandle handle);
参数:
| 名称 | 类型 | 描述 |
|---|---|---|
handle | ChainHandle | AddChainEvent()返回的句柄 |
示例:
ChainHandle handle = eventA.AddChainEvent(eventB);
// 移除特定链节点
eventA.RemoveChainEvent(handle);
RemoveChainEvent()(按目标)
移除指向特定目标事件的所有链节点。
void RemoveChainEvent(GameEventBase targetEvent);
参数:
| 名称 | 类型 | 描述 |
|---|---|---|
targetEvent | GameEventBase | 要断开连接的目标事件 |
示例:
eventA.RemoveChainEvent(eventB);
这会移除指向此事件的所有链节点。使用RemoveChainEvent(handle)以获得精确性。
RemoveAllChainEvents()
从此事件中移除所有链事件。
void RemoveAllChainEvents();
示例:
myEvent.RemoveAllChainEvents();
🔧 配置与实用工具
SetInspectorListenersActive()
控制触发事件时是否应执行Inspector配置的监听器。
void SetInspectorListenersActive(bool isActive);
参数:
| 名称 | 类型 | 描述 |
|---|---|---|
isActive | bool | true启用Inspector监听器,false静音它们 |
示例:
// 静音Inspector配置的UI/音频效果
damageEvent.SetInspectorListenersActive(false);
// 事件将仅触发代码注册的监听器
damageEvent.Raise(10);
// 重新启用Inspector监听器
damageEvent.SetInspectorListenersActive(true);
使用场景:
- 在过场动画期间临时静音视觉/音频效果
- 运行后端计算而不触发UI更新
- 在加载屏幕期间禁用特定于场景的行为
- 在测试/调试模式下模拟游戏逻辑
此设置仅影响通过GameEventManager在Unity Inspector中配置的监听器。通过代码中的AddListener()注册的监听器不受影响,将始终执行。
🗄️ 数据库管理
GameEventManager.Instance 上用于动态数据库生命周期管理的 API —— 在运行时加载/卸载 GameEventDatabase 资产,用于基于场景的内容、DLC 或 Addressables 集成。
RegisterDatabase()
运行时注册 GameEventDatabase,使其所有事件可用于绑定和调用。自动为尚未有绑定的事件创建 EventBinding 条目。重复注册的数据库会被安全忽略。
void RegisterDatabase(GameEventDatabase database);
参数:
| 名称 | 类型 | 说明 |
|---|---|---|
database | GameEventDatabase | 要注册的数据库资产 |
示例:
var combatDB = Resources.Load<GameEventDatabase>("CombatEvents");
GameEventManager.Instance.RegisterDatabase(combatDB);
UnregisterDatabase()
运行时注销 GameEventDatabase,从活跃系统中移除其所有事件。清理关联的绑定和运行时回调。对 null 或未注册的数据库调用是安全的。
void UnregisterDatabase(GameEventDatabase database);
参数:
| 名称 | 类型 | 说明 |
|---|---|---|
database | GameEventDatabase | 要移除的数据库资产 |
示例:
GameEventManager.Instance.UnregisterDatabase(combatDB);
SetDatabaseActive()
在不注销数据库的前提下切换其激活状态。未激活的数据库保留注册条目,但其事件不会接收调用。
void SetDatabaseActive(GameEventDatabase database, bool active);
参数:
| 名称 | 类型 | 说明 |
|---|---|---|
database | GameEventDatabase | 目标数据库(必须已注册) |
active | bool | true 激活,false 静音 |
示例:
// 过场动画期间暂停战斗事件
GameEventManager.Instance.SetDatabaseActive(combatDB, false);
// 过场动画结束后恢复
GameEventManager.Instance.SetDatabaseActive(combatDB, true);
RegisterDatabase/UnregisterDatabase管理列表成员(添加 / 移除)。SetDatabaseActive只切换事件调用开关 —— 数据库保持注册状态。
🔍 运行时查询 API
GameEventManager.Instance 上用于在运行时按 GUID、名称、分类 或 类型定位事件的 API —— 无需 [SerializeField] 引用。适用于非 MonoBehaviour 使用方、存档/读档系统、插件桥接以及动态加载的内容。
每个 Get* / Has* / TryGet* 方法都有三种泛型重载用于严格类型过滤:
- 非泛型 → 返回
GameEventBase;匹配任意事件类型 <T>→ 仅匹配GameEvent<T><TSender, TArgs>→ 仅匹配GameEvent<TSender, TArgs>
类型过滤使用 is GameEvent<T> / is GameEvent<TSender, TArgs> 模式匹配。例如,即使 "OnJump" 存在为 void 事件,GetGameEvents<int>("OnJump") 也会返回 0 —— 杜绝跨类型误中。
所有查询范围限于活跃的已注册数据库。
HasGameEvent() / HasGameEvents()
存在性检查 —— 单数对应唯一 GUID,复数对应基于名称的查询(可能匹配多个事件)。
// 按 GUID(唯一)
bool HasGameEvent(string guid);
// 按名称(+ 可选分类过滤)
bool HasGameEvents(string name, string category = null);
bool HasGameEvents<T>(string name, string category = null);
bool HasGameEvents<TSender, TArgs>(string name, string category = null);
示例:
var mgr = GameEventManager.Instance;
if (mgr.HasGameEvent(savedGuid))
Debug.Log("已保存的事件仍然存在");
if (mgr.HasGameEvents("OnDamage", "Combat"))
Debug.Log("战斗伤害事件可用");
if (mgr.HasGameEvents<int>("OnScoreChanged"))
Debug.Log("找到类型为 int 的分数事件");
GetGameEvent() / TryGetGameEvent()
基于 GUID 的获取。如果 GUID 未找到或类型不匹配,返回 null / false。
- 非泛型
- GameEvent<T>
- GameEvent<TSender, TArgs>
GameEventBase GetGameEvent(string guid);
bool TryGetGameEvent(string guid, out GameEventBase evt);
示例:
if (GameEventManager.Instance.TryGetGameEvent(savedGuid, out var evt))
evt.Raise();
GameEvent<T> GetGameEvent<T>(string guid);
bool TryGetGameEvent<T>(string guid, out GameEvent<T> evt);
示例:
var scoreEvt = GameEventManager.Instance.GetGameEvent<int>(guid);
scoreEvt?.Raise(100);
GameEvent<TSender, TArgs> GetGameEvent<TSender, TArgs>(string guid);
bool TryGetGameEvent<TSender, TArgs>(string guid, out GameEvent<TSender, TArgs> evt);
示例:
if (GameEventManager.Instance.TryGetGameEvent<GameObject, DamageInfo>(guid, out var dmg))
dmg.Raise(attacker, info);
GetGameEvents()
获取所有名称匹配的事件(可选分类过滤)。无匹配时返回空 List —— 永不为 null。
List<GameEventBase> GetGameEvents(string name, string category = null);
List<GameEvent<T>> GetGameEvents<T>(string name, string category = null);
List<GameEvent<TSender, TArgs>> GetGameEvents<TSender, TArgs>(string name, string category = null);
参数:
| 名称 | 类型 | 说明 |
|---|---|---|
name | string | 精确匹配的事件名 |
category | string | 可选分类过滤(null 表示不过滤) |
示例:
// 批量触发所有名为 "OnJump" 的事件
foreach (var e in GameEventManager.Instance.GetGameEvents("OnJump"))
e.Raise();
// 名称 + 分类过滤
var combatEvents = GameEventManager.Instance.GetGameEvents("OnDamage", "Combat");
// 类型过滤:仅匹配 GameEvent<int>
var scoreEvents = GameEventManager.Instance.GetGameEvents<int>("OnScoreChanged");
GetFirstGameEventByName() / TryGetFirstGameEventByName()
当按名称查找只需单个结果时的便捷方法。返回遍历时遇到的首个事件(若有重名则任选其一)。无匹配时返回 null / false。
// 非泛型
GameEventBase GetFirstGameEventByName(string name, string category = null);
bool TryGetFirstGameEventByName(string name, out GameEventBase evt, string category = null);
// GameEvent<T>
GameEvent<T> GetFirstGameEventByName<T>(string name, string category = null);
bool TryGetFirstGameEventByName<T>(string name, out GameEvent<T> evt, string category = null);
// GameEvent<TSender, TArgs>
GameEvent<TSender, TArgs> GetFirstGameEventByName<TSender, TArgs>(string name, string category = null);
bool TryGetFirstGameEventByName<TSender, TArgs>(string name, out GameEvent<TSender, TArgs> evt, string category = null);
示例:
var mgr = GameEventManager.Instance;
// 带分类过滤的 void 事件
mgr.GetFirstGameEventByName("OnJump", "Movement")?.Raise();
// 类型化的 int 查找
if (mgr.TryGetFirstGameEventByName<int>("OnScoreChanged", out var scoreEvt))
scoreEvt.Raise(100);
// 带 Sender 的查找
if (mgr.TryGetFirstGameEventByName<GameObject, string>("OnEntityAction", out var evt))
evt.Raise(gameObject, "performed action");
- GUID 在项目内全局唯一 —— 适合存档/读档、网络同步、Mod 配置。
- 名称 可能重复(跨分类或跨数据库)—— 批量操作用
GetGameEvents(复数),接受任意匹配时用GetFirstGameEventByName。
📊 快速参考表
方法类别
| 类别 | 方法 | 目的 |
|---|---|---|
| 执行 | Raise(), Cancel() | 触发事件并停止调度执行 |
| 调度 | RaiseDelayed(), RaiseRepeating(), CancelDelayed(), CancelRepeating() | 基于时间的事件执行 |
| 基础监听器 | AddListener(), RemoveListener(), RemoveAllListeners() | 标准回调注册 |
| 优先级监听器 | AddPriorityListener(), RemovePriorityListener() | 有序回调执行 |
| 条件监听器 | AddConditionalListener(), RemoveConditionalListener() | 门控回调执行 |
| 持久化监听器 | AddPersistentListener(), RemovePersistentListener() | 场景独立回调 |
| 触发器事件 | AddTriggerEvent(), RemoveTriggerEvent(), RemoveAllTriggerEvents() | 并行事件链 |
| 链事件 | AddChainEvent(), RemoveChainEvent(), RemoveAllChainEvents() | 顺序事件链 |
| 配置 | SetInspectorListenersActive() | 运行时行为控制 |
| 数据库管理 | RegisterDatabase(), UnregisterDatabase(), SetDatabaseActive() | 运行时数据库生命周期 |
| 运行时查询 | HasGameEvent(), GetGameEvent(), TryGetGameEvent(), HasGameEvents(), GetGameEvents(), GetFirstGameEventByName(), TryGetFirstGameEventByName() | 按 GUID / 名称 / 分类 / 类型定位事件 |