Настройте своё первое сражение
Это руководство покажет, как настроить зону встреч, запустить дикое сражение и понять ход сражения. К концу у вас будет работающее сражение, которое можно протестировать в редакторе.

Вот к чему вы идёте: дикая встреча, которая запускается с тайла травы, с меню из четырёх действий и соперником, выбранным таблицей встреч.
Предварительные требования
- 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: Настройте таблицу встреч
В траве живёт ScriptableObject WildEncountersSet, а SceneInfo карты решает, какой набор отвечает за какой тип встречи. Создайте набор:
Assets > Create > MCE > Battle > Encounters > WildEncountersSet(или кнопка New Wild Encounter Set на вкладке Database в Hub).- Дайте ему описательное имя, например
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 — сердце боевой системы. В сцене сражения вы найдёте GameObject с компонентом BattleManager. Ему требуются пятнадцать модуле й рядом, каждый — MonoBehaviour на том же GameObject, плюс BattleStateMachine:
| Модуль | Назначение |
|---|---|
| BattleManagerBattlersModule | Поиск бойцов на обеих сторонах, спрайты, формы, бегство |
| BattleManagerHealthModule | Изменения HP, обнаружение и обработка потери сознания |
| BattleManagerMovesModule | Выполнение приёмов, точность |
| BattleManagerItemsModule | Использование предметов в сражении |
| BattleManagerCaptureModule | Механика поимки диких монстров |
| BattleManagerAIModule | Принятие решений противником |
| BattleManagerAnimationModule | Вступление сражения и анимации хода |
| BattleManagerAudioModule | Музыка и звуковые эффекты сражения |
| BattleManagerStatusesModule | Статусные состояния (ожог, яд, сон и т. д.) |
| BattleManagerBattlerStatsModule | Ступени характеристик и их изменения |
| BattleManagerBattlerSwitchModule | Выпуск и отзыв бойцов |
| BattleManagerRostersModule | Управление командой во время сражения |
| BattleManagerScenariosModule | Погода, местность и настройка сценария |
| BattleManagerMegaModule | Мега-эволюция |
| 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 в редакторе.
-
Проведите персонажа по тайлам встреч.
-
Через несколько шагов (определяется шансом встречи) запустится сражение.
Шанс на шаг берётся из таблицы TileEncounterChance вашего ассета MCESettings (одно значение на тип встречи), если только SceneInfo карты не определяет собственный шанс для этого типа. Чтобы тестировать сражения сразу, не бродя по карте, задайте шанс тестируемого типа равным 1 (100 %).
Понимание хода сражения
Когда начинается сражение, под капотом происходит следующее:
- Игрок наступает на
EncounterTile; шаг проверяется по шансу для этого Encounter Type. - Соответствующий
WildEncountersSetкарты выдаёт возможные встречи для текущего времени суток и погоды; одна выбирает ся по весу, а уровень выбирается из её диапазона. - Создаётся объект
BattleParametersс данными дикого монстра, иBattleLauncherзагружает сцену сражения аддитивно. BattleManagerинициализирует все модули.- Проигрывается вступление сражения.
- Игроку предлагаются действия: Fight, Bag, Monster, Run.
- Действия выполняются в порядке приоритета и скорости.
- Цикл продолжается, пока одна сторона не потеряет сознание или игрок не убежит/не поймает монстра.
BattleResultParametersвозвращаются в мир (кто победил, пойманный монстр, флаг возрождения).- Сцена сражения выгружается, и мир продолжается.
Типы сражений
Два перечисления описывают, чем является сражение:
| Перечисление | Значения | Значение |
|---|---|---|
BattleType | SingleBattle, DoubleBattle | Один монстр с каждой стороны или два |
EnemyType | Wild, Trainer | Дикий монстр (можно поймать) или NPC-тренер (поймать нельзя, платит призовые) |
Оба передаются в BattleParameters и доступны в BattleManager.
Подписка на события сражения
Реагируйте на события сражения, не привязывая свой игровой код к внутренностям. Лаунчер сражений привязан в системе внедрения зависимостей, поэтому на него может подписаться любой скрипт:
using OpenMon.MCE.Battle;
public class MyBattleTracker : MonoBehaviour
{
[Inject] private IBattleLauncher battleLauncher;
private void OnEnable()
{
battleLauncher.SubscribeToBattleLaunched(HandleBattleLaunched);
battleLauncher.SubscribeToBattleEnded(HandleBattleEnded);
}
private void OnDisable()
{
battleLauncher.UnsubscribeFromBattleLaunched(HandleBattleLaunched);
battleLauncher.UnsubscribeFromBattleEnded(HandleBattleEnded);
}
private void HandleBattleLaunched()
{
Debug.Log("A battle has been launched!");
}
private void HandleBattleEnded(BattleResultParameters result)
{
Debug.Log($"Battle ended. Player won: {result.PlayerWon}");
}
}
battleLauncher.BattleInProgress сообщает, идёт ли сражение. SDK также предлагает IBattleSystem (engine.Battle) с OnBattleStarted и OnBattleEnded, но его хуки в движке пока не подключены; см. Руководство по публичному API и IBattleSystem.
Устранение неполадок
| Проблема | Решение |
|---|---|
| Сражение не запускается | Проверьте, что у тайла есть EncounterTile с нужным Encounter Type, что в SceneInfo карты есть WildEncountersSet для этого типа и что в TileEncounterChance есть значение для него (отсутствующий тип считается равным 0 и один раз пишет предупреждение) |
| Чёрный экран после встречи | Убедитесь, что сцена сражения есть в списке сцен Build Settings и указана в BattleLauncher |
| Монстр появляется на уровне 0 | Убедитесь, что Min Level и Max Level заданы в записи встречи |
| Нет боевой музыки | Проверьте, что в BattleLauncher есть музыка в списках диких/тренерских сражений и что в BattleManagerAudioModule назначено аудио |
| Вылеты при начале сражения | Откройте OpenMon Hub → вкладка Database → Validate Database, чтобы найти отсутствующие ссылки базы данных |
Следующие шаги
- Подробно о боевой системе -- Изучите всю архитектуру сражений.
- Система приёмов -- Разберитесь в системе приёмов.
- ИИ сражений -- Настройте и кастомизируйте ИИ противника.