跳到主要内容

遭遇战创作

Guide

用玩家、按顺序行动的敌人、奖励与 Battle Rules 组建可运行的战斗,并验证整场遭遇战

玩家角色由 Squire 定义,Iron Resolve 是它的 Starting Deck,敌人 HP、Intent 与 Behavior 则保存在 Strawman 中,Encounter 模式会把这些引用组合进 The Threshing Field,这份 GameEncounter 保存名称、说明、难度、横幅、玩家、按行动顺序排列的敌人、奖励卡组与 Battle Rules,角色、卡牌和敌人的具体配置仍保留在各自的原始资产中

在开始编辑前,请先确认当前场景的 GameCardManager 已启用至少一个 Encounter Database,数据库配置决定 Game Card Editor 能够列出、创建和编辑哪些遭遇战

打开 Game Card Editor

Tools > TinyGiants > GCS > Game Card Editor

在窗口顶部选择 Encounter,再从左侧定位 The Threshing Field

Game Card Editor Encounter 模式中的 The Threshing Field,左侧为遭遇战列表,中间为玩家、敌人、奖励卡组与规则,右侧为四项静态预览

上图呈现了 Encounter 从资产选择到启动前核对的完整界面,在 List 中选定 GameEncounter 后,Inspector 会绑定参战单位、奖励与规则,Preview 与 Used By 分别显示配置摘要和内容层级,四个区域共享当前选择,把分散的内容资产组合成一份可以校验和启动的战斗配方

选择待编辑的遭遇战​

Encounter 模式只会读取当前 GameCardManager 已启用的 Encounter Database

列表操作​

操作使用方式与结果
选择数据库在 Database 中选择要写入的 Encounter Database,后续创建和资产管理都作用于当前数据库
创建+ 会在当前数据库中创建空白遭遇战
复制复制按钮会基于当前遭遇战的结构创建副本
删除− 会删除当前遭遇战
搜索与筛选搜索框按遭遇战子资产名过滤,Difficulty 与 Tags 可以进一步缩小结果范围

每个列表行都会显示 16:9 战斗图片、名称、难度与敌人槽位数量,无需打开 Inspector 就能比较同一数据库中的战斗规模与分类

PresetEncounterDatabase 中的 Encounter List,The Threshing Field 显示 Normal 与 1 Enemy

当前列表已经选中 The Threshing Field,修改 Inspector 中的 Name、Difficulty、Icon 或 Enemy Units 后,列表项中的名称、难度、图片与敌人数量都会同步刷新

配置身份与参战阵容​

Basic​

Basic 先确定这场战斗在编辑器、遭遇战选择界面和项目流程中的身份

字段配置结果
NameGame Card Editor 与项目 UI 使用的显示名称,填写非空值时也会同步更新子资产名
Description面向玩家的战斗地点、目标或对手说明
Difficulty内置 Normal、Elite、Boss 或项目自定义标签,只负责分类与显示,不会自动缩放战斗数值
Tags供 Game Card Editor 筛选以及项目自己的进度、分组或选择逻辑读取的标签

将 Name 设为 The Threshing Field,将 Difficulty 设为 Normal,再填写玩家实际会看到的场景说明与 Warrior 标签,Basic 中的身份信息会立即同步显示在 List 与 Preview 中

The Threshing Field 的 Basic 配置,包含名称、战斗说明、Normal 难度与 Warrior 标签

Basic 已经确定战斗名称、场景与难度,Visual 会继续为当前 Encounter 指定战斗横幅

Visual​

在 Icon 中选择一张 Sprite 后,Game Card Editor 会把这张图片以 16:9 缩略图显示在 List 和 Display 预览中,项目的遭遇战选择页、加载界面或背景表现也可以直接复用这项引用

The Threshing Field 的 Visual 配置,Icon 引用 Background

身份与画面确定后,这场遭遇战仍然需要一支至少包含一名成员的玩家队伍和一个敌人槽位,双方编制共同决定运行时会创建哪些单位

Player Units​

在 Player Units 的第 1 行选择 Squire。卡片显示角色头像、名称、HP 70 与 Energy 3;该行固定映射槽位 0,也保留旧项目读取 PlayerUnit 的兼容入口

The Threshing Field 的 Player Units 配置,第 1 行是 Squire

选择按钮替换角色,打开按钮进入 Player 模式,× 删除该行。Add Player Unit 添加成员,拖动卡片调整顺序;达到三人上限后,添加按钮变为禁用。单角色 Encounter 只保留第 1 行

提示

战斗启动时,运行时会根据每名角色自己的 Max HP 与 Template 创建独立玩家状态,Player Unit 1 提供全队共享资源使用的 Starting Deck 与每回合 Base Energy;生命、护甲、状态和 Hook 不会在成员之间合并

当前 Run 的 Master Deck 为空时,运行时才会用 Player Unit 1 的 Starting Deck 建立共享牌堆,后续行不会把自己的卡组追加进当前战斗。角色字段与两类卡组来源见玩家创作和卡组创作

多角色遭遇战在 Player Units 中直接编辑完整阵容,Party Showcase 保存三名成员

字段运行结果
Player Units按顺序保存 GamePlayerUnit;添加、删除或拖动最多三行,第 1 行是主角色,行顺序直接映射槽位 0–2

行顺序映射 Battle Board 的槽位 0、1、2。运行时仍使用稳定 Unit Id;死亡、复活和增援不会改写已有成员身份。全队共享一次玩家阶段、一份 Hand、一组牌堆和一份能量,Active Player 只决定当前行动来源

队伍仍然共用一个玩家阶段,当前激活成员决定没有显式来源时由谁行动,点击 Demo 中任一存活玩家可以切换激活成员,三种资源模式与卡牌 Owner、Source、Resource Owner 的关系见玩家队伍

Enemy Units​

玩家队伍确定后,在 Enemy Units 中加入 Strawman,当前配置会显示槽位 1、Normal Tier 与 14–18 HP

The Threshing Field 的 Enemy Units 配置,槽位 1 为 Strawman,Normal,HP 14–18

提示

上图中的每一行都代表一个独立战斗槽位,同一个敌人添加两次会在运行时创建两个单位,拖动行可以调整槽位顺序,选择按钮可以替换当前敌人,打开按钮会切换到 Enemy 模式,× 会移除当前槽位,运行时会按照槽位顺序创建敌人,敌人阶段也会按同一顺序执行各单位的行动,战斗启动时,每个 Strawman 实例的实际 HP 会从 14–18 中随机确定

场景布局和单位 View 应当保持相同的槽位映射,避免画面顺序与实际行动顺序脱节,敌人创作说明了 HP 范围、Intent 与 Behavior 怎样共同定义每个槽位中的敌人

配置奖励与战斗规则​

参战双方确定后,Reward Deck 会决定胜利时可以生成哪些卡牌候选,Battle Rules 则会决定开局资源、回合抽牌、手牌处理、Intent 显示与奖励数量

Reward Deck​

在 Reward Deck 中选择 Spoils of Battle,卡片会显示卡组名称、11 cards 与 1.73 平均费用

The Threshing Field 的 Reward Deck 配置,Spoils of Battle 显示 11 cards 与 1.73 平均费用

提示
  • 需要调整 Reward Deck 引用时,选择按钮可以替换奖励卡组,打开按钮会切换到 Deck 模式,× 会清空当前引用

  • 每个 Reward Deck Entry 的 Copies 都会提供对应卡牌的抽取权重,Card Reward Count 则会决定本次请求的候选数量,运行时会据此带权且不重复地抽取条目

  • 实际候选数量不会超过有效条目数,参与计算的 Copies 与 Card Reward Count 低于 1 时都会按 1 处理

Reward Deck 缺失或没有有效条目时不会产生卡牌候选,但胜利流程仍会进入奖励等待,项目的奖励 UI 需要提交其他奖励或调用 GCSApi.SkipReward(),本场胜利流程才会结束,候选生成与四类奖励结果见战斗循环

Battle Rules​

奖励池只决定胜利后可以出现哪些卡牌,Battle Rules 则会把开局资源与手牌上限的创作基值、回合循环规则、Intent 显示范围和可供项目表现层读取的节奏参数保存在当前 Encounter 中

规则运行结果
Starting Hand Size战斗初始化时请求的起手数量,最小为 0,Innate 卡牌会优先参与起手抽取,OnDrawCards Hook 可以改写请求数量,最终进入手牌的数量仍受手牌上限约束
Draw Per Turn从第 2 回合开始,每次 PlayerTurnStart 请求抽取的卡牌数,最小为 0,实际抽取数仍会经过 OnDrawCards Hook
Max Hand Size手牌上限的创作基值,最小为 1,OnHandSizeLimit Hook 会解析最终上限,开局与回合抽牌会把超出部分送入弃牌堆,其他抽牌调用达到上限后会停止
Starting Energy大于 0 时作为每回合基础能量,0 会改用玩家角色的 Base Energy,随后仍会叠加 Run Energy Bonus 并经过 Energy Per Turn Hook
Card Reward Count胜利时请求的卡牌候选数,存在有效 Reward Deck 时,运行时会把低于 1 的值按 1 处理
Armor DecayResetOnTurnStart 会在玩家回合开始和每个敌人行动开始时处理护甲重置,Persist 会保留护甲,Armor Reset Hook 仍可以改写或取消结果
Hand Discard回合结束时先把 Ethereal 手牌移入 Exhaust Pile,DiscardOnTurnEnd 再保留 Retain 并弃掉其余手牌,Persist 会保留剩余手牌
Enemy Intent DisplayHidden 不发送 OnEnemyUnitIntentChanged,IconOnly 会发送标签但把数值设为 -1,Full 会同时发送标签与数值,GCSApi.PendingIntents 仍可读取原始 Intent
Animation Gap以秒保存并显示在 Preview 中的表现节奏参数,项目表现层可以读取该值,当前内置状态机不会据此自动插入等待

The Threshing Field 将 Starting Hand Size 与 Draw Per Turn 都设为 5,将 Max Hand Size 设为 10,并将 Enemy Intent Display 设为 Full

Starting Energy 为 0,因此 Squire 的 3 点 Base Energy 会成为每回合能量的计算起点

The Threshing Field 的 Battle Rules 配置,起手 5 张、每回合抽 5 张、能量 0、奖励 3

状态机会在初始化阶段应用 Starting Hand Size,第一回合不会再叠加一次 Draw Per Turn,从第 2 回合开始,状态机才会在 PlayerTurnStart 应用每回合抽牌规则,完整执行顺序见战斗阶段与执行顺序

检查遭遇战预览​

完成 Inspector 配置后,Preview 会直接呈现当前 Encounter 的身份、阵容与规则摘要,进入 Play Mode 前即可核对引用和数值是否一致

显示信息​

Display 会把 16:9 Icon、Name、Description 与 Difficulty 组合成一张玩家可识别的遭遇战信息卡,先确认画面与文字确实描述当前战斗

The Threshing Field 的 Display 预览,显示背景、名称、说明与 Normal 难度

The Threshing Field 的横幅、名称、场景说明与 Normal 已经保持一致,继续在 Lineup 中核对 Player 与 Enemy Units 是否属于同一场战斗

参战阵容​

Lineup 会把当前 Player 与按槽位顺序排列的 Enemy Units 放在同一块预览中,直接呈现这场战斗的完整阵容

The Threshing Field 的 Lineup 预览,Squire 以 70 HP 对战 HP 14–18 的 Strawman

当前阵容已经确认为 Squire 对战 Strawman,战斗启动时,运行时会从预览所示区间内确定敌人的实际 HP

Player 引用、槽位数量和排列顺序共同决定实际参战阵容,三项都与遭遇战身份一致后,Preview 中的 Battle Rules 才能作为这套阵容的规则摘要继续核对

战斗规则​

阵容正确后,Preview 中的 Battle Rules 会将九项规则汇总为标签,需要对比多场遭遇战时,可以直接核对手牌、抽牌、能量、奖励、护甲、弃牌、Intent 与表现参数

The Threshing Field 的 Battle Rules 预览,显示 Hand 5、Draw 5、Energy 0、Reward 3 等九项标签

这些标签与 Inspector 使用同一份 BattleRules 数据,Inspector 中的任何字段改动都会同步到对应标签,逐项对照即可确认规则摘要与输入值一致

引用状态​

Encounter 在 GCS 内容模型中属于由外部入口直接启动的顶层内容,不会作为子配置嵌套在另一份创作资产中,因此 Used By 会固定显示它没有父级内容资产

The Threshing Field 的 Used By,说明 Encounter 是不被其他内容资产引用的顶层对象

提示

Used By 对 GameEncounter 只显示内容模型中的固定顶层提示,不会扫描场景中的 Bootstrap 或项目代码,实际启动入口仍需要在场景与项目流程中单独配置,固定场景可以保存 Encounter 引用,地图、任务和关卡流程则可以在运行时选择任意一场已创作的战斗

校验并启动遭遇战​

Game Card Editor 会在编辑和保存时检查双方阵容、玩家槽位、分类与奖励配置。Error 表示阵容无效,Warning 表示分类或奖励尚未补全;校验不会拦截 StartBattle

级别条件需要完成的配置
ErrorPlayer Unit 1 为空在 Player Units 中选择角色
ErrorPlayer Units 或 Enemy Units 超过三行删除多余单位
Error后续 Player Units 行没有角色为该行选择 Player Unit
Error外部序列化数据中的玩家槽位越界或重复重新排序或保存 Player Units
ErrorEnemy Units 中没有任何非空敌人至少加入一个有效敌人槽位
WarningReward Deck 为空需要卡牌候选时选择一份有效奖励卡组
WarningDifficulty 为空选择内置难度或填写项目自定义标签
提示

校验不会判断 Reward Deck 是否包含有效条目,也不会检查场景是否已经配置可用的 Manager、启动入口与表现层;消除表中的问题后,还要继续检查奖励池内容与场景入口

常见校验信息和修复路径见内容创作错误

校验完成后,固定战斗场景可以用 GameCardEncounterBootstrap 保存当前 Encounter,地图、任务或关卡流程则可以在 GCSApi.IsReady 后调用 GCSApi.StartBattle(encounter),两种入口都依赖场景中可用的 GameCardManager

提示

以 The Threshing Field 启动战斗后,运行时会按其中的玩家、敌人顺序、奖励池和 Battle Rules 创建单位与牌堆、抽取起手牌、解析首组 Intent,并进入第一个玩家回合,场景中的棋盘、单位 View 与手牌 UI 随后会把这些运行状态呈现为可以操作的战场

Bootstrap 的 Default Encounter、Auto Start On Play 与动态入口生命周期见战斗启动,Manager、棋盘、单位 View、手牌 UI 与 Choice Presenter 的职责见战斗场景

进入 Play Mode 后,在 Game Card Monitor 中核对 Battle、Pile、Unit 与 Phase,当前 Encounter、玩家、敌人顺序、起手数量、能量、Intent 与阶段转换都应对应 The Threshing Field

由外部系统读取或启动遭遇战的完整接口见 GCSApi 与战斗控制