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:
- El tipo de evolución (qué clase concreta usar).
- La especie objetivo (referencia a
MonsterEntry). - La forma objetivo (opcional, para evoluciones específicas de forma).
- Parámetros específicos del tipo (umbral de nivel, objeto requerido, etc.).
Tipos de evolución integrados
Basados en nivel
| Tipo | Descripción | Parámetros |
|---|---|---|
EvolveByLevel | Evoluciona en un nivel específico | TargetLevel |
EvolveByLevelAtSpecificTime | Evoluciona en un nivel durante una hora del día | TargetLevel, EvolvingTimes |
EvolveByLevelWhenAttackIsHigherThanDefense | Evoluciona en un nivel cuando Ataque > Defensa | TargetLevel |
EvolveByLevelWhenDefenseIsHigherThanAttack | Evoluciona en un nivel cuando Defensa > Ataque | TargetLevel |
EvolveByLevelWhenAttackEqualsDefense | Evoluciona en un nivel cuando Ataque = Defensa | TargetLevel |
EvolveByLevelWhenSpecificGender | Evoluciona en un nivel si es de un género específico | TargetLevel, Gender |
EvolveByLevelWithSceneTag | Evoluciona en un nivel en una ubicación específica | TargetLevel, CompatibleTags |
EvolveByLevelWithSceneTagAtSpecificTime | Nivel + ubicación + hora | TargetLevel, CompatibleTags, EvolvingTimes |
EvolveToRandomSpeciesByLevel | Evoluciona en una especie aleatoria de una lista en un nivel | TargetLevel, OtherSpecies |
Basados en amistad
| Tipo | Descripción | Parámetros |
|---|---|---|
EvolveByFriendship | Evoluciona cuando la amistad alcanza el umbral | TargetFriendship |
EvolveByFriendshipAtSpecificTime | Amistad + hora del día | TargetFriendship, EvolvingTimes |
EvolveByFriendshipWithMoveOfType | Amistad + conoce un movimiento de un tipo específico | TargetFriendship, Type |
Basados en objetos
| Tipo | Descripción | Parámetros |
|---|---|---|
EvolveOnItemUse | Evoluciona cuando se usa un objeto específico sobre él | ItemToUse |
EvolveOnItemUseAtSpecificTime | Objeto + hora del día | ItemToUse, EvolvingTimes |
EvolveOnItemUseOnSpecificGender | Objeto + género específico | ItemToUse, Gender |
EvolveOnItemUseWithSceneTag | Objeto + ubicación específica | ItemToUse, CompatibleTags |
EvolveOnLevelUpHoldingItem | Subir de nivel mientras porta un objeto | ItemToHold |
EvolveOnLevelUpHoldingItemAtSpecificTime | Nivel + objeto portado + hora | ItemToHold, EvolvingTimes |
Basados en intercambio
| Tipo | Descripción | Parámetros |
|---|---|---|
EvolveWhenTraded | Evoluciona al ser intercambiado | (ninguno) |
EvolveWhenTradedHoldingItem | Evoluciona al ser intercambiado mientras porta un objeto | ItemToHold |
EvolveWhenTradedWithMonster | Evoluciona al ser intercambiado por una especie específica | OtherMonster |
Basados en movimientos
| Tipo | Descripción | Parámetros |
|---|---|---|
EvolveOnLevelUpWhenAMoveHasBeenLearnt | Subir de nivel si conoce un movimiento específico | Move |
EvolveOnLevelUpWhenAMoveHasBeenLearntWithSceneTag | Movimiento + ubicación | Move, CompatibleTags |
EvolveToRandomFormOnLevelUpWhenAMoveHasBeenLearnt | Nivel + movimiento, resultado de forma aleatoria | Move, OtherForm, PersonalityThreshold |
EvolveByUsingMoveXTimes | Evoluciona después de usar un movimiento específico X veces en batalla | Move, TargetCounter |
Basados en condiciones
| Tipo | Descripción | Parámetros |
|---|---|---|
EvolveOnLevelUpWithOtherMonInParty | Subir de nivel con una especie específica en el equipo | OtherSpecies, OtherForm |
EvolveOnLevelUpWhenConditionHasLevel | Subir de nivel cuando una condición del juego ha alcanzado un nivel | Conditions |
EvolveByEvolutionCounter | Evoluciona después de evolucionar X otros monstruos | TargetCounter |
Basados en condiciones de batalla
| Tipo | Descripción | Parámetros |
|---|---|---|
EvolveByCriticalHitCounter | Evoluciona después de asestar X golpes críticos en una sola batalla | TargetCounter |
EvolveByDefeatingRivals | Evoluciona después de derrotar X entrenadores rivales | TargetCounter, Item |
EvolveByRecoilDamageBasedOnGender | Evoluciona después de recibir daño por retroceso (específico por género) | TargetDamage |
Especiales
| Tipo | Descripción | Parámetros |
|---|---|---|
SplitEvolutionByLevel | Evolució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
- Tipo:
- Evolución 2:
- Tipo:
EvolveOnItemUse - Especie objetivo:
Infernarch (Forma Mega) - Objeto requerido:
Fire Stone
- Tipo:
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ón | Sí | No (misma instancia, nueva especie) | Flameleon evolucionando a Blazeking |
| Cambio de forma | Depende | No (misma instancia, misma especie) | Forma estacional, forma solo de batalla |
| Forma por objeto | Reversible | No | ChangeFormOnItemUse, 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:
- 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; }
}
- Registre su tipo de evolución con el
EvolutionManagerpara que aparezca en el desplegable del Inspector. - Añádalo al array de evolución de un
MonsterEntryy configure los parámetros.
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
- Pruebe las cadenas de evolución de principio a fin. Recorra cada posible ruta de evolución.
- Evite cadenas de evolución circulares. A evolucionando a B y B evolucionando a A crea bucles infinitos.
- Establezca umbrales de nivel apropiados. Los monstruos tempranos deberían evolucionar alrededor del nivel 16-20, los posteriores alrededor de 30-40.
- Use evoluciones ramificadas con moderación. Añaden profundidad de juego pero pueden confundir a los jugadores si hay demasiadas ramificaciones.
- Valide con Asset Validation. Ejecute
Tools > MCE > OpenMon Hub → Database → Validate Databasepara asegurar que todas las especies objetivo de evolución existen en la base de datos.