Saltar al contenido principal

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.

El resultado final

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 SceneInfo para 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.

  1. 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 componente EncounterTile y elige su Encounter Type.
  2. 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:

  1. Assets > Create > MCE > Battle > Encounters > WildEncountersSet (o el botón New Wild Encounter Set en la pestaña Database del Hub).
  2. Ponle un nombre descriptivo, como Route1_GrassEncounters.
  3. Rellena sus tres listas:
ListaSignificado
Base EncountersMonstruos que siempre aparecen
Encounters Per MomentMonstruos extra para un momento del día: Night, Dawn, Day o Dusk
Encounters Per WeatherMonstruos extra bajo un clima determinado fuera de batalla

Cada entrada es un WildEncounter:

CampoDescripción
MonsterEl MonsterEntry que puede aparecer
Form CalculatorEl asset que elige la forma (SingleFormEncounter siempre devuelve una forma)
Min Level / Max LevelRango de nivel del monstruo salvaje (1-100; el máximo nunca puede ser menor que el mínimo)
WeightProbabilidad relativa de esta entrada (más alto = más común)

Por ejemplo:

MonstruoRango de nivelPeso
Flameleon3-540
Leaflet3-540
Sparkit4-620
  1. Abre el asset SceneInfo de tu mapa y, en su grupo Encounters, agrega la entrada para el tipo de encuentro (por ejemplo Grass) y asigna tu WildEncountersSet. 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:

  1. Un asset BattleLauncher. Es un ScriptableObject (Create > MCE > Battle > Launcher) enlazado mediante el BattleLauncherInstaller, 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.
  2. La escena de batalla en tus ajustes de compilación. La predeterminada (Battle.unity, en Assets/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 BattleManager de 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óduloPropósito
BattleManagerBattlersModuleBúsqueda de combatientes en ambos bandos, sprites, formas, huida
BattleManagerHealthModuleCambios de HP, detección y procesamiento de debilitamientos
BattleManagerMovesModuleEjecución de movimientos, precisión
BattleManagerItemsModuleUso de objetos en batalla
BattleManagerCaptureModuleMecánicas de captura de monstruos salvajes
BattleManagerAIModuleToma de decisiones del enemigo
BattleManagerAnimationModuleIntroducción de la batalla y animaciones del flujo
BattleManagerAudioModuleMúsica y efectos de sonido de la batalla
BattleManagerStatusesModuleEstados alterados (quemadura, veneno, sueño, etc.)
BattleManagerBattlerStatsModuleNiveles de estadísticas y modificaciones
BattleManagerBattlerSwitchModuleEnviar y retirar combatientes
BattleManagerRostersModuleGestión del equipo durante la batalla
BattleManagerScenariosModuleClima, terreno y configuración del escenario
BattleManagerMegaModuleMegaevolución
BattleManagerCharactersModulePersonajes 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​

  1. 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 SceneInfo cuya entrada Encounters para ese tipo apunte a un WildEncountersSet configurado.
  2. Pulsa Play en el editor.

  3. Camina con tu personaje sobre los tiles de encuentro.

  4. Tras unos pasos (determinados por la probabilidad de encuentro) se disparará una batalla.

Pruebas rápidas

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:

  1. El jugador pisa un EncounterTile; el paso se evalúa contra la probabilidad de ese Encounter Type.
  2. El WildEncountersSet correspondiente 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.
  3. Se crea un objeto BattleParameters con los datos del monstruo salvaje y el BattleLauncher carga la escena de batalla de forma aditiva.
  4. BattleManager inicializa todos los módulos.
  5. Se reproduce la introducción de la batalla.
  6. Al jugador se le presentan las opciones de acción: Fight, Bag, Monster, Run.
  7. Las acciones se ejecutan por orden de prioridad y velocidad.
  8. El bucle continúa hasta que un bando se debilita o el jugador huye o captura.
  9. Se envían de vuelta al mundo los BattleResultParameters (quién ganó, el monstruo capturado, indicador de reaparición).
  10. La escena de batalla se descarga y el mundo se reanuda.

Tipos de batalla​

Dos enums describen qué es una batalla:

EnumValoresSignificado
BattleTypeSingleBattle, DoubleBattleUn monstruo por bando, o dos
EnemyTypeWild, TrainerUn 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​

ProblemaSolución
La batalla no se disparaComprueba 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 encuentroVerifica 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 0Asegúrate de que Min Level y Max Level estén establecidos en la entrada del encuentro
Sin música de batallaComprueba 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 batallaAbre el OpenMon Hub → pestaña Database → Validate Database para comprobar si faltan referencias de la base de datos

Próximos pasos​