跳到主要内容

让监听器跨场景继续接收事件

TinyGiants
Unity Games & Tools Developer

常驻音频服务需要在每次切换场景后继续接收关卡开始事件,保留服务 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 会保留这个事件的监听绑定,回调目标也需要在切换后存活

Game Event Behavior 的 Persistent Event 设置

Persistent Event 设置的是事件的场景切换行为,AddPersistentListener 则单独为一个脚本回调登记跨场景监听,用于只保留音频等常驻服务的回调

场景内的 UI 等短生命周期对象可使用类型化 Receiver,组件会在 OnEnable 注册并在 OnDisable 移除自己的回调,新场景的 Receiver 启用后再接收后续触发

用 Demo 核对切换结果​

打开 09 Persistent Event 场景,找到切换场景后仍存活的接收对象和两个用于对照的事件

跨场景示例中用于测试监听生命周期的对象

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

Game Event Editor 中用于跨场景对照的事件

  1. 进入 Play Mode,在切换前触发两个事件,确认接收对象都能响应
  2. 切换到示例的另一个场景,再触发两个事件,检查常驻对象上保留的绑定
  3. 在项目中验证音频服务时,从新关卡触发相同的 OnLevelStart 资产,确认服务收到新关卡名,销毁服务后再触发一次,确认其回调已经移除

按场景管理数据库​

将音频、存档等常驻事件放在核心数据库,战斗或 UI 事件可以各用一套数据库,在 Game Event Manager 中注册所需数据库,并核对激活状态

Game Event Manager 中已注册的多套数据库

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

打开跨场景 Demo