设置你的第一场战斗
本指南向你展示如何配置遭遇区域、触发野生战斗并理解战斗流程。完成后,你将拥有一场可以在编辑器中测试的可运行战斗。

这就是你要构建的目标:一场从草地图块触发的野生遭遇,带有 四个操作的菜单,以及由遭遇表选出的对手。
前提条件
- 已安装 MCE 并完成设置向导。
- 你的数据库中至少有一只怪物(演示项目的或你自己创建的)。
- 你有一个带有玩家角色和基于网格的瓦片地图的场景,以及该地图的
SceneInfo资产。
步骤 1:创建遭遇区域
野生战斗由瓦片地图上的遭遇图块触发。遭遇图块是预制体带有 EncounterTile 组件的普通图块;该组件只有一项设置 Encounter Type,用于指定图块触发哪种遭遇:Grass、Water、Surfing、Cave、FishingOldRod、FishingGoodRod、FishingSuperRod、Diving、RockSmash、HeadButt、BugContest 或 Other。
- 使用遭遇图块预制体 -- 引擎附带现成的,例如
Assets/OpenMon/Game/Prefabs/World/Water/Water/WaterEncounterTile.prefab-- 或自己制作:创建一个预制体,添加EncounterTile组件并选择它的 Encounter Type。 - 让该预制体成为一个图块资产的 GameObject,并把图块绘制在应当出现野生怪物的瓦片地图图层上(通常 是你的 “Grass” 图层)。
玩家每走上这样的图块一步,都会按遭遇几率进行判定。在 SceneInfo 被标记为地下城的场景中,每走过的一个图块都算作 Cave 遭遇,无需绘制图块。
步骤 2:配置遭遇表
草丛里的内容是一个 WildEncountersSet ScriptableObject,而地图的 SceneInfo 决定哪个集合对应哪种遭遇类型。创建该集合:
Assets > Create > MCE > Battle > Encounters > WildEncountersSet(或 Hub 的 Database 选项卡中的 New Wild Encounter Set 按钮)。- 给它起一个描述性的名称,比如
Route1_GrassEncounters。 - 填写它的三个列表:
| 列表 | 含义 |
|---|---|
| Base Encounters | 总会出现的怪物 |
| Encounters Per Moment | 某个时段额外出现的怪物:Night、Dawn、Day 或 Dusk |
| Encounters Per Weather | 在某种战斗外天气下额外出现的怪物 |
每个条目是一个 WildEncounter:
| 字段 | 说明 |
|---|---|
| Monster | 可以出现的 MonsterEntry |
| Form Calculator | 选择形态的资产(SingleFormEncounter 总是返回一种形态) |
| Min Level / Max Level | 野生怪物的等级范围(1-100;最大值不能低于最小值) |
| Weight | 该条目的相对几率(越高越常见) |
例如:
| 怪物 | 等级范围 | 权重 |
|---|---|---|
| Flameleon | 3-5 | 40 |
| Leaflet | 3-5 | 40 |
| Sparkit | 4-6 | 20 |
- 打开你地图的
SceneInfo资产,在它的 Encounters 组中,为遭遇类型(例如Grass)添加条目并分配你的WildEncountersSet。没有该条目,地图就没有该类型的野生怪物。
步骤 3:设置战斗场景
MCE 使用一个专用的战斗场景,在战斗开始时以叠加方式加载到世界场景之上。你需要:
- 一个
BattleLauncher资产。它是一个 ScriptableObject(Create > MCE > Battle > Launcher),通过BattleLauncherInstaller绑定,而不是你场景的组件。它的 Battle Scene 字段指向战斗场景,并保存战斗音乐列表。项目设置中已经包含一个。 - 构建设置中的战斗场景。默认的那个(
Battle.unity,位于Assets/OpenMon/Core/Game/Scenes/)随 MCE 附带。
BattleLauncher 负责过渡:
- 构建一个
BattleParameters对象(战斗类型、敌人类型、队伍、角色、场景设定、天气)。 - 以叠加方式加载战斗场景。
- 把参数交给该场景中的
BattleManager。 - 战斗结束时卸载场景并返回世界。
BattleManager 组件
BattleManager 是战斗系统的核心。在战斗场景中,你会找到一个带有 BattleManager 组件的 GameObject。它旁边需要十五个模块,每个都是同一 GameObject 上的 MonoBehaviour,外加 BattleStateMachine:
| 模块 | 用途 |
|---|---|
| BattleManagerBattlersModule | 双方战斗者的查找、精灵、形态、逃跑 |
| BattleManagerHealthModule | HP 变化、濒死检测与处理 |
| BattleManagerMovesModule | 招式执行、命中 |
| BattleManagerItemsModule | 战斗中的道具使用 |
| BattleManagerCaptureModule | 野生怪物的捕捉机制 |
| BattleManagerAIModule | 敌方的决策 |
| BattleManagerAnimationModule | 战斗开场与流程动画 |
| BattleManagerAudioModule | 战斗音乐与音效 |
| BattleManagerStatusesModule | 异常状态(灼伤、中毒、睡眠等) |
| BattleManagerBattlerStatsModule | 能力等级及其变化 |
| BattleManagerBattlerSwitchModule | 战斗者的上场与下场 |
| BattleManagerRostersModule | 战斗中的队伍管理 |
| BattleManagerScenariosModule | 天气、地形和场景设定 |
| BattleManagerMegaModule | Mega 进化 |
| BattleManagerCharactersModule | 训练师角色 |
你不需要逐个配置它们。每个模块通过 BattleManager 访问其同级模块,其余接线来自 Zenject 依赖注入。
步骤 4:了解战斗循环
BattleStateMachine 把战斗作为一个每回合重复的循环来驱动,直到战斗结束:
Update fought battlers → Request actions (player menu / AI) →
→ Determine action order → Perform actions →
→ End-of-turn callbacks and status countdown →
→ Check and process fainted battlers → [next turn]
... until IsBattleOver → end animation, prize/defeat money, end callbacks
该循环是战斗预制体的一部分;你无需配置它。要理解或修改它,请参见战斗内部机制。
步骤 5:测试战斗
-
确保你的世界场景中有:
- 一个 PlayerCharacter,其队伍中至少有一只怪物。
- 绘制在瓦片地图上的遭遇图块。
- 一个
SceneInfo,其针对该类型的 Encounters 条目指向已配置的WildEncountersSet。
-
在编辑器中按 Play。
-
让你的角色走到遭遇图块上。
-
走几步之后(由遭遇几率决定)会触发战斗。
每步的几率来自你的 MCESettings 资产的 TileEncounterChance 表(每种遭遇类型一个值),除非地图的 SceneInfo 为该类型定义了自己的几率。要不走动就立即测试战斗,请把你正在测试的类型的几率设为 1(100%)。