进化系统
MCE 通过多态命令模式支持 30+ 种进化类型。每种进化类型都是继承自 EvolutionData 的具体类,并定义了自己的触发条件。本指南涵盖所有内置进化类型及其配置方法。
进化机制
进化由 EvolutionManager 管理,它在关键时刻检查进化条件:
- 升级后(在战斗中或通过稀有糖果)。
- 对怪兽使用道具后。
- 交换完成后。
- 特定游戏事件(亲密度达到阈值、进入特定地点等)。
当条件满足时,EvolutionAnimation 播放,MonsterInstance 变为目标物种,保留其昵称、个体值、努力值、亲密度和其他个人数据。
配置进化
在 MonsterEntry ScriptableObject 上,Evolutions 数组包含一个或多个 EvolutionData 条目。每个条目指定:
- 进化类型(使用哪个具体类)。
- 目标物种(
MonsterEntry引用)。 - 目标形态(可选,用于特定形态的进化)。
- 类型特定参数(等级阈值、所需道具等)。
内置进化类型
基于等级
| 类型 | 描述 | 参数 |
|---|---|---|
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 版本,可以创建新的进化类型:
- 创建一个继承自
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 版本 — manually trigger level-up evolution check
[Inject] private EvolutionManager evolutionManager;
monster.ExtraData.NeedsLevelUpEvolutionCheck = true;
StartCoroutine(evolutionManager.TriggerEvolutionsAfterLevelUp(
new[] { monster }, playerCharacter, false));
EvolutionManager 将检查怪兽物种上所有适用的进化数据条目,并触发第一个条件满足的进化。
最佳实践
- 端到端测试进化链。遍历每条可能的进化路径。
- 避免循环进化链。A 进化为 B,B 进化为 A 会创建无限循环。
- 设置适当的等级阈值。早期怪兽应在 16-20 级左右进化,后期怪兽在 30-40 级左右。
- 谨慎使用分支进化。它们增加了游戏深度,但分支太多会让玩家困惑。
- 使用资源验证进行检查。运行
Tools > MCE > OpenMon Hub → Database → Validate Database确保所有进化目标物种都存在于数据库中。