メインコンテンツまでスキップ

進化システム

MCE はポリモーフィックなコマンドパターンにより30種類以上の進化タイプに対応しています。各進化タイプは EvolutionData を継承する具象クラスであり、独自のトリガー条件を定義します。このガイドでは、すべての組み込み進化タイプとその設定方法を解説します。

進化の仕組み​

進化は EvolutionManager によって管理され、以下の重要なタイミングで進化条件がチェックされます:

  • レベルアップ後(バトル内またはふしぎなアメ使用時)。
  • アイテム使用後(モンスターにアイテムを使用した時)。
  • 通信交換後(交換完了時)。
  • 特定のゲームイベント時(なつき度の閾値到達、特定の場所への進入など)。

条件が満たされると、EvolutionAnimation が再生され、MonsterInstance が進化先の種族に変化します。ニックネーム、個体値、努力値、なつき度などの個人データは保持されます。

進化の設定​

MonsterEntry ScriptableObject の Evolutions 配列に、1つ以上の 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
EvolveByEvolutionCounterX体の他のモンスターを進化させた後に進化TargetCounter

バトル条件ベース​

タイプ説明パラメータ
EvolveByCriticalHitCounter1回のバトルでX回の急所を当てると進化TargetCounter
EvolveByDefeatingRivalsX人のライバルトレーナーを倒すと進化TargetCounter, Item
EvolveByRecoilDamageBasedOnGender反動ダメージを受けると進化(性別依存)TargetDamage

特殊​

タイプ説明パラメータ
SplitEvolutionByLevel特殊な二重進化(1体から2体のモンスターを生成)TargetLevel, OtherSpecies, OtherForm, CompatibleBalls

進化チェーンのセットアップ​

以下は3段階の進化チェーンの完全な例です:

ステージ 1: Flameleon (図鑑 #152)​

Flameleon の MonsterEntry に1つの進化を追加:

  • タイプ:EvolveByLevel
  • 進化先:Blazeking
  • 必要レベル:16

ステージ 2: Blazeking (図鑑 #153)​

Blazeking の MonsterEntry に2つの進化を追加(分岐):

  • 進化 1:
    • タイプ:EvolveByLevel
    • 進化先:Infernarch
    • 必要レベル:36
  • 進化 2:
    • タイプ:EvolveOnItemUse
    • 進化先:Infernarch(メガフォーム)
    • 必要アイテム: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. Inspector のドロップダウンに表示されるよう、EvolutionManager に進化タイプを登録します。
  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 を実行して、すべての進化先種族がデータベースに存在することを確認しましょう。