20歩目 モンスターを追加! Unityで1日1ステップ!ノンフィールドRPG開発日記

1日1歩開発日記

ふりかえり

前回はHPバーを実装し、バトル中の緊張感と視覚的な分かりやすさがアップしました!

モンスターを追加!

今まではスライム1体だけだったので、戦闘がどうしても単調になってしまっていました。

今回は複数のモンスターを追加して、バトルのバリエーションを広げていきます!

スクリプトの変更

モンスターのデータ管理にScriptableObjectを使用!

新たに EnemySO.cs を作成し、以下の情報をひとまとめに管理します:

  • 名前 / 画像 / スケール
  • 基本ステータス(HP・攻撃・防御)
  • 撃破時の報酬(経験値・ゴールド)

これにより、モンスターの追加や調整がとても簡単になります!

using UnityEngine;

[CreateAssetMenu(fileName = "NewEnemy", menuName = "RPG/Create Enemy")]
public class EnemySO : ScriptableObject
{
    [Header("基本情報")]
    public string enemyName;
    public Sprite enemySprite;
    public Vector2 imageScale = Vector2.one;

    [Header("基本ステータス")]
    public int baseMaxHP = 50;
    public int baseAttack = 8;
    public int baseDefense = 2;

    [Header("基本報酬")]
    public int baseExpReward = 10;
    public int baseGoldReward = 5;
}

 EnemyManager.csで複数のモンスターに対応

  • availableEnemies に複数の EnemySO をリストで登録
  • ステージが進むごとに、モンスターのレベルも自動で上昇

また、敵画像のスプライトやスケールも自動反映されるようになっています。

    [Header("登場させる敵のリスト")]
    public List<EnemySO> availableEnemies;

    private EnemySO currentEnemyType;

    //既存のスクリプト

    public void SetupNewEnemyForStage(int stageLevel)
    {
        if (availableEnemies == null || availableEnemies.Count == 0)
        {
            Debug.LogError("利用可能な敵が設定されていません!");
            return;
        }

        currentEnemyType = availableEnemies[Random.Range(0, availableEnemies.Count)];
        
        enemy = new EnemyData
        {
            name = currentEnemyType.enemyName,
            level = 1,
            maxHP = currentEnemyType.baseMaxHP,
            currentHP = currentEnemyType.baseMaxHP,
            attack = currentEnemyType.baseAttack,
            defense = currentEnemyType.baseDefense,
            expReward = currentEnemyType.baseExpReward,
            goldReward = currentEnemyType.baseGoldReward
        };
        
        isEnemyDead = false;
        if (enemyUIManager != null)
        {
            Debug.Log($"<color=cyan>EnemyUIManagerにスプライト '{currentEnemyType.enemySprite?.name}' の更新を依頼します。</color>");
            enemyUIManager.UpdateEnemySprite(currentEnemyType.enemySprite);
            
            // 新しくスケール設定の処理を追加
            enemyUIManager.SetEnemyImageScale(currentEnemyType.imageScale);
        }

        for (int i = 1; i < stageLevel; i++)
        {
            LevelUpEnemy();
        }

        SaveEnemyStats();
        
        if (enemyUIManager != null)
        {
            enemyUIManager.InitializeHPBar();
            enemyUIManager.ForceUpdateHPBar();
        }
        
        Debug.Log($"ステージ{stageLevel}: {enemy.name}(Lv.{enemy.level}) が出現!");
    }

Unityでの設定

1. Assets/Prefab/Enemy/ フォルダを作成

2. Project ビューで右クリック →  Create > RPG > Create Enemy を選択

3. 作成された ScriptableObject に  画像やステータスを入力(名前、HP、攻撃力など)

複数のモンスターを作成したら、

EnemyManager の availableEnemies にそれらを登録します。

今はまだ「データ」のみ!

今回のステップでは、敵のデータ構造の整備を行いました。

実際にゲーム画面に表示する準備は完了です!

まとめ

今回は ScriptableObject を使って複数のモンスターを定義しました!

画像、ステータス、報酬を個別に管理できるので、

今後のゲームバランス調整やモンスター追加がとても楽になります!

次回予告

次回は、今回作成したモンスターたちを

実際にゲーム画面に登場させていきます!

お楽しみに!

コメント

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