Configura tu primera batalla
Esta guía te muestra cómo configurar una zona de encuentros, disparar una batalla salvaje y comprender el flujo de la batalla. Al final tendrás una batalla funcional que puedes probar en el editor.

Eso es lo que estás construyendo: un encuentro salvaje que se dispara desde un tile de hierba, con un menú de cuatro acciones y un rival elegido por la tabla de encuentros.
Requisitos previos
- MCE está instalado y el asistente de configuración se completó.
- Tienes al menos un monstruo en tu base de datos (el del proyecto de demo o uno que creaste).
- Tienes una escena con un personaje jugador y un tilemap basado en cuadrícula, y un asset
SceneInfopara ese mapa.
Paso 1: Crear una zona de encuentros
Las batallas salvajes se disparan con tiles de encuentro en tu tilemap. Un tile de encuentro es un tile corriente cuyo prefab lleva el componente EncounterTile; el componente tiene un único ajuste, Encounter Type, que indica qué tipo de encuentro inicia el tile: Grass, Water, Surfing, Cave, FishingOldRod, FishingGoodRod, FishingSuperRod, Diving, RockSmash, HeadButt, BugContest u Other.
- Usa un prefab de tile de encuentro (el motor trae algunos ya hechos, por ejemplo
Assets/OpenMon/Game/Prefabs/World/Water/Water/WaterEncounterTile.prefab) o crea el tuyo: crea un prefab, agrega el componenteEncounterTiley elige su Encounter Type. - Haz que ese prefab sea el GameObject de un asset de tile y pinta el tile en la capa del tilemap donde deben aparecer los monstruos salvajes (normalmente tu capa "Grass").
Cada paso que el jugador da sobre uno de esos tiles se evalúa contra la probabilidad de encuentro. En una escena cuyo SceneInfo esté marcado como dungeon, cada tile recorrido cuenta como un encuentro Cave sin necesidad de tiles pintados.
Paso 2: Configurar la tabla de encuentros
Lo que vive en la hierba es un ScriptableObject WildEncountersSet, y el SceneInfo del mapa decide qué conjunto responde a qué tipo de encuentro. Crea el conjunto:
Assets > Create > MCE > Battle > Encounters > WildEncountersSet(o el botón New Wild Encounter Set en la pestaña Database del Hub).- Ponle un nombre descriptivo, como
Route1_GrassEncounters. - Rellena sus tres listas:
| Lista | Significado |
|---|---|
| Base Encounters | Monstruos que siempre aparecen |
| Encounters Per Moment | Monstruos extra para un momento del día: Night, Dawn, Day o Dusk |
| Encounters Per Weather | Monstruos extra bajo un clima determinado fuera de batalla |
Cada entrada es un WildEncounter:
| Campo | Descripción |
|---|---|
| Monster | El MonsterEntry que puede aparecer |
| Form Calculator | El asset que elige la forma (SingleFormEncounter siempre devuelve una forma) |
| Min Level / Max Level | Rango de nivel del monstruo salvaje (1-100; el máximo nunca puede ser menor que el mínimo) |
| Weight | Probabilidad relativa de esta entrada (más alto = más común) |
Por ejemplo:
| Monstruo | Rango de nivel | Peso |
|---|---|---|
| Flameleon | 3-5 | 40 |
| Leaflet | 3-5 | 40 |
| Sparkit | 4-6 | 20 |
- Abre el asset
SceneInfode tu mapa y, en su grupo Encounters, agrega la entrada para el tipo de encuentro (por ejemploGrass) y asigna tuWildEncountersSet. Sin esa entrada, el mapa no tiene monstruos salvajes para ese tipo.
Paso 3: Configurar la escena de batalla
MCE usa una escena de batalla dedicada que se carga de forma aditiva sobre el mundo cuando empieza una batalla. Necesitas:
- Un asset
BattleLauncher. Es un ScriptableObject (Create > MCE > Battle > Launcher) enlazado mediante elBattleLauncherInstaller, no un componente de tu escena. Su campo Battle Scene apunta a la escena de batalla y contiene las listas de música de batalla. La configuración del proyecto ya incluye uno. - La escena de batalla en tus ajustes de compilación. La predeterminada (
Battle.unity, enAssets/OpenMon/Core/Game/Scenes/) viene incluida con MCE.
El BattleLauncher gestiona la transición:
- Construye un objeto
BattleParameters(tipo de batalla, tipo de enemigo, equipos, personajes, escenario, clima). - Carga la escena de batalla de forma aditiva.
- Entrega los parámetros al
BattleManagerde esa escena. - Descarga la escena y vuelve al mundo cuando termina la batalla.
Componentes de BattleManager
El BattleManager es el corazón del sistema de batalla. En la escena de batalla encontrarás un GameObject con el componente BattleManager. Requiere quince módulos a su lado, cada uno un MonoBehaviour en el mismo GameObject, además del BattleStateMachine:
| Módulo | Propósito |
|---|---|
| BattleManagerBattlersModule | Búsqueda de combatientes en ambos bandos, sprites, formas, huida |
| BattleManagerHealthModule | Cambios de HP, detección y procesamiento de debilitamientos |
| BattleManagerMovesModule | Ejecución de movimientos, precisión |
| BattleManagerItemsModule | Uso de objetos en batalla |
| BattleManagerCaptureModule | Mecánicas de captura de monstruos salvajes |
| BattleManagerAIModule | Toma de decisiones del enemigo |
| BattleManagerAnimationModule | Introducción de la batalla y animaciones del flujo |
| BattleManagerAudioModule | Música y efectos de sonido de la batalla |
| BattleManagerStatusesModule | Estados alterados (quemadura, veneno, sueño, etc.) |
| BattleManagerBattlerStatsModule | Niveles de estadísticas y modificaciones |
| BattleManagerBattlerSwitchModule | Enviar y retirar combatientes |
| BattleManagerRostersModule | Gestión del equipo durante la batalla |
| BattleManagerScenariosModule | Clima, terreno y configuración del escenario |
| BattleManagerMegaModule | Megaevolución |
| BattleManagerCharactersModule | Personajes entrenadores |
No necesitas configurarlos individualmente. Cada módulo llega a sus hermanos a través del BattleManager, y el resto del cableado viene de la inyección de dependencias de Zenject.
Paso 4: Conocer el bucle de batalla
El BattleStateMachine impulsa la batalla como un único bucle que se repite cada turno hasta que la batalla termina:
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
El bucle forma parte del prefab de batalla; no se configura. Para entenderlo o modificarlo, consulta Internos de la batalla.
Paso 5: Probar la batalla
-
Asegúrate de que tu escena de mundo tenga:
- Un PlayerCharacter con un equipo que contenga al menos un monstruo.
- Tiles de encuentro pintados en un tilemap.
- Un
SceneInfocuya entrada Encounters para ese tipo apunte a unWildEncountersSetconfigurado.
-
Pulsa Play en el editor.
-
Camina con tu personaje sobre los tiles de encuentro.
-
Tras unos pasos (determinados por la probabilidad de encuentro) se disparará una batalla.
La probabilidad por paso viene de la tabla TileEncounterChance de tu asset MCESettings (un valor por tipo de encuentro), salvo que el SceneInfo del mapa defina su propia probabilidad para ese tipo. Para probar batallas de inmediato sin caminar, establece la probabilidad del tipo que estés probando en 1 (100 %).
Comprender el flujo de la batalla
Cuando empieza una batalla, esto es lo que ocurre por debajo:
- El jugador pisa un
EncounterTile; el paso se evalúa contra la probabilidad de ese Encounter Type. - El
WildEncountersSetcorrespondiente del mapa da los encuentros posibles para el momento del día y el clima actuales; se elige uno por peso y se saca un nivel de su rango. - Se crea un objeto
BattleParameterscon los datos del monstruo salvaje y elBattleLaunchercarga la escena de batalla de forma aditiva. BattleManagerinicializa todos los módulos.- Se reproduce la introducción de la batalla.
- Al jugador se le presentan las opciones de acción: Fight, Bag, Monster, Run.
- Las acciones se ejecutan por orden de prioridad y velocidad.
- El bucle continúa hasta que un bando se debilita o el jugador huye o captura.
- Se envían de vuelta al mundo los
BattleResultParameters(quién ganó, el monstruo capturado, indicador de reaparición). - La escena de batalla se descarga y el mundo se reanuda.
Tipos de batalla
Dos enums describen qué es una batalla:
| Enum | Valores | Significado |
|---|---|---|
BattleType | SingleBattle, DoubleBattle | Un monstruo por bando, o dos |
EnemyType | Wild, Trainer | Un monstruo salvaje (se puede capturar) o un entrenador NPC (no se puede capturar, paga dinero de premio) |
Ambos viajan en BattleParameters y se exponen en el BattleManager.
Escuchar los eventos de batalla
Responde a los eventos de batalla sin acoplar tu código de juego a los internos. El lanzador de batalla está enlazado en la inyección de dependencias, así que cualquier script puede suscribirse a él:
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 te dice si hay una batalla en curso. El SDK también ofrece IBattleSystem (engine.Battle) con OnBattleStarted y OnBattleEnded, pero sus ganchos con el motor todavía no están conectados; consulta la Guía de la API pública e IBattleSystem.
Solución de problemas
| Problema | Solución |
|---|---|
| La batalla no se dispara | Comprueba que el tile tenga un EncounterTile con el Encounter Type correcto, que el SceneInfo del mapa tenga un WildEncountersSet para ese tipo y que TileEncounterChance tenga un valor para él (un tipo ausente cuenta como 0 y registra una advertencia una vez) |
| Pantalla negra tras el encuentro | Verifica que la escena de batalla esté en la lista de escenas de tus Build Settings y establecida en el BattleLauncher |
| El monstruo aparece en el nivel 0 | Asegúrate de que Min Level y Max Level estén establecidos en la entrada del encuentro |
| Sin música de batalla | Comprueba que el BattleLauncher tenga música en sus listas de batalla salvaje/de entrenador y que BattleManagerAudioModule tenga su audio asignado |
| Cierres inesperados al empezar la batalla | Abre el OpenMon Hub → pestaña Database → Validate Database para comprobar si faltan referencias de la base de datos |
Próximos pasos
- Análisis a fondo del sistema de batalla -- Conoce la arquitectura completa de la batalla.
- Sistema de movimientos -- Comprende el sistema de movimientos.
- IA de batalla -- Configura y personaliza la IA enemiga.