让监听器跨场景继续接收事件
常驻音频服务需要在每次切换场景后继续接收关卡开始事件,保留服务 GameObject,让每个关卡引用同一个事件资产,把音频服务注册为持久化监听器,并在服务关闭时移除回调
配置持久化监听器
让每个关卡的发布者引用数据库中的同一个 OnLevelStart 事件资产,并将该数据库注册到 GameEventManager,示例使用字符串参数传递关卡名,关卡就绪后调用 Raise(levelName)
常驻服务要先用 DontDestroyOnLoad 保留自身,再通过 AddPersistentListener 注册实例方法,把此组件挂到启动场景中的根对象上,并在 Inspector 中为 onLevelStart 选中该事件
using TinyGiants.GES.Runtime;
using UnityEngine;
public sealed class LevelAudioService : MonoBehaviour
{
[GameEventDropdown, SerializeField]
private GameEvent<string> onLevelStart;
private void Awake()
{
DontDestroyOnLoad(gameObject);
if (onLevelStart != null)
onLevelStart.AddPersistentListener(HandleLevelStart);
}
private void OnDestroy()
{
if (onLevelStart != null)
onLevelStart.RemovePersistentListener(HandleLevelStart);
}
private void HandleLevelStart(string levelName)
{
Debug.Log($"Select music for {levelName}", this);
}
}
让启动流程只创建一份音频服务,避免每次加载关卡都注册一个新实例,服务如果需要随启用状态暂停响应,则在 OnEnable 注册并在 OnDisable 移除
保留已配置的场景回调
若已在 Game Event Behavior 中为常驻对象配置 Event Action,可在 Schedule Configuration 勾选该事件的 Persistent Event,场景切换时 GES 会保留这个事件的监听绑定,回调目标也需要在切换后存活

Persistent Event 设置的是事件的场景切换行为,AddPersistentListener 则单独为一个脚本回调登记跨场景监听,用于只保留音频等常驻服务的回调
场景内的 UI 等短生命周期对象可使用类型化 Receiver,组件会在 OnEnable 注册并在 OnDisable 移除自己的回调,新场景的 Receiver 启用后再接收后续触发
用 Demo 核对切换结果
打开 09 Persistent Event 场景,找到切换场景后仍存活的接收对象和两个用于对照的事件

在 Game Event Editor 中找到这两个事件,打开各自的 Behavior,查看 Persistent Event 的勾选状态

- 进入 Play Mode,在切换前触发两个事件,确认接收对象都能响应
- 切换到示例的另一个场景,再触发两个事件,检查常驻对象上保留的绑定
- 在项目中验证音频服务时,从新关卡触发相同的
OnLevelStart资产,确认服务收到新关卡名,销毁服务后再触发一次,确认其回调已经移除
按场景管理数据库
将音频、存档等常驻事件放在核心数据库,战斗或 UI 事件可以各用一套数据库,在 Game Event Manager 中注册所需数据库,并核对激活状态

场景流程需要动态改变数据库时,使用 RegisterDatabase、SetDatabaseActive 或 UnregisterDatabase 管理 Manager 的绑定,回调的注册与移除仍由监听对象负责
