Система эволюции
MCE поддерживает 30+ типов эволюции через полиморфный паттерн команд. Каждый тип эволюции -- это конкретный класс, наследующий от EvolutionData и определяющий собственные условия срабатывания. Это руководство охватывает все встроенные типы эволюции и способы их настройки.
Как работает эволюция
Эволюцией управляет EvolutionManager, который проверяет условия эволюции в ключевые моменты:
- После повышения уровня (в бою или через редкую конфету).
- После использования предмета на монстре.
- После завершения обмена.
- При определённых игровых событиях (достижение порога дружбы, вход в локацию и т.д.).
Когда условия выполнены, воспроизводится EvolutionAnimation, и MonsterInstance трансформируется в целевой вид, сохраняя прозвище, IVs, EVs, дружбу и другие персональные данные.
Настройка эволюции
В ScriptableObject MonsterEntry массив Evolutions содержит одну или несколько записей EvolutionData. Каждая запись указывает:
- Тип эволюции (какой конкретный класс использовать).
- Целевой вид (ссылка на
MonsterEntry). - Целевая форма (необязательно, для эволюций с определённой формой).
- Параметры, специфичные для типа (порог уровня, требуемый предмет и т.д.).
Встроенные типы эволюции
На основе уровня
| Тип | Описание | Параметры |
|---|---|---|
EvolveByLevel | Эволюционирует на определённом уровне | RequiredLevel |
EvolveByLevelAtSpecificTime | Эволюционирует на уровне в определённое время суток | RequiredLevel, TimeOfDay |
EvolveByLevelWhenAttackIsHigherThanDefense | Эволюционирует на уровне, когда Attack > Defense | RequiredLevel |
EvolveByLevelWhenDefenseIsHigherThanAttack | Эволюционирует на уровне, когда Defense > Attack | RequiredLevel |
EvolveByLevelWhenAttackEqualsDefense | Эволюционирует на уровне, когда Attack = Defense | RequiredLevel |
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 вы можете создавать новые типы эволюции:
- Создайте новый класс, наследующий от
EvolutionData:
[Serializable]
public class EvolveByStepCount : EvolutionData
{
[SerializeField] private int requiredSteps = 10000;
public override bool CheckEvolution(MonsterInstance monster, EvolutionContext context)
{
return context.TotalStepsWithMonster >= requiredSteps;
}
}
- Зарегистрируйте ваш тип эволюции в
EvolutionManager, чтобы он появился в выпадающем списке Inspector. - Добавьте его в массив эволюции
MonsterEntryи настройте параметры.
Пользовательские типы эволюции должны быть [Serializable] и использовать [SerializeField] для своих параметров. MCE использует полиморфную сериализацию Unity ([SerializeReference]) для массива эволюции, поэтому ваши пользовательские типы будут корректно сериализоваться и десериализоваться.
Ручной запуск эволюции
В некоторых случаях вы можете захотеть программно запустить проверку эволюции (например, из узла CommandGraph или пользовательского скрипта):
// Только уровень Source
EvolutionManager.TriggerEvolutionCheck(monsterInstance, EvolutionTrigger.LevelUp);
EvolutionManager проверит все применимые записи данных эволюции для вида монстра и запустит первую, условия которой выполнены.
Лучшие практики
- Тестируйте цепочки эволюции полностью. Пройдите через каждый возможный путь эволюции.
- Избегайте циклических цепочек эволюции. A, эволюционирующий в B, эволюционирующий в A, создаёт бесконечные циклы.