Saltar al contenido principal

Sistema de evolución

MCE soporta más de 30 tipos de evolución a través de un patrón de comandos polimórfico. Cada tipo de evolución es una clase concreta que hereda de EvolutionData y define sus propias condiciones de activación. Esta guía cubre todos los tipos de evolución integrados y cómo configurarlos.

Cómo funciona la evolución​

La evolución es gestionada por el EvolutionManager, que verifica las condiciones de evolución en momentos clave:

  • Después de subir de nivel (en batalla o mediante caramelo raro).
  • Después de usar un objeto sobre un monstruo.
  • Después de completar un intercambio.
  • En eventos específicos del juego (umbral de amistad alcanzado, ubicación visitada, etc.).

Cuando se cumplen las condiciones, se reproduce la EvolutionAnimation y el MonsterInstance se transforma en la especie objetivo, conservando su apodo, IVs, EVs, amistad y otros datos personales.

Configurar la evolución​

En un ScriptableObject MonsterEntry, el array Evolutions contiene una o más entradas EvolutionData. Cada entrada especifica:

  1. El tipo de evolución (qué clase concreta usar).
  2. La especie objetivo (referencia a MonsterEntry).
  3. La forma objetivo (opcional, para evoluciones específicas de forma).
  4. Parámetros específicos del tipo (umbral de nivel, objeto requerido, etc.).

Tipos de evolución integrados​

Basados en nivel​

TipoDescripciónParámetros
EvolveByLevelEvoluciona en un nivel específicoTargetLevel
EvolveByLevelAtSpecificTimeEvoluciona en un nivel durante una hora del díaTargetLevel, EvolvingTimes
EvolveByLevelWhenAttackIsHigherThanDefenseEvoluciona en un nivel cuando Ataque > DefensaTargetLevel
EvolveByLevelWhenDefenseIsHigherThanAttackEvoluciona en un nivel cuando Defensa > AtaqueTargetLevel
EvolveByLevelWhenAttackEqualsDefenseEvoluciona en un nivel cuando Ataque = DefensaTargetLevel
EvolveByLevelWhenSpecificGenderEvoluciona en un nivel si es de un género específicoTargetLevel, Gender
EvolveByLevelWithSceneTagEvoluciona en un nivel en una ubicación específicaTargetLevel, CompatibleTags
EvolveByLevelWithSceneTagAtSpecificTimeNivel + ubicación + horaTargetLevel, CompatibleTags, EvolvingTimes
EvolveToRandomSpeciesByLevelEvoluciona en una especie aleatoria de una lista en un nivelTargetLevel, OtherSpecies

Basados en amistad​

TipoDescripciónParámetros
EvolveByFriendshipEvoluciona cuando la amistad alcanza el umbralTargetFriendship
EvolveByFriendshipAtSpecificTimeAmistad + hora del díaTargetFriendship, EvolvingTimes
EvolveByFriendshipWithMoveOfTypeAmistad + conoce un movimiento de un tipo específicoTargetFriendship, Type

Basados en objetos​

TipoDescripciónParámetros
EvolveOnItemUseEvoluciona cuando se usa un objeto específico sobre élItemToUse
EvolveOnItemUseAtSpecificTimeObjeto + hora del díaItemToUse, EvolvingTimes
EvolveOnItemUseOnSpecificGenderObjeto + género específicoItemToUse, Gender
EvolveOnItemUseWithSceneTagObjeto + ubicación específicaItemToUse, CompatibleTags
EvolveOnLevelUpHoldingItemSubir de nivel mientras porta un objetoItemToHold
EvolveOnLevelUpHoldingItemAtSpecificTimeNivel + objeto portado + horaItemToHold, EvolvingTimes

Basados en intercambio​

TipoDescripciónParámetros
EvolveWhenTradedEvoluciona al ser intercambiado(ninguno)
EvolveWhenTradedHoldingItemEvoluciona al ser intercambiado mientras porta un objetoItemToHold
EvolveWhenTradedWithMonsterEvoluciona al ser intercambiado por una especie específicaOtherMonster

Basados en movimientos​

TipoDescripciónParámetros
EvolveOnLevelUpWhenAMoveHasBeenLearntSubir de nivel si conoce un movimiento específicoMove
EvolveOnLevelUpWhenAMoveHasBeenLearntWithSceneTagMovimiento + ubicaciónMove, CompatibleTags
EvolveToRandomFormOnLevelUpWhenAMoveHasBeenLearntNivel + movimiento, resultado de forma aleatoriaMove, OtherForm, PersonalityThreshold
EvolveByUsingMoveXTimesEvoluciona después de usar un movimiento específico X veces en batallaMove, TargetCounter

Basados en condiciones​

TipoDescripciónParámetros
EvolveOnLevelUpWithOtherMonInPartySubir de nivel con una especie específica en el equipoOtherSpecies, OtherForm
EvolveOnLevelUpWhenConditionHasLevelSubir de nivel cuando una condición del juego ha alcanzado un nivelConditions
EvolveByEvolutionCounterEvoluciona después de evolucionar X otros monstruosTargetCounter

Basados en condiciones de batalla​

TipoDescripciónParámetros
EvolveByCriticalHitCounterEvoluciona después de asestar X golpes críticos en una sola batallaTargetCounter
EvolveByDefeatingRivalsEvoluciona después de derrotar X entrenadores rivalesTargetCounter, Item
EvolveByRecoilDamageBasedOnGenderEvoluciona después de recibir daño por retroceso (específico por género)TargetDamage

Especiales​

TipoDescripciónParámetros
SplitEvolutionByLevelEvolución dual especial (crea dos monstruos a partir de uno)TargetLevel, OtherSpecies, OtherForm, CompatibleBalls

Configurar una cadena de evolución​

Aquí hay un ejemplo completo de una cadena de evolución de tres etapas:

Etapa 1: Flameleon (Dex #152)​

En el MonsterEntry de Flameleon, añada una evolución:

  • Tipo: EvolveByLevel
  • Especie objetivo: Blazeking
  • Nivel requerido: 16

Etapa 2: Blazeking (Dex #153)​

En el MonsterEntry de Blazeking, añada dos evoluciones (ramificación):

  • Evolución 1:
    • Tipo: EvolveByLevel
    • Especie objetivo: Infernarch
    • Nivel requerido: 36
  • Evolución 2:
    • Tipo: EvolveOnItemUse
    • Especie objetivo: Infernarch (Forma Mega)
    • Objeto requerido: Fire Stone

Etapa 3: Infernarch (Dex #154)​

Sin evoluciones (etapa final). Deje el array de Evoluciones vacío.

Cambios de forma vs evolución​

No todas las transformaciones son evoluciones. MCE distingue entre:

Mecanismo¿Permanente?¿Crea nueva instancia?Ejemplo
EvoluciónSíNo (misma instancia, nueva especie)Flameleon evolucionando a Blazeking
Cambio de formaDependeNo (misma instancia, misma especie)Forma estacional, forma solo de batalla
Forma por objetoReversibleNoChangeFormOnItemUse, ChangeBetweenMultipleFormsOnItemUse

Los cambios de forma usan ChangeFormOnItemUse o ChangeBetweenMultipleFormsOnItemUse en lugar de datos de evolución. Estos alternan el índice activo de DataByFormEntry sin cambiar la especie.

Crear tipos de evolución personalizados (ediciones Source y Studio)​

Si tiene la edición Source o Studio, puede crear nuevos tipos de evolución:

  1. Cree una nueva clase que herede de TargetSpeciesAndFormEvolutionData:
[Serializable]
public class EvolveWhenLowHP : TargetSpeciesAndFormEvolutionData
{
[SerializeField]
[Range(0f, 1f)]
public float HPThreshold = 0.5f;

public override bool CanEvolveAfterLevelUp(MonsterInstance monster,
DayMoment currentTime,
PlayerCharacter playerCharacter,
out bool consumeHeldItem)
{
consumeHeldItem = false;
uint maxHP = MonsterMathHelper.CalculateStat(monster, Stat.Hp, null);
float hpRatio = (float)monster.CurrentHP / maxHP;
return monster.AllowEvolution(this) && hpRatio <= HPThreshold;
}

public override bool CanEvolveAfterBattleThroughExtraData(MonsterInstance m,
DayMoment t, out bool c) { c = false; return false; }
public override bool CanEvolveWhenUsingItem(MonsterInstance m, DayMoment t,
Item i, PlayerCharacter p, out bool c) { c = false; return false; }
public override bool CanEvolveWhenTrading(MonsterInstance m, DayMoment t,
MonsterInstance o, PlayerCharacter p, out bool c) { c = false; return false; }
}
  1. Registre su tipo de evolución con el EvolutionManager para que aparezca en el desplegable del Inspector.
  2. Añádalo al array de evolución de un MonsterEntry y configure los parámetros.
Serialización

Los tipos de evolución personalizados deben ser [Serializable] y usar [SerializeField] para sus parámetros. MCE utiliza la serialización polimórfica de Unity ([SerializeReference]) para el array de evolución, por lo que sus tipos personalizados se serializarán y deserializarán correctamente.

Activar la evolución manualmente​

En algunos casos, puede querer activar una verificación de evolución programáticamente (por ejemplo, desde un nodo de CommandGraph o un script personalizado):

// Source and Studio editions only — manually trigger level-up evolution check
[Inject] private EvolutionManager evolutionManager;
monster.ExtraData.NeedsLevelUpEvolutionCheck = true;
StartCoroutine(evolutionManager.TriggerEvolutionsAfterLevelUp(
new[] { monster }, playerCharacter, false));

El EvolutionManager verificará todas las entradas de datos de evolución aplicables en la especie del monstruo y activará la primera cuyas condiciones se cumplan.

Mejores prácticas​

  1. Pruebe las cadenas de evolución de principio a fin. Recorra cada posible ruta de evolución.
  2. Evite cadenas de evolución circulares. A evolucionando a B y B evolucionando a A crea bucles infinitos.
  3. Establezca umbrales de nivel apropiados. Los monstruos tempranos deberían evolucionar alrededor del nivel 16-20, los posteriores alrededor de 30-40.
  4. Use evoluciones ramificadas con moderación. Añaden profundidad de juego pero pueden confundir a los jugadores si hay demasiadas ramificaciones.
  5. Valide con Asset Validation. Ejecute Tools > MCE > OpenMon Hub → Database → Validate Database para asegurar que todas las especies objetivo de evolución existen en la base de datos.