跳到主要内容

定义与运行实例

Guide

分清可复用的内容定义与实时战斗实例,避免把运行时变化误当成对创作资产的修改

从创作定义生成战斗状态

上图说明了 GCS 的数据边界:Game Card Editor 保存可复用的内容定义,启动 Encounter 时,运行时根据这些定义创建本场战斗的单位、卡牌、状态和牌堆,战斗中的 HP、费用、层数与卡牌位置只属于当前实例,不会回写创作资产

单位定义与单位状态

内容保存的数据生命周期
GamePlayerUnit名称、基础 HP、能量表现、起始卡组、Prefab 与美术可复用的项目资产
GameEnemyUnit名称、HP 范围、Tier、Prefab、Intent 与 Behavior可复用的项目资产
UnitState当前/最大 HP、护甲、队伍、存活状态、状态层数与活动 Hook当前战斗
EnemyUnitStateUnitState 的全部数据,以及当前 Intent 和 Pattern 进度当前战斗

敌人进入战斗时会从定义的 HP 闭区间中确定起始值,此后在 Inspector 中修改原始 GameEnemyUnit,不会更新已经创建的 EnemyUnitState

卡牌定义与卡牌实例

内容保存的数据使用位置
GameCard名称、描述、基础费用、类型、稀有度、Target、美术与 Behavior内容创作、数据库查询、卡组配置
CardInstance实例 ID、基础卡牌引用、升级状态与实例费用变化手牌、抽牌堆、弃牌堆、消耗堆
Active Card基础卡或当前升级变体卡面显示与实际结算
Effective Cost基础费用、Run 修正、临时规则与费用 Hook 的最终结果出牌检查与战斗 UI
提示

两张 Strike 可以共用同一个 GameCard,但它们在牌堆中是两个独立的 CardInstance,其中一张升级或获得临时费用变化时,另一张不会受到影响

运行时操作应传入实例;内容浏览、卡组配置和数据库查找使用定义,完整牌堆规则见卡牌与牌堆生命周期

状态定义与单位层数

GameStatus 保存名称、说明、图标、叠层规则、上限、衰减方式和 Behavior,单位进入战斗后,UnitState 只记录该单位当前持有哪些状态、各有多少层,以及已知的施加者,因此,修改 GameStatus.MaxStacks 会影响之后的状态结算,但直接改动某个单位身上的层数必须通过运行时接口完成,状态施加、衰减和过期规则见状态生命周期

GameDeck、Master Deck 与战斗牌堆

这三类数据分别服务创作配置、跨战斗进度与当前战斗

层级用途
GameDeck配置玩家起始卡组或 Encounter 奖励池
Run Master Deck在同一局 Run 的多场战斗之间保存卡牌、升级状态与费用变化
战斗牌堆保存当前战斗中的 CardInstance 及其位置顺序

新战斗会根据 Run Master Deck 或玩家的 Starting Deck 创建牌堆,战斗开始后修改 Master Deck,不会追溯改变已经生成的牌堆

选择正确的数据层级

需求应修改的对象
调整以后创建的所有 Strike 的基础费用GameCard 定义
调整当前战斗中某一张 Strike 的费用CardInstance 的受支持费用规则
调整敌人的创作 HP 范围GameEnemyUnit 定义
改变当前敌人的 HP通过 GCSApi 或 Controller 修改 EnemyUnitState
改变状态的叠层或衰减规则GameStatus 定义
改变某个单位当前的状态层数通过状态 API 或 FlowGraph 节点修改
调整以后开始的 Run 卡组Master Deck
移动当前战斗中的卡牌战斗牌堆中的 CardInstance

Play Mode 中的实时数据应在 Game Card Monitor 中检查,Inspector 显示的是创作定义,不能代表已经创建的战斗实例

安全读取与修改

项目代码优先使用 GCSApi 的具名方法:

  • 使用 Player()AliveEnemies()Hand()StatusesOn() 等方法读取当前状态

  • 使用 DealDamage()GainArmor()ApplyStatus()MoveCardToPile() 等方法提交修改

  • 自定义节点通过 ctx.Controller 修改状态

提示

这些入口会执行对应的 Hook、边界检查、事件通知和 Monitor 记录,直接修改实时对象的字段或集合,可能得到暂时正确的数值,却会让其他系统失去同步依据

完整代码入口见 API 使用指南,可用成员见 API 参考