跳到主要内容

设置你的第一场战斗

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

前提条件

  • MCE 已安装且设置向导已完成。
  • 数据库中至少有一只怪兽(内置的 151 只或你自己创建的)。
  • 你有一个包含玩家角色和基于网格的 Tilemap 的场景。

步骤 1:创建遭遇区域

野生战斗由 Tilemap 上的遭遇地块触发。以下是设置方法:

  1. 在场景层级中,选择你希望出现遭遇的 Tilemap 图层(通常是"Grass"或"TallGrass"图层)。
  2. 在网格下创建一个新的空 GameObject:右键 > Create Empty,命名为 GrassEncounters
  3. 为此 GameObject 添加 EncounterTile 组件。
  4. 使用基于地块的坐标将其定位到应该发生遭遇的地块上。

或者,你可以使用 MCE 的遭遇地块类型直接在专用的 Tilemap 图层上绘制遭遇区域。

步骤 2:配置遭遇表

EncounterTile 组件引用一个 WildEncountersSet ScriptableObject。创建方法:

  1. Assets > Create > OpenMon > Wild Encounters Set
  2. 为其取一个描述性名称,例如 Route1_GrassEncounters
  3. 打开该 ScriptableObject 并配置遭遇:
字段描述
Monster可以出现的物种的 MonsterEntry ScriptableObject
Min Level野生怪兽的最低等级
Max Level野生怪兽的最高等级
Probability遭遇权重(越高 = 越常见)
Encounter Type此遭遇的触发方式(Walking、Surfing、Fishing 等)

添加多个条目以创造多样性。例如:

怪兽等级范围概率
Flameleon3-540
Leaflet3-540
Sparkit4-620
  1. 将此 WildEncountersSet 分配给你的 EncounterTile 组件的 Encounters 字段。

步骤 3:设置战斗场景

MCE 使用一个专用的战斗场景,在战斗开始时以叠加方式加载。你需要:

  1. 大世界场景中的 BattleLauncher 组件。这通常在一个持久化的管理器 GameObject 上。如果你使用了设置向导,它应该已经存在。
  2. 一个在构建设置中配置的战斗场景。MCE 附带了默认的战斗场景。

BattleLauncher 处理场景切换:

  • 屏幕淡出。
  • 以叠加方式加载战斗场景。
  • 使用正确的参数实例化 BattleManager
  • 战斗结束后返回大世界。

BattleManager 组件

BattleManager 是战斗系统的核心。在战斗场景中,你会找到一个带有 BattleManager 组件的 GameObject,它使用模块化架构,包含以下关键模块:

模块用途
BattlersModule管理双方的战斗单位实例
HealthModuleHP 追踪、濒死、治疗
MovesModule招式执行、PP 追踪、属性克制
ItemsModule战斗中使用道具
CaptureModule野生怪兽捕获机制
AIModule敌方决策
AnimationModule战斗动画和视觉效果
AudioModule战斗音乐和音效
StatusesModule状态异常(灼伤、中毒、睡眠等)
BattlerStatsModule能力值等级和修改
BattlerSwitchModule队伍成员切换
RostersModule战斗中的队伍管理
ScenariosModule战斗类型配置(野生、训练师等)
MegaModuleMega 进化激活
CharactersModule训练师精灵图显示

你不需要单独配置这些模块。BattleManager 通过 Zenject 依赖注入自动将所有模块连接在一起。

步骤 4:配置 BattleStateMachine

BattleStateMachine 驱动战斗流程:

Start → Introduction → Turn Selection → Action Execution →
→ Check Fainted → Replace Fainted → Turn End →
→ [循环回到 Turn Selection 或] → Battle End → Results

状态机已在战斗场景预制体中预先配置。每个状态根据战斗条件自动处理转换。

步骤 5:测试战斗

  1. 确保你的大世界场景包含:

    • 一个 PlayerCharacter,其队伍中至少有一只怪兽。
    • 一个配置了 WildEncountersSetEncounterTile
    • 管理器 GameObject 上的 BattleLauncher
  2. 在编辑器中按下 Play

  3. 将你的角色走进遭遇区域。

  4. 走几步后(由遭遇率决定),战斗将触发。

快速测试

要立即测试战斗而无需四处走动,你可以:

  1. EncounterTile 上的遭遇率设为 100%。
  2. 或直接使用 BattleLauncher 组件,从测试脚本调用其启动方法。

理解战斗流程

当战斗开始时,底层发生以下操作:

  1. BattleLauncherEncounterTile 接收遭遇触发。
  2. 使用野生怪兽的数据创建 BattleParameters 对象。
  3. 以叠加方式加载战斗场景。
  4. BattleManager 初始化所有模块。
  5. BattleStateMachine 进入开场状态(展示野生怪兽,播放叫声)。
  6. 向玩家展示行动选择:战斗背包怪兽逃跑
  7. 行动按速度顺序执行。
  8. 循环持续进行,直到一方倒下或玩家逃跑/捕获成功。
  9. BattleResultParameters 被发送回大世界(获得的经验值、使用的道具、捕获的怪兽等)。
  10. 战斗场景卸载,大世界恢复。

战斗类型

MCE 开箱即用支持多种战斗类型:

类型描述
Wild单只野生怪兽遭遇,可以捕获
TrainerNPC 训练师战斗,不能捕获,获胜奖励金钱
Double二对二的战斗形式
Scripted带有特殊条件的剧情战斗

战斗类型由传入 BattleParametersBattleType 枚举决定。

监听战斗事件(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 检查缺失的数据库引用

下一步