在同一项目中使用可视化和脚本监听
在 Inspector 中绑定场景里的 HUD,让运行时生成的敌人在启用时注册自己的回调,两者可以引用同一个类型化事件资产,每个监听器都应有明确归属,便于找到配置位置并确定清理时机
在 Inspector 中绑定场景对象
为关卡门、HUD 或背景音频配置回调时,在 Game Event Editor 找到事件并打开 Game Event Behavior,在 Event Action 中添加目标对象与方法
同一个死亡事件可以更新遮罩、打开结算面板、播放音效并禁用输入,若整组回调需要同一个条件,把条件放在该事件的 Action Condition
只让音效服从单独条件时,把音效回调放到对应类型的 Receiver 组件,为这个 Receiver 设置 Action Condition,镜头、界面等其他监听器仍按自己的配置响应
用 C# 注册运行时实例
预制体可以预先引用事件资产,实例的回调可由代码按照启用状态注册和移除,下面的监听器适用于重复启用、回收的敌人
using TinyGiants.GES.Runtime;
using UnityEngine;
using UnityEngine.AI;
public sealed class EnemyPauseListener : MonoBehaviour
{
[GameEventDropdown, SerializeField] private GameEvent onPauseGame;
[GameEventDropdown, SerializeField] private GameEvent onResumeGame;
[SerializeField] private NavMeshAgent agent;
private void OnEnable()
{
if (onPauseGame != null) onPauseGame.AddListener(Freeze);
if (onResumeGame != null) onResumeGame.AddListener(Unfreeze);
}
private void OnDisable()
{
if (onPauseGame != null) onPauseGame.RemoveListener(Freeze);
if (onResumeGame != null) onResumeGame.RemoveListener(Unfreeze);
}
private void Freeze() => SetPaused(true);
private void Unfreeze() => SetPaused(false);
private void SetPaused(bool paused)
{
if (agent != null && agent.isOnNavMesh)
agent.isStopped = paused;
}
}
在敌人预制体上选择暂停与恢复事件,再由暂停菜单或控制器调用相应事件的 Raise(),进入 Play Mode 后回收并重新启用敌人,确认每个实例只响应一次
只需调用预先绑定的方法时,也可把类型化 Receiver 直接放在预制体上,它会在实例启用和禁用时管理监听
共用同一个事件资产
- 受击代码先结算生命值,再触发携带整数伤害的
OnEnemyDamaged,HUD 的动态回调接收同一个伤害值 - 镜头可使用单独的 Receiver,在 Action Condition 设置伤害大于
20,只在重击时震动 - 波次管理器在确认最后一名敌人死亡后触发
OnWaveComplete,再由 Flow Graph 把奖励面板与下一波事件的时序连接起来
在代码中保留状态更新和触发时机,在 Inspector 中配置目标方法、表现条件与时序
需要明确脚本监听顺序时,可用 AddPriorityListener 为同一组优先级监听指定顺序,并在结束时调用 RemovePriorityListener,数值较大的优先级监听先执行
