Система эволюции
MCE поддерживает 30+ типов эволюции через полиморфный паттерн команд. Каждый тип эволюции -- это конкретный класс, наследующий от EvolutionData и определяющий собственные условия срабатывания. Это руководство охват ывает все встроенные типы эволюции и способы их настройки.
Как работает эволюция
Эволюцией управляет EvolutionManager, который проверяет условия эволюции в ключевые моменты:
- После повышения уровня (в бою или через редкую конфету).
- После использования предмета на монстре.
- После завершения обмена.
- При определённых игровых событиях (достижение порога дружбы, вход в локацию и т.д.).
Когда условия выполнены, воспроизводится EvolutionAnimation, и MonsterInstance трансформируется в целевой вид, сохраняя прозвище, IVs, EVs, дружбу и другие персональные данные.
Настройка эволюции
В ScriptableObject MonsterEntry массив Evolutions содержит одну или несколько записей EvolutionData. Каждая запись указывает:
- Тип эволюции (какой конкретный класс использовать).
- Целевой вид (ссылка на
MonsterEntry). - Целевая форма (необязательно, для эволюций с определённой формой).
- Параметры, специфичные для типа (порог уровня, требуемый предмет и т.д.).
Встроенные типы эволюции
На основе уровня
| Тип | Описание | Параметры |
|---|---|---|
EvolveByLevel | Эволюционирует на определённом уровне | TargetLevel |
EvolveByLevelAtSpecificTime | Эволюционирует на уровне в определённое время суток | TargetLevel, EvolvingTimes |
EvolveByLevelWhenAttackIsHigherThanDefense | Эволюционирует на уровне, когда Attack > Defense | TargetLevel |
EvolveByLevelWhenDefenseIsHigherThanAttack | Эволюционирует на уровне, когда Defense > Attack | TargetLevel |
EvolveByLevelWhenAttackEqualsDefense | Эволюционирует на уровне, когда Attack = Defense | TargetLevel |
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 вы можете создавать новые типы эволюции:
- Создайте новый класс, наследующий от
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; }
}
- Зарегистрируйте ваш тип эволюции в
EvolutionManager, чтобы он появился в выпадающем списке Inspector. - Добавьте его в массив эволюции
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 проверит все применимые записи данных эволюции для вида монстра и запустит первую, условия которой выполнены.
Лучшие практики
- Тестируйте цепочки эволюции полностью. Пройдите через каждый возможный путь эволюции.
- Избегайте циклических цепочек эволюции. A, эволюционирующий в B, эволюционирующий в A, создаёт бесконечные циклы.
- Устанавливайте подходящие пороги уровня. Ранние монстры должны эволюционировать около уровня 16-20, более поздние -- около 30-40.
- Используйте ветвящиеся эволюции умеренно. Они добавляют глубину геймплея, но могут запутать игроков при слишком многих ветвлениях.
- Проверяйте с помощью Asset Validation. Запустите
Tools > MCE > OpenMon Hub → Database → Validate Database, чтобы убедиться, что все целевые виды эволюции существуют в базе данных.