跳到主要内容

进化系统

MCE 通过多态命令模式支持 30+ 种进化类型。每种进化类型都是继承自 EvolutionData 的具体类,并定义了自己的触发条件。本指南涵盖所有内置进化类型及其配置方法。

进化机制​

进化由 EvolutionManager 管理,它在关键时刻检查进化条件:

  • 升级后(在战斗中或通过稀有糖果)。
  • 对怪兽使用道具后。
  • 交换完成后。
  • 特定游戏事件(亲密度达到阈值、进入特定地点等)。

当条件满足时,EvolutionAnimation 播放,MonsterInstance 变为目标物种,保留其昵称、个体值、努力值、亲密度和其他个人数据。

配置进化​

在 MonsterEntry ScriptableObject 上,Evolutions 数组包含一个或多个 EvolutionData 条目。每个条目指定:

  1. 进化类型(使用哪个具体类)。
  2. 目标物种(MonsterEntry 引用)。
  3. 目标形态(可选,用于特定形态的进化)。
  4. 类型特定参数(等级阈值、所需道具等)。

内置进化类型​

基于等级​

类型描述参数
EvolveByLevel在特定等级进化TargetLevel
EvolveByLevelAtSpecificTime在特定等级且特定时间段进化TargetLevel, EvolvingTimes
EvolveByLevelWhenAttackIsHigherThanDefense在特定等级且攻击 > 防御时进化TargetLevel
EvolveByLevelWhenDefenseIsHigherThanAttack在特定等级且防御 > 攻击时进化TargetLevel
EvolveByLevelWhenAttackEqualsDefense在特定等级且攻击 = 防御时进化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(图鉴 #152)​

在 Flameleon MonsterEntry 上,添加一个进化:

  • 类型:EvolveByLevel
  • 目标物种:Blazeking
  • 所需等级:16

阶段 2:Blazeking(图鉴 #153)​

在 Blazeking MonsterEntry 上,添加两个进化(分支进化):

  • 进化 1:
    • 类型:EvolveByLevel
    • 目标物种:Infernarch
    • 所需等级:36
  • 进化 2:
    • 类型:EvolveOnItemUse
    • 目标物种:Infernarch (Mega Form)
    • 所需道具:Fire Stone

阶段 3:Infernarch(图鉴 #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 版本 — manually trigger level-up evolution check
[Inject] private EvolutionManager evolutionManager;
monster.ExtraData.NeedsLevelUpEvolutionCheck = true;
StartCoroutine(evolutionManager.TriggerEvolutionsAfterLevelUp(
new[] { monster }, playerCharacter, false));

EvolutionManager 将检查怪兽物种上所有适用的进化数据条目,并触发第一个条件满足的进化。

最佳实践​

  1. 端到端测试进化链。遍历每条可能的进化路径。
  2. 避免循环进化链。A 进化为 B,B 进化为 A 会创建无限循环。
  3. 设置适当的等级阈值。早期怪兽应在 16-20 级左右进化,后期怪兽在 30-40 级左右。
  4. 谨慎使用分支进化。它们增加了游戏深度,但分支太多会让玩家困惑。
  5. 使用资源验证进行检查。运行 Tools > MCE > OpenMon Hub → Database → Validate Database 确保所有进化目标物种都存在于数据库中。