跳到主要内容

数据模型参考

GCS · Reference

六个可创作的 asset 家族、战斗从它们创建出的运行时类型,以及谁可以修改战斗状态的规则。

写集成代码时,用这页决定哪个类型该引用、该读取,以及哪些类型不应直接访问。

GCS 的数据模型分成两层。Asset 是你在 Game Card Editor 里创作、存进数据库的内容;运行时模型是战斗开始那一刻从这些 asset 构建出来的对象。分清两者之后,大多数“这个值到底存在哪”的疑问在变成 bug 之前就有了答案

可创作 asset

六个内容家族覆盖所有可创作对象:

Type用户可见职责
GameCard一张可打出的卡牌定义:费用、类型、目标模式、keywords、标签、美术和行为
GameStatus一个 buff、debuff 或反应式规则:层数策略、衰减、图标、标签、行为
GameEnemyUnit敌人定义:HP 范围、tier、标签、prefab、意图行为
GamePlayerUnit玩家定义:HP、能量、职业身份、prefab、起始卡组
GameEncounter一场战斗的设置:玩家、敌人、奖励卡组、战斗规则、显示数据
GameDeck一份卡牌条目列表(卡牌加份数),用作起始或奖励内容

两个单位家族共享同一个基类 GameUnit,所以玩家单位和敌人带有相同的身份字段:Name、Description、Icon、Template prefab 和 Tags。差别在数值块:GamePlayerUnit 是固定的 Base HP 和 Base Energy,GameEnemyUnit 是 HP Min / HP Max 区间加 Tier

每个家族都有对应的数据库 asset:GameCardDatabaseGameStatusDatabaseGameEnemyUnitDatabaseGamePlayerUnitDatabaseGameEncounterDatabaseGameDeckDatabase。数据库是定义的容器,把它注册到场景的 GameCardManager 上,里面的内容才在运行时可达


行为放在哪

GameCardGameStatusGameEnemyUnit 各自在名为 Behavior 的字段里直接内嵌一张流图(FlowGraph)。不存在需要单独创建、链接、担心丢失的行为 asset。另外三个家族没有图:遭遇战描述的是战斗设置,玩家单位通过卡牌行动,卡组只是一份卡牌列表

每个效果只有一个图的归属者

如果你在找“遭遇战的图”,它不存在。效果永远属于某张卡、某个状态或某个敌人。遭遇战级别的规则是 BattleRules 上的普通字段,不是节点


运行时模型

GCSApi.StartBattle 执行时,GCS 从已创作的定义构建这一层运行时对象:

Type运行时含义
IBattleState只读战斗视图:阶段、单位、牌堆、能量、回合、当前遭遇战
IBattleController受支持的战斗状态修改入口
UnitState单个单位的实时状态:当前 HP、护甲、状态、标记位
EnemyUnitState带意图和行为上下文的敌人版 UnitState
CardInstance战斗牌堆里的一张卡牌副本,有自己的实例 id 和升级标记
CardPile一个运行时牌堆:手牌、抽牌堆、弃牌堆或消耗(exhaust)堆
CardCostRule作用在单个卡牌实例上的费用修改,可以永久生效,也可以在设定回合数后到期
GCSApi战斗控制、事件和内容注册表的公开入口

Monitor 窗口实时展示的就是这一层。一个值出现在那里(当前 HP、护甲、层数、牌堆内容),它就是运行时状态,不是 asset 上编辑的字段

Monitor 的 Units 页签,展示战斗中每个单位的实时 UnitState 数值


定义与实例

定义是已创作的内容,实例是战斗从定义复制出的副本

概念例子不要混淆为
卡牌定义名为 Strike 的 GameCard当前在手牌里的那个 CardInstance
单位定义名为 Strawman 的 GameEnemyUnit该敌人在战斗中的当前 HP 和护甲
状态定义名为 Burn 的 GameStatus某个单位当前的 Burn 层数
卡组定义一个 GameDeck运行时的抽牌堆、弃牌堆和消耗堆

实例状态在战斗开始时创建一次。敌人从定义的区间掷出 HP(两端都取得到)后就用这个结果;卡组条目按份数变成抽牌堆里的 CardInstance 副本。在 Play Mode 里编辑定义,不会改写已经从它创建出来的状态


修改规则

绝不要在自己的代码里直接修改运行时对象。受支持的路径有三条:

  1. 外部 C# 集成走 GCSApi
  2. 自定义 FlowGraph 节点内部走 ctx.Controller
  3. 已创作的效果走内置 FlowGraph 节点
直接写入的代价

手动设置 UnitState 的 HP,或者自己往 CardPile 里塞卡,会绕过 Hook、事件、表现层更新和 Monitor 输出。战斗还在跑,但状态不再响应,UI 和实际状态开始脱节。每一次修改都应该走 controller 方法


仅内部使用的类型

部分运行时和编辑器 class 属于实现细节。一个类型如果没有通过创作 UI、GCSApi、公开节点基类、事件参数或文档化注册表暴露,即使 C# 能访问到,也把它当作 internal。内部类型可能在版本之间改变形态,文档化入口不会