跳到主要内容

可选 GES 集成

GCS · Integrations

在战斗与 Game Event System 之间双向搭桥:从图里触发 GES 事件,也让 GES 事件启动图入口。

面向已把 GES 当作全游戏事件层的项目。GCS 本身从不依赖它。

GCS 可以独立运行。Game Event System 集成面向已经用 GES GameEvent 资产驱动任务、成就、分析或场景逻辑的项目,而且是双向的:卡牌、状态或敌人的图可以通知 GES,一次 GES 触发(Raise)也可以启动图里的入口。

双向,同一条边界

其余一切不受影响。43 个内置 GCS 运行时事件无论装没装 GES 都走内部通道,跨过边界的只有这两条显式路径。


检测与安装

集成要求同一个 Unity 项目里存在 Game Event System。GCS 自带一个 editor 检测器,它查找名为 TinyGiants.GES.Runtime 的 assembly definition,并在常见 build target group(Standalone、Android、iOS、WebGL,外加当前激活的那个)上同步 TG_GES_INSTALLED scripting define。

安装过程是被动的:

  1. 导入 GES;项目里已有就保持不动。
  2. 等 Unity 编译并 reload。
  3. 检测器找到 TinyGiants.GES.Runtime,加上 TG_GES_INSTALLED
  4. Raise GES EventOn GES Event 两个节点就绪。

移除 GES 则反向执行:检测器摘掉 define,GCS 退回内部通道。


出站:Raise GES Event 节点

在图里需要通知游戏其余部分的位置加入 Raise GES Event(加节点菜单的 Event 分类)。装好 GES 后,节点上的 GES Event 一栏是个选择器:点开后从下拉列表里挑事件,按事件数据库分组。选中事件的同时,argument 和 sender 类型会自动填好,不需要手写 GUID 或类型名。

节点序列化这些字段:

字段含义
GesEventGuid要触发哪个 GES 事件。由选择器写入。
GesArgTypeFullNameArgument 类型。选择器从事件本身填入;留空表示无参数触发。
GesArgSourceArgument 值的来源:固定文本或战斗实时值。
GesArgFixedValuePrimitive argument 的固定值文本。
GesArgObjectValueArgument 类型为 Unity object 时的值。
GesArgJson构造复杂 argument 对象用的 JSON。
GesSenderTypeFullNameSender 感知事件的 sender 类型。由选择器填入。
GesSenderArgSourceSender 值的来源。
GesSenderFixedValueSender 的固定值文本。
GesSenderObjectValueSender 类型为 Unity object 时的值。
GesSenderJson构造复杂 sender 对象用的 JSON。

值怎么构造取决于类型:Unity object 类型取 object 引用字段;类 primitive 类型(int、float、bool、string、long、double、short、byte)取所选来源;其他类型从 JSON 字段反序列化。

实时来源读取当前效果上下文:source unit id、default target unit id、attacker unit id、last damage、last armor、last heal、card instance id、card source GUID、battle turn number、player energy。一个想知道"终结一击打了多少伤害"的任务,在斩杀效果上选 last damage 来源就完事了。

Bridge 在运行时做了什么

程序集加载完成后,集成把自己装成 GCS 的事件通道:

GCSEvents.Channel = new GCSEventChannelGESBridge();

Raise GES Event 节点运行时,bridge 按 GUID 向 GameEventManager.Instance 查找事件,然后按节点携带的内容以无参数、带 argument 或 sender 加 argument 的形式触发。Sender 感知的触发在事件存在 GameEvent<TSender, TArgs> 重载时走该重载,不存在时退回只带 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。