31歩目 新ステージを実装!(モンスター編) Unityで1日1ステップ!ノンフィールドRPG開発日記

1日1歩開発日記

ふりかえり

前回はスキル強化を実装し、進行度に応じてスキルをパワーアップできるようになりました。

新ステージのモンスターを実装!

今回はステージの進行に合わせて登場モンスターが変化するようにしていきます!

今までは、どのステージでも同じモンスター(スライム、ゴブリン、ネズミ、サル)が登場していました。

これでは進んでも変化がなく、飽きにつながってしまいます

そこで今回は:

  • ステージごとに出現モンスターを変化
  • 「はじまりの草原」「まよいの森」などのテーマ分け

を行い、ステージ進行によるワクワク感を演出します!

スクリプトの変更

新スクリプト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での設定

上の記事を参考にし、新ステージで登場させたいモンスターを作成します。

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

動作確認

ゲームを進めてステージ4に入ると、

「まよいの森」のモンスターがしっかり出現するようになりました!

バトルログにも、どのモンスターセットが使われたかが表示されます。

まとめ

  • ステージごとにモンスターが変化するシステムを導入!
  • 「草原 → 森」へと進むことで、世界が広がっていく感覚が加わりました!
  • 敵が変わることで、見た目の変化+戦略の変化も楽しめます!

次回予告

次回は「まよいの森」に入ると背景フィールドが変化する機能を実装します!

世界観がより深まっていきますので、お楽しみに!

タイトルとURLをコピーしました