设置你的第一场战斗
本指南将展示如何配置遭遇区域、触发野生战斗以及理解战斗流程。完成后,你将拥有一个可在编辑器中测试的可运行战斗。
前提条件
- MCE 已安装且设置向导已完成。
- 数据库中至少有一只怪兽(内置的 151 只或你自己创建的)。
- 你有一个包含玩家角色和基于网格的 Tilemap 的场景。
步骤 1:创建遭遇区域
野生战斗由 Tilemap 上的遭遇地块触发。以下是设置方法:
- 在场景层级中,选择你希望出现遭遇的 Tilemap 图层(通常是"Grass"或"TallGrass"图层)。
- 在网格下创建一个新的空 GameObject:
右键 > Create Empty,命名为GrassEncounters。 - 为此 GameObject 添加 EncounterTile 组件。
- 使用基于地块的坐标将其定位到应该发生遭遇的地块上。
或者,你可以使用 MCE 的遭遇地块类型直接在专用的 Tilemap 图层上绘制遭遇区域。
步骤 2:配置遭遇表
EncounterTile 组件引用一个 WildEncountersSet ScriptableObject。创建方法:
Assets > Create > OpenMon > Wild Encounters Set- 为其取一个描述性名称,例如
Route1_GrassEncounters。 - 打开该 ScriptableObject 并配置遭遇:
| 字段 | 描述 |
|---|---|
| Monster | 可以出现的物种的 MonsterEntry ScriptableObject |
| Min Level | 野生怪兽的最低等级 |
| Max Level | 野生怪兽的最高等级 |
| Probability | 遭遇权重(越高 = 越常见) |
| Encounter Type | 此遭遇的触发方式(Walking、Surfing、Fishing 等) |
添加多个条目以创造多样性。例如:
| 怪兽 | 等级范围 | 概率 |
|---|---|---|
| Flameleon | 3-5 | 40 |
| Leaflet | 3-5 | 40 |
| Sparkit | 4-6 | 20 |
- 将此
WildEncountersSet分配给你的EncounterTile组件的 Encounters 字段。
步骤 3:设置战斗场景
MCE 使用一个专用的战斗场景,在战斗开始时以叠加方式加载。你需要:
- 大世界场景中的 BattleLauncher 组件。这通常在一个持久化的管理器 GameObject 上。如果你使用了设置向导,它应该已经存在。
- 一个在构建设置中配置的战斗场景。MCE 附带了默认的战斗场景。
BattleLauncher 处理场景切换:
- 屏幕淡出。
- 以叠加方式加载战斗场景。
- 使用正确的参数实例化
BattleManager。 - 战斗结束后返回大世界。
BattleManager 组件
BattleManager 是战斗系统的核心。在战斗场景中,你会找到一个带有 BattleManager 组件的 GameObject,它使用模块化架构,包含以下关键模块:
| 模块 | 用途 |
|---|---|
| BattlersModule | 管理双方的战斗单位实例 |
| HealthModule | HP 追踪、濒死、治疗 |
| MovesModule | 招式执行、PP 追踪、属性克制 |
| ItemsModule | 战斗中使用道具 |
| CaptureModule | 野生怪兽捕获机制 |
| AIModule | 敌 方决策 |
| AnimationModule | 战斗动画和视觉效果 |
| AudioModule | 战斗音乐和音效 |
| StatusesModule | 状态异常(灼伤、中毒、睡眠等) |
| BattlerStatsModule | 能力值等级和修改 |
| BattlerSwitchModule | 队伍成员切换 |
| RostersModule | 战斗中的队伍管理 |
| ScenariosModule | 战斗类型配置(野生、训练师等) |
| MegaModule | Mega 进化激活 |
| CharactersModule | 训练师精灵图显示 |
你不需要单独配置这些模块。BattleManager 通过 Zenject 依赖注入自动将所有模块连接在一起。
步骤 4:配置 BattleStateMachine
BattleStateMachine 驱动战斗流程:
Start → Introduction → Turn Selection → Action Execution →
→ Check Fainted → Replace Fainted → Turn End →
→ [循环回到 Turn Selection 或] → Battle End → Results
状态机已在战斗场景预制体中预先配置。每个状态根据战斗条件自动处理转换。
步骤 5:测试战斗
-
确保你的大世界场景包含:
- 一个 PlayerCharacter,其队伍中至少有一只怪兽。
- 一个配置了
WildEncountersSet的 EncounterTile。 - 管理器 GameObject 上的 BattleLauncher。
-
在编辑器中按下 Play。
-
将你的角色走进遭遇区域。
-
走几步后(由遭遇率决定),战斗将触发。
快速测试
要立即测试战斗而无需四处走动,你可以:
- 将
EncounterTile上的遭遇率设为 100%。 - 或直接使用
BattleLauncher组件 ,从测试脚本调用其启动方法。
理解战斗流程
当战斗开始时,底层发生以下操作:
- BattleLauncher 从
EncounterTile接收遭遇触发。 - 使用野生怪兽的数据创建
BattleParameters对象。 - 以叠加方式加载战斗场景。
BattleManager初始化所有模块。BattleStateMachine进入开场状态(展示野生怪兽,播放叫声)。- 向玩家展示行动选择:战斗、背包、怪兽、逃跑。
- 行动按速度顺序执行。
- 循环持续进行,直到一方倒下或玩家逃跑/捕获成功。
BattleResultParameters被发送回大世界(获得的经验值、使用的道具、捕获的怪兽等)。- 战斗场景卸载,大世界恢复。
战斗类型
MCE 开箱即用支持多种战斗类型:
| 类型 | 描述 |
|---|---|
| Wild | 单只野生怪兽遭遇,可以捕获 |
| Trainer | NPC 训练师战斗,不能捕获,获胜奖励金钱 |
| Double | 二对二的战斗形式 |
| Scripted | 带有特殊条件的剧情战斗 |
战斗类型由传入 BattleParameters 的 BattleType 枚举决定。
监听战斗事件(DLL 用户)
如果你使用的是 Lite、Basic 或 Pro 版本(无源代码),仍然可以通过 SDK 响应战斗事件:
using OpenMon.MCE.SDK;
public class MyBattleTracker : MonoBehaviour
{
[Inject] private IBattleSystem battleSystem;
private void OnEnable()
{
battleSystem.OnBattleStarted += HandleBattleStarted;
battleSystem.OnBattleEnded += HandleBattleEnded;
}
private void OnDisable()
{
battleSystem.OnBattleStarted -= HandleBattleStarted;
battleSystem.OnBattleEnded -= HandleBattleEnded;
}
private void HandleBattleStarted()
{
Debug.Log("A battle has started!");
}
private void HandleBattleEnded(bool playerWon)
{
Debug.Log($"Battle ended. Player won: {playerWon}");
}
}
有关无源代码扩展 MCE 的更多信息,请参阅公共 API 指南。
故障排除
| 问题 | 解决方案 |
|---|---|
| 战斗没有触发 | 检查 EncounterTile 是否分配了有效的 WildEncountersSet |
| 遭遇后黑屏 | 验证战斗场景是否在构建设置的场景列表中 |
| 怪兽出现时等级为 0 | 确保在遭遇表中设置了 Min Level 和 Max Level |
| 没有战斗音乐 | 检查 BattleManagerAudioModule 是否分配了音频片段 |
| 战斗开始时崩溃 | 运行 MCE > Tools > Asset Validation 检查缺失的数据库引用 |