GES 集成
在战斗与 Game Event System 之间双向搭桥:从图里触发 GES 事件,也让 GES 事件启动图入口
集成边界与双向通道
其余一切不受影响,43 个内置 GCS 运行时事件无论装没装 GES 都走内部通道,只有显式配置的 FlowGraph 与 Encounter Bootstrap 路径会跨过边界
检测与安装
集成要求同一个 Unity 项目里存在 Game Event System,GCS 自带一个 editor 检测器,它查找名为 TinyGiants.GES.Runtime 的 assembly definition,并在常见 build target group(Standalone、Android、iOS、WebGL,外加当前激活的那个)上同步 TG_GES_INSTALLED scripting define
安装过程是被动的:
- 导入 GES;项目里已有就保持不动
- 等 Unity 编译并 reload
- 检测器找到
TinyGiants.GES.Runtime,加上TG_GES_INSTALLED Raise GES Event和On GES Event两个节点就绪,Encounter Bootstrap 中也会显示Use GES Events
移除 GES 则反向执行:检测器摘掉 define,GCS 退回内部通道
场景启动:Encounter Bootstrap
选择场景里的 GameCardEncounterBootstrap 并展开 Events,Use GES Events 默认关闭,因此已有场景继续使用 On Bootstrap UnityEvent;开启后,UnityEvent 会被 On Bootstrap Events 列表替代,可以从按数据库分组的下拉框中添加无参数 GES 事件
遭遇战启动后,bootstrap 会从上到下触发列表里的全部事件,两种模式互斥:GES 模式不会调用 UnityEvent,UnityEvent 模式也不会触发 GES 列表;切换模式时,两边已经填好的配置都会保留
出站:Raise GES Event 节点
在图里需要通知游戏其余部分的位置加入 Raise GES Event(加节点菜单的 Event 分类),装好 GES 后,节点上的 GES Event 一栏是个选择器:点开后从下拉列表里挑事件,按事件数据库分组,选中事件的同时,argument 和 sender 类型会自动填好,不需要手写 GUID 或类型名
直接通过节点上可见的 Picker 与 Source 字段配置;节点支持无参数事件、仅 Argument 事件、Sender 加 Argument 事件,参数值可以来自固定值、Unity Object、结构化数据或当前效果上下文
配置序列化字段、动态选项、上下文来源和 Primitive 类型边界时,直接查看 Raise GES Event 节点手册
Bridge 在运行时做了什么
程序集加载完成后,集成把自己装成 GCS 的事件通道:
GCSEvents.Channel = new GCSEventChannelGESBridge();
Raise GES Event 运行时,bridge 按 GUID 从 GameEventManager.Instance 查找事件,再根据节点配置以无参数、仅 argument 或 sender 加 argument 的形式触发
事件提供 GameEvent<TSender, TArgs> 重载时使用 sender 感知的触发方式;否则退回仅传递 argument 的方式,Manager 缺失或 GUID 无效时记录 warning,但不会中断战斗
入站:On GES Event 入口
On GES Event 入口(Entry 分类)让图在战斗期间响应某个 GES 事件的触发,事件同样在节点上用选择器挑
战斗开始时,GCS 绑定到当时处于激活状态的每个 GES 事件,战斗中途才激活的事件不会被绑定,要等下一场战斗开始才生效,此后,被选中事件的任意一次触发都会启动匹配的入口,作用范围是:
- 当前位于抽牌堆、手牌、弃牌堆或消耗堆的卡牌
- 存活单位身上的状态
- 存活敌人的行为图
三种 GES 事件形态(无参数、单 argument、sender 加 argument)都支持,GES 的 payload 本身不会传进图里:入口被触发,图照常读战斗状态
FlowGraph 校验器会标出没选事件的 On GES Event 入口,避免空引用进入成品图
没有 GES 时的行为
GCS 照常编译运行,所有内置事件照常工作,图走到 Raise GES Event 节点也不会崩溃,内部通道会记一条 warning:
[GCSEventChannelInternal] RaiseGesEvent('...') ignored: GES integration not installed.
这是有意为之,共享的卡牌和测试内容可以活在没有 GES 的项目里,Console 仍会告诉你集成缺失,而不是把调用吞掉
系统职责边界
跨系统的时刻交给 bridge:boss 死亡解锁成就、打出某类卡牌推进任务、胜利后通知 metagame controller、向分析系统上报里程碑、驱动已经在 GES 上监听的场景系统
普通战斗逻辑留在 GCS 里:伤害、治疗、状态、卡牌移动、能量、目标选择、只属于战斗的反应,一张卡应该光看自己的 FlowGraph 就能读懂,Bridge 是集成边界,不是第二个写卡牌行为的地方
故障排查
| 症状 | 检查项 |
|---|---|
Raise GES Event 报集成未安装 | 确认项目里有 GES 且 TinyGiants.GES.Runtime 存在,然后让 Unity reload 以更新 TG_GES_INSTALLED |
Warning:GameEventManager not found in scene | 在战斗触发事件之前,把 GES manager 加进场景或完成初始化 |
| Warning:GES 事件 GUID 找不到 | 在节点上重选事件;保存的 GUID 已对不上任何现存 GES 事件 |
| Argument 收到 null | Argument 类型必须能解析,所选来源必须能产出该类型的值,重选事件会重新填好类型 |
| Sender 感知事件只带 argument 触发 | 目标 GES 事件类型没有匹配的 sender 加 argument 触发方法,bridge 走了回退 |
On GES Event 从不触发 | 节点上必须选好事件,事件在战斗开始时必须处于激活状态,且它所属的卡牌、状态或敌人在触发那一刻要在牌堆里或存活 |
| GCS 事件正常,GES 监听器无响应 | Bridge 只转发显式的 Raise GES Event 调用,不会把内置 GCS 事件镜像进 GES |