状态创作
定义一层状态代表什么、层数如何合并或衰减,以及状态会响应哪些战斗时机
Mire Reaper 的 Behavior 已经把 Poison 与 Weak 接入敌人行动,状态资产会继续决定这些效果落到单位后如何显示、叠加、响应战斗时机并最终结束,开始编辑前,请先确认当前场景的 GameCardManager 已启用至少一个 Status Database,数据库配置决定 Game Card Editor 与运行时能够发现哪些状态
打开 Game Card Editor
Tools > TinyGiants > GCS > Game Card Editor
在窗口顶部选择 Status,再从左侧定位 Strength

上图把 Status 的 List、Inspector、Preview 与 Used By 放进同一条创作链路,左侧确定当前 GameStatus,中间定义玩家可见身份、叠层规则与 Behavior,右侧核对配置结果并追踪行为图引用,这些区域共享当前选中的 Strength,因此,只要先在 List 确认状态资产,后面的字段、行为、预览与引用检查就会沿同一份数据连续展开
选择待编辑的状态
Status 模式只会列出当前 GameCardManager 已启用的 Status Database 中的非空状态,每个列表行显示 Icon、名称、Buff 或 Debuff、Stack Rule 与 Decay Rule

PresetStatusDatabase 当前包含 30 个随包状态,其中 Buff 与 Debuff 各 15 个,14 个使用 PerTurn,16 个使用 Never,除 Ritual 外的 29 个状态都会显示层数
此外,List 还负责当前 Status Database 内的资产管理
列表操作
| 操作 | 使用方式与结果 |
|---|---|
| 选择数据库 | 在 Database 中选择目标 Status Database,后续创建、粘贴和排序都作用于当前数据库 |
| 创建 | + 创建以 NewStatus 为基名的子资产,默认使用 Buff、Additive、Max Stacks = -1、Never 并显示层数,Behavior 已创建但没有节点或连接 |
| 复制 | 复制当前字段与 Behavior 并生成独立副本 |
| 删除 | − 在确认后删除当前状态,不会保护或迁移行为图中的既有引用 |
| 搜索与筛选 | 搜索读取子资产名,Type 在 Buff 与 Debuff 之间筛选,Tags 保留命中任一所选标签的状态,标签比较区分大小写 |
| 排序与拖动 | 排序按钮在数据库顺序、名称升序与名称降序之间切换,拖动列表行只改变数据库中的创作顺序 |
| 批量操作 | 多选复制、批量添加或移除 Tag、批量删除,以及通过 Ctrl/Cmd+C 与 Ctrl/Cmd+V 在同类型的活动数据库之间复制 |
窗口级交互见 Game Card Editor,确认 Strength 处于选中状态后,先让它的一层数值具有明确含义
配置状态身份与数值含义
Basic
| 字段 | 配置与职责 |
|---|---|
| Name | 玩家看到的状态名称,填写非空值时会同步修改子资产名,留空时 List 回退显示子资产名,Display 显示 (unnamed),Validation 同时报告错误 |
| Description | 说明状态改变什么,以及一层代表的强度、持续时间或次数,文字本身不会自动生成运行规则 |
| Type | Buff 或 Debuff 的显示分类,也供 Filter 节点筛选状态集合,不会自动决定效果有益或有害 |
| Tags | 用于 List 筛选、Status Info、Filter 节点与项目自定义规则,内置单位目标选择不会把状态 Tags 当作单位 Tags |
将 Name 设为 Strength,保留说明 Your attacks deal 1 extra damage per stack.,选择 Buff 并添加 Power Tag

这组字段已经明确一层 Strength 会增加 1 点攻击伤害,同一状态还需要绑定玩家能够识别的 Icon
Visual
Icon 会进入 Status List、Display 预览和项目状态徽章,随包 Demo 还会在单位悬停信息中显示它
为 Strength 选择拳头图标
身份与图标只说明玩家可以看到什么,而Strength 再次被施加时怎样合并、能否无限增长以及何时衰减,则由 Stack 决定
配置叠加与衰减规则
将 Strength 的 Stack Rule 设为 Additive,Max Stacks 设为 -1,Decay Rule 设为 Never,并启用 Show Stack Count

这组配置让每次施加的层数累加到现有值,既不限制最终层数,也不会在回合结束时自动减少,徽章上的数字始终对应当前伤害加成
| 设置 | 运行时含义 |
|---|---|
Additive | 现有层数加上传入层数 |
Max | 在现有层数与传入层数之间保留较大值 |
Replace | 用传入层数覆盖现有层数 |
Max Stacks | 只有正数才会限制最终层数,0 与负数在运行时都表示不限制,但 0 会触发编辑器警告,明确的无限层数使用 -1 |
PerTurn | 在状态持有者自己的回合结束后减少 1 层 |
Never | 一直保留到行为图、GCSApi 或项目逻辑主动修改 |
Show Stack Count | 控制项目状态徽章是否显示数字,不改变真实层数 |
同一套字段也能表达不同的层数语义:
| 状态 | Stack Rule | Max Stacks | Decay Rule | 适合的结果 |
|---|---|---|---|---|
Stunned | Replace | 1 | PerTurn | 单层开关,重新施加仍保持一层 |
Empower | Max | 1 | PerTurn | 只保留更高传入值并在持有者回合结束后消失 |
Restricted | Additive | 3 | Never | 最多累积三层,直到被主动移除 |
Strength 的当前层数现在已经具有稳定语义,Behavior 可以直接读取这项运行时数值并把它写入伤害 Hook
编排状态 Behavior
Behavior 下方的 Chip 会列出顶层 Entry,Strength 当前显示 Hook: OnDealDamage

点击 Edit FlowGraph 打开 Strength 的行为图

上图中的执行链从 Damage Dealt Hook 取得当前伤害,Status Info 读取持有者的 Strength 层数,Math Binary 将两项数值相加,再由 Write Hook 把结果写回伤害链路;末尾的 Play Effect 为这次加成提供表现反馈
这条连接关系使 Description 中的“每层增加 1 点伤害”成为可执行规则,而Max Stacks 只负责限制层数,实际效果计算始终读取单位当前持有的层数
Behavior 可以同时包含回合入口、生命周期入口、Hook 和表现节点
当状态不需要主动响应战斗时机时也可以保持为空,空 Behavior 不会影响状态的保存、显示与叠加,只是不再自行执行回合或生命周期规则,这些入口与节点仍然遵守 FlowGraph 模型,具体节点见 Hook 节点与 Get 节点,可直接复用的组合见状态行为配方
行为图完成后,回到 Game Card Editor,右侧 Preview 会先核对玩家可见结果,再检查顶层入口是否已经进入摘要
检查状态预览
显示信息
Display 会呈现 Icon、Name、Buff 或 Debuff、Description、Stack Rule、Decay Rule 与 Max Stacks

预览中的图标、Strength 名称、Buff 标签与 Additive · Never · Max ∞ 已经和前面的字段保持一致,Tags 与 Show Stack Count 不会出现在这张卡片中,实际徽章是否显示数字仍需进入 Play Mode 检查
Behavior Summary
Behavior Summary 会收集 Behavior 中的顶层 EntryNode,再从每个入口沿第一条 Out 控制连接向后显示最多 8 个节点

当前四行摘要确认 Strength 存在伤害 Hook、接收、自然过期与主动移除入口,摘要不会展开分支、遍历所有 Out 连接,也不能证明每条路径都能执行到 Action;完整结构仍应在 FlowGraph Editor 中确认,所以,请继续查看当前 Status Database 的 Issue Badge
处理校验问题
Status 模式会扫描当前选中 Status Database 中的全部状态,而不只检查正在查看的 Strength
| 级别 | 触发条件 |
|---|---|
| Error | Name 为空 |
| Warning | MaxStacks == 0 |
| Warning | Behavior 非空且 FlowGraphValidator 返回结构问题 |
以下边界不会进入 Validation,需要在对应位置自行确认
| 自检位置 | Validation 未覆盖的内容 |
|---|---|
| Inspector 与 Display | Description、Icon 或 Tags 为空,Type 与实际效果不一致,Show Stack Count 不符合层数语义 |
| FlowGraph Editor | Behavior 为空,入口与执行路径没有实现 Description 承诺的规则 |
| 字段与 Play Mode | MaxStacks < -1,层数、徽章与实际效果之间的语义不一致 |
点击 Issue 中的 Ping 可以定位对应状态、字段或 FlowGraph,常见结构问题见创作错误
字段和行为通过检查后,Used By 会把 Strength 重新连接到施加或读取它的内容资产
检查资产引用
Used By 会扫描当前 GameCardManager 已启用的 Card、Status 与 Enemy Unit Database,并在各资产的 Behavior 中查找对当前状态的直接引用

当前可见区域依次列出三张卡牌、Ritual 与 Pyre Effigy,继续滚动还会看到 Lantern Sister 与 Order Knight,Strength 的完整引用结果如下
| 资产 | 类型 | 首个匹配节点 |
|---|---|---|
Rally | Card | Change Status |
Intimidate | Card | Change Status |
Lord of Ruin | Card | Unit Status Stacks |
Ritual | Status | Change Status |
Pyre Effigy | Enemy | Change Status |
Lantern Sister | Enemy | Change Status |
Order Knight | Enemy | Change Status |
同一资产即使多次引用 Strength 也只显示一行,并使用首个匹配节点作为上下文,Used By 还会递归扫描 Group Body,未启用数据库、其他场景、Prefab、代码与 GCSApi 调用不在结果中
点击任一结果会切换到对应的 Card、Status 或 Enemy 模式,Change Status 的目标、模式和数值端口见 Action 节点
GameStatus 保存可复用定义,进入战斗后,每个单位会独立记录当前层数与施加者,叠加、移除、Hook、事件和自然衰减的完整顺序统一见状态生命周期
在 Play Mode 中验证 Poison
Strength 使用 Never 并通过 Hook 持续改写伤害,Poison 则使用 Additive、无限层数与 PerTurn,它会在持有者回合开始时按当前层数造成无视 Armor 的伤害

上图中的执行路径从 On Turn Start 进入 Deal Damage,Status Info 把当前 Poison 层数写入伤害 Amount,Ignore Armor 已启用,末尾的 Play Effect 负责飘字与中毒表现
图中没有减少层数的 Action,因为 PerTurn 会在持有者自己的回合结束后自动减少 1 层,玩家状态在玩家回合结束后衰减,敌人状态在该敌人的行动结束后衰减,完整时序见状态生命周期
当 PerTurn 自然衰减至 0 时,状态执行 OnStatusExpired 并发送同名事件,通过 RemoveStatus、负数 Delta 或 Set 主动降至 0 时,则执行 OnStatusRemoved 并发送对应事件,每次真实层数变化都会发送 OnStatusChanged
打开随包场景 Hunter/1-Fenmoss Hollow.unity,用 Poison Arrow 命中 Plague Stalker,卡牌会先造成 3 点伤害并施加 2 层 Poison

画面中的 13/16 HP 与两层 Poison 来自同一次 Poison Arrow 结算,结束玩家回合后,这两层状态会在敌人回合开始时进入刚才的 On Turn Start 路径
敌人受到 2 点无视 Armor 的伤害并完成行动后,PerTurn 再把 Poison 从两层衰减为一层,第二个玩家回合开始时可以同时看到两个结果

13/16 → 11/16 证明 Poison 按两层数值结算了伤害,2 → 1 则证明 Decay Rule 在同一敌人回合结束后完成衰减,完整操作过程见第一场战斗
编辑器配置、FlowGraph 和 Play Mode 已经形成一条可验证链路,项目代码需要查询层数、施加或移除状态、订阅变化事件时,查阅 GCSApi 使用指南与事件使用指南,Strength 与 Poison 已经从资产定义进入真实战斗,卡牌、卡组、玩家、敌人和状态完成验证后,便可以切换到 Encounter,按遭遇战创作把它们装配为一场可启动的战斗