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

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

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

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

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

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

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

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

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

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

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

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

ТипОписаниеПараметры
EvolveByLevelЭволюционирует на определённом уровнеRequiredLevel
EvolveByLevelAtSpecificTimeЭволюционирует на уровне в определённое время сутокRequiredLevel, TimeOfDay
EvolveByLevelWhenAttackIsHigherThanDefenseЭволюционирует на уровне, когда Attack > DefenseRequiredLevel
EvolveByLevelWhenDefenseIsHigherThanAttackЭволюционирует на уровне, когда Defense > AttackRequiredLevel
EvolveByLevelWhenAttackEqualsDefenseЭволюционирует на уровне, когда Attack = DefenseRequiredLevel
EvolveByLevelWhenSpecificGenderЭволюционирует на уровне при определённом полеRequiredLevel, Gender
EvolveByLevelWithSceneTagЭволюционирует на уровне в определённой локацииRequiredLevel, SceneTag
EvolveByLevelWithSceneTagAtSpecificTimeУровень + локация + времяRequiredLevel, SceneTag, TimeOfDay
EvolveToRandomSpeciesByLevelЭволюционирует в случайный вид из списка на уровнеRequiredLevel, PossibleTargets[]

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

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

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

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

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

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

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

ТипОписаниеПараметры
EvolveOnLevelUpWhenAMoveHasBeenLearntПовышение уровня, если знает определённый приёмRequiredMove
EvolveOnLevelUpWhenAMoveHasBeenLearntWithSceneTagПриём + локацияRequiredMove, SceneTag
EvolveToRandomFormOnLevelUpWhenAMoveHasBeenLearntУровень + приём, случайная формаRequiredMove, PossibleForms[]
EvolveByUsingMoveXTimesЭволюционирует после X использований определённого приёма в боюRequiredMove, TimesRequired

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

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

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

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

Специальные

ТипОписаниеПараметры
NincadaEvolutionСпециальная двойная эволюция (создаёт двух монстров из одного)SecondSpecies

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

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

Стадия 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)

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

  1. Создайте новый класс, наследующий от EvolutionData:
[Serializable]
public class EvolveByStepCount : EvolutionData
{
[SerializeField] private int requiredSteps = 10000;

public override bool CheckEvolution(MonsterInstance monster, EvolutionContext context)
{
return context.TotalStepsWithMonster >= requiredSteps;
}
}
  1. Зарегистрируйте ваш тип эволюции в EvolutionManager, чтобы он появился в выпадающем списке Inspector.
  2. Добавьте его в массив эволюции MonsterEntry и настройте параметры.
Сериализация

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

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

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

// Только уровень Source
EvolutionManager.TriggerEvolutionCheck(monsterInstance, EvolutionTrigger.LevelUp);

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

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

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