ふりかえり
前回はスキル強化を実装し、進行度に応じてスキルをパワーアップできるようになりました。
新ステージのモンスターを実装!
今回はステージの進行に合わせて登場モンスターが変化するようにしていきます!
今までは、どのステージでも同じモンスター(スライム、ゴブリン、ネズミ、サル)が登場していました。
これでは進んでも変化がなく、飽きにつながってしまいます。
そこで今回は:
- ステージごとに出現モンスターを変化
- 「はじまりの草原」「まよいの森」などのテーマ分け
を行い、ステージ進行によるワクワク感を演出します!
スクリプトの変更
新スクリプトStageMonsterManager.cs
- ステージごとに出現モンスターを管理するクラスを作成
- 複数の「モンスターセット」を用意し、ステージ範囲を指定して出現モンスターを切り替えるようにします
using UnityEngine; using UnityEngine.UI; using System.Collections.Generic; [System.Serializable] public class MonsterSet { public string setName; // モンスターセットの名前 public List<EnemySO> monsters; // そのセットに含まれるモンスター public int minStage; // このセットが出現する最小ステージ public int maxStage; // このセットが出現する最大ステージ(-1で無制限) } public class StageMonsterManager : MonoBehaviour { [Header("モンスターセット設定")] public List<MonsterSet> monsterSets = new List<MonsterSet>(); [Header("デフォルトモンスター")] public EnemySO defaultMonster; // デフォルトのモンスター [Header("ステージ管理")] public StageManager stageManager; // StageManagerの参照 [Header("ログ管理")] public BattleLogManager battleLogManager; // BattleLogManagerの参照を追加 void Start() { InitializeMonsterSets(); } // モンスターセットの初期化 private void InitializeMonsterSets() { if (monsterSets.Count == 0) { // デフォルトのモンスターセットを追加 CreateDefaultMonsterSets(); } } // デフォルトのモンスターセットを作成 private void CreateDefaultMonsterSets() { // セット1: ステージ1-3 (初心者向け) MonsterSet set1 = new MonsterSet { setName = "初心者モンスター", monsters = new List<EnemySO>(), minStage = 1, maxStage = 3 }; monsterSets.Add(set1); // セット2: ステージ4-6 (中級者向け) MonsterSet set2 = new MonsterSet { setName = "中級者モンスター", monsters = new List<EnemySO>(), minStage = 4, maxStage = 6 }; monsterSets.Add(set2); // セット3: ステージ7-9 (上級者向け) MonsterSet set3 = new MonsterSet { setName = "上級者モンスター", monsters = new List<EnemySO>(), minStage = 7, maxStage = 9 }; monsterSets.Add(set3); // セット4: ステージ10以降 (エキスパート向け) MonsterSet set4 = new MonsterSet { setName = "エキスパートモンスター", monsters = new List<EnemySO>(), minStage = 10, maxStage = -1 // 無制限 }; monsterSets.Add(set4); } // 現在のステージに応じたモンスターセットを取得 public MonsterSet GetCurrentMonsterSet() { if (stageManager == null) return null; int currentStage = stageManager.GetCurrentStage(); foreach (var monsterSet in monsterSets) { if (currentStage >= monsterSet.minStage) { if (monsterSet.maxStage == -1 || currentStage <= monsterSet.maxStage) { return monsterSet; } } } return null; // 該当するセットが見つからない場合 } // 現在のステージに応じたランダムなモンスターを取得 public EnemySO GetRandomMonsterForCurrentStage() { MonsterSet currentSet = GetCurrentMonsterSet(); if (currentSet != null && currentSet.monsters.Count > 0) { // セット内からランダムに選択 int randomIndex = Random.Range(0, currentSet.monsters.Count); return currentSet.monsters[randomIndex]; } // デフォルトモンスターを返す return defaultMonster; } // 指定したステージのモンスターセットを取得 public MonsterSet GetMonsterSetForStage(int stage) { foreach (var monsterSet in monsterSets) { if (stage >= monsterSet.minStage) { if (monsterSet.maxStage == -1 || stage <= monsterSet.maxStage) { return monsterSet; } } } return null; } // モンスターセットにモンスターを追加 public void AddMonsterToSet(int setIndex, EnemySO monster) { if (setIndex >= 0 && setIndex < monsterSets.Count) { if (!monsterSets[setIndex].monsters.Contains(monster)) { monsterSets[setIndex].monsters.Add(monster); } } } // モンスターセットからモンスターを削除 public void RemoveMonsterFromSet(int setIndex, EnemySO monster) { if (setIndex >= 0 && setIndex < monsterSets.Count) { monsterSets[setIndex].monsters.Remove(monster); } } // 現在のステージのモンスターセット名を取得 public string GetCurrentMonsterSetName() { MonsterSet currentSet = GetCurrentMonsterSet(); return currentSet != null ? currentSet.setName : "デフォルト"; } // 現在のステージのモンスター数を取得 public int GetCurrentMonsterSetCount() { MonsterSet currentSet = GetCurrentMonsterSet(); return currentSet != null ? currentSet.monsters.Count : 0; } // デバッグ用:現在のステージ情報をログ出力 public void LogCurrentStageInfo() { if (stageManager == null) return; int currentStage = stageManager.GetCurrentStage(); MonsterSet currentSet = GetCurrentMonsterSet(); Debug.Log($"現在のステージ: {currentStage}"); if (currentSet != null) { Debug.Log($"モンスターセット: {currentSet.setName}"); Debug.Log($"セット内モンスター数: {currentSet.monsters.Count}"); } else { Debug.Log("該当するモンスターセットが見つかりません"); } } }
EnemyManager.csで出現モンスターを取得
ステージに応じて適切なモンスターセットから敵がランダムに選ばれます。
// StageMonsterManagerが設定されている場合は、ステージに応じたモンスターを選択 if (stageMonsterManager != null) { EnemySO stageMonster = stageMonsterManager.GetRandomMonsterForCurrentStage(); if (stageMonster != null) { currentEnemyType = stageMonster; Debug.Log($"ステージ{stageLevel}のモンスターセット: {stageMonsterManager.GetCurrentMonsterSetName()}"); // バトルログにモンスターセット情報を追加 if (battleLogManager != null) { string monsterSetName = stageMonsterManager.GetCurrentMonsterSetName(); int monsterCount = stageMonsterManager.GetCurrentMonsterSetCount(); battleLogManager.AddMonsterSetInfoLog(monsterSetName, monsterCount); } } else { // StageMonsterManagerからモンスターが取得できない場合は、従来の方法を使用 if (availableEnemies == null || availableEnemies.Count == 0) { Debug.LogError("利用可能な敵が設定されていません!"); return; } currentEnemyType = availableEnemies[Random.Range(0, availableEnemies.Count)]; } } else { // StageMonsterManagerが設定されていない場合は、従来の方法を使用 if (availableEnemies == null || availableEnemies.Count == 0) { Debug.LogError("利用可能な敵が設定されていません!"); return; } currentEnemyType = availableEnemies[Random.Range(0, availableEnemies.Count)]; }
Unityでの設定
上の記事を参考にし、新ステージで登場させたいモンスターを作成します。

- StageMonsterManager をシーンに配置
- Inspector で モンスターセットを定義
- ステージ 1〜3:「はじまりの草原」→ スライム、ネズミ、サル、ゴブリン
- ステージ 4〜6:「まよいの森」→ カブトムシ、木の精霊、カタツムリ、謎の粘液
- ステージ 7以降もこのように順次追加可能!

動作確認
ゲームを進めてステージ4に入ると、
「まよいの森」のモンスターがしっかり出現するようになりました!
バトルログにも、どのモンスターセットが使われたかが表示されます。

まとめ
- ステージごとにモンスターが変化するシステムを導入!
- 「草原 → 森」へと進むことで、世界が広がっていく感覚が加わりました!
- 敵が変わることで、見た目の変化+戦略の変化も楽しめます!
次回予告
次回は「まよいの森」に入ると背景フィールドが変化する機能を実装します!
世界観がより深まっていきますので、お楽しみに!