ふりかえり
前回はスキル強化を実装し、進行度に応じてスキルをパワーアップできるようになりました。
前回の投稿はこちら↓
新ステージのモンスターを実装!
今回はステージの進行に合わせて登場モンスターが変化するようにしていきます!
今までは、どのステージでも同じモンスター(スライム、ゴブリン、ネズミ、サル)が登場していました。
これでは進んでも変化がなく、飽きにつながってしまいます。
そこで今回は:
- ステージごとに出現モンスターを変化
- 「はじまりの草原」「まよいの森」などのテーマ分け
を行い、ステージ進行によるワクワク感を演出します!
スクリプトの変更
新スクリプト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に入ると、
「まよいの森」のモンスターがしっかり出現するようになりました!
バトルログにも、どのモンスターセットが使われたかが表示されます。

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

32歩目 新ステージを実装!(UI編) Unityで1日1ステップ!ノンフィールドRPG開発日記
(window.adsbyimobile=window.adsbyimobile||[]).push({pid:83863,mid:585611,asid:1904500,type:"banner",display:"inline",ele...



