Перейти к основному содержимому

Система эволюции

MCE поддерживает 30+ типов эволюции через полиморфный паттерн команд. Каждый тип эволюции -- это конкретный класс, наследующий от EvolutionData и определяющий собственные условия срабатывания. Это руководство охватывает все встроенные типы эволюции и способы их настройки.

Как работает эволюция​

Эволюцией управляет EvolutionManager, который проверяет условия эволюции в ключевые моменты:

  • После повышения уровня (в бою или через редкую конфету).
  • После использования предмета на монстре.
  • После завершения обмена.
  • При определённых игровых событиях (достижение порога дружбы, вход в локацию и т.д.).

Когда условия выполнены, воспроизводится EvolutionAnimation, и MonsterInstance трансформируется в целевой вид, сохраняя прозвище, IVs, EVs, дружбу и другие персональные данные.

Настройка эволюции​

В ScriptableObject MonsterEntry массив Evolutions содержит одну или несколько записей EvolutionData. Каждая запись указывает:

  1. Тип эволюции (какой конкретный класс использовать).
  2. Целевой вид (ссылка на MonsterEntry).
  3. Целевая форма (необязательно, для эволюций с определённой формой).
  4. Параметры, специфичные для типа (порог уровня, требуемый предмет и т.д.).

Встроенные типы эволюции​

На основе уровня​

ТипОписаниеПараметры
EvolveByLevelЭволюционирует на определённом уровнеTargetLevel
EvolveByLevelAtSpecificTimeЭволюционирует на уровне в определённое время сутокTargetLevel, EvolvingTimes
EvolveByLevelWhenAttackIsHigherThanDefenseЭволюционирует на уровне, когда Attack > DefenseTargetLevel
EvolveByLevelWhenDefenseIsHigherThanAttackЭволюционирует на уровне, когда Defense > AttackTargetLevel
EvolveByLevelWhenAttackEqualsDefenseЭволюционирует на уровне, когда Attack = DefenseTargetLevel
EvolveByLevelWhenSpecificGenderЭволюционирует на уровне при определённом полеTargetLevel, Gender
EvolveByLevelWithSceneTagЭволюционирует на уровне в определённой локацииTargetLevel, CompatibleTags
EvolveByLevelWithSceneTagAtSpecificTimeУровень + локация + времяTargetLevel, CompatibleTags, EvolvingTimes
EvolveToRandomSpeciesByLevelЭволюционирует в случайный вид из списка на уровнеTargetLevel, OtherSpecies

На основе дружбы​

ТипОписаниеПараметры
EvolveByFriendshipЭволюционирует при достижении порога дружбыTargetFriendship
EvolveByFriendshipAtSpecificTimeДружба + время сутокTargetFriendship, EvolvingTimes
EvolveByFriendshipWithMoveOfTypeДружба + знание приёма определённого типаTargetFriendship, Type

На основе предметов​

ТипОписаниеПараметры
EvolveOnItemUseЭволюционирует при использовании определённого предметаItemToUse
EvolveOnItemUseAtSpecificTimeПредмет + время сутокItemToUse, EvolvingTimes
EvolveOnItemUseOnSpecificGenderПредмет + определённый полItemToUse, Gender
EvolveOnItemUseWithSceneTagПредмет + определённая локацияItemToUse, CompatibleTags
EvolveOnLevelUpHoldingItemПовышение уровня с удерживаемым предметомItemToHold
EvolveOnLevelUpHoldingItemAtSpecificTimeУровень + удерживаемый предмет + времяItemToHold, EvolvingTimes

На основе обмена​

ТипОписаниеПараметры
EvolveWhenTradedЭволюционирует при обмене(нет)
EvolveWhenTradedHoldingItemЭволюционирует при обмене с удерживаемым предметомItemToHold
EvolveWhenTradedWithMonsterЭволюционирует при обмене на определённый видOtherMonster

На основе приёмов​

ТипОписаниеПараметры
EvolveOnLevelUpWhenAMoveHasBeenLearntПовышение уровня, если знает определённый приёмMove
EvolveOnLevelUpWhenAMoveHasBeenLearntWithSceneTagПриём + локацияMove, CompatibleTags
EvolveToRandomFormOnLevelUpWhenAMoveHasBeenLearntУровень + приём, случайная формаMove, OtherForm, PersonalityThreshold
EvolveByUsingMoveXTimesЭволюционирует после X использований определённого приёма в боюMove, TargetCounter

На основе условий​

ТипОписаниеПараметры
EvolveOnLevelUpWithOtherMonInPartyПовышение уровня с определённым видом в отрядеOtherSpecies, OtherForm
EvolveOnLevelUpWhenConditionHasLevelПовышение уровня, когда игровое условие достигло уровняConditions
EvolveByEvolutionCounterЭволюционирует после эволюции X других монстровTargetCounter

На основе боевых условий​

ТипОписаниеПараметры
EvolveByCriticalHitCounterЭволюционирует после X критических ударов в одном боюTargetCounter
EvolveByDefeatingRivalsЭволюционирует после победы над X тренерами-соперникамиTargetCounter, Item
EvolveByRecoilDamageBasedOnGenderЭволюционирует после получения урона отдачи (зависит от пола)TargetDamage

Специальные​

ТипОписаниеПараметры
SplitEvolutionByLevelСпециальная двойная эволюция (создаёт двух монстров из одного)TargetLevel, OtherSpecies, OtherForm, CompatibleBalls

Настройка цепочки эволюции​

Вот полный пример трёхстадийной цепочки эволюции:

Стадия 1: Flameleon (Dex #152)​

В MonsterEntry Flameleon добавьте одну эволюцию:

  • Тип: EvolveByLevel
  • Целевой вид: Blazeking
  • Требуемый уровень: 16

Стадия 2: Blazeking (Dex #153)​

В MonsterEntry Blazeking добавьте две эволюции (ветвление):

  • Эволюция 1:
    • Тип: EvolveByLevel
    • Целевой вид: Infernarch
    • Требуемый уровень: 36
  • Эволюция 2:
    • Тип: EvolveOnItemUse
    • Целевой вид: Infernarch (Mega Form)
    • Требуемый предмет: Fire Stone

Стадия 3: Infernarch (Dex #154)​

Без эволюций (финальная стадия). Оставьте массив Evolutions пустым.

Смена формы vs Эволюция​

Не все трансформации являются эволюциями. MCE различает:

МеханизмПостоянный?Создаёт новый экземпляр?Пример
ЭволюцияДаНет (тот же экземпляр, новый вид)Flameleon эволюционирует в Blazeking
Смена формыЗависит от ситуацииНет (тот же экземпляр, тот же вид)Сезонная форма, форма только для боя
Форма на основе предметаОбратимаяНетChangeFormOnItemUse, ChangeBetweenMultipleFormsOnItemUse

Смена формы использует ChangeFormOnItemUse или ChangeBetweenMultipleFormsOnItemUse вместо данных эволюции. Они переключают активный индекс DataByFormEntry без изменения вида.

Создание пользовательских типов эволюции (редакции Source и Studio)​

С редакцией Source или Studio вы можете создавать новые типы эволюции:

  1. Создайте новый класс, наследующий от 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. Зарегистрируйте ваш тип эволюции в EvolutionManager, чтобы он появился в выпадающем списке Inspector.
  2. Добавьте его в массив эволюции MonsterEntry и настройте параметры.
Сериализация

Пользовательские типы эволюции должны быть [Serializable] и использовать [SerializeField] для своих параметров. MCE использует полиморфную сериализацию Unity ([SerializeReference]) для массива эволюции, поэтому ваши пользовательские типы будут корректно сериализоваться и десериализоваться.

Ручной запуск эволюции​

В некоторых случаях вы можете захотеть программно запустить проверку эволюции (например, из узла CommandGraph или пользовательского скрипта):

// Только редакции Source и Studio — вручную запускает level-up evolution check
[Inject] private EvolutionManager evolutionManager;
monster.ExtraData.NeedsLevelUpEvolutionCheck = true;
StartCoroutine(evolutionManager.TriggerEvolutionsAfterLevelUp(
new[] { monster }, playerCharacter, false));

EvolutionManager проверит все применимые записи данных эволюции для вида монстра и запустит первую, условия которой выполнены.

Лучшие практики​

  1. Тестируйте цепочки эволюции полностью. Пройдите через каждый возможный путь эволюции.
  2. Избегайте циклических цепочек эволюции. A, эволюционирующий в B, эволюционирующий в A, создаёт бесконечные циклы.
  3. Устанавливайте подходящие пороги уровня. Ранние монстры должны эволюционировать около уровня 16-20, более поздние -- около 30-40.
  4. Используйте ветвящиеся эволюции умеренно. Они добавляют глубину геймплея, но могут запутать игроков при слишком многих ветвлениях.
  5. Проверяйте с помощью Asset Validation. Запустите Tools > MCE > OpenMon Hub → Database → Validate Database, чтобы убедиться, что все целевые виды эволюции существуют в базе данных.