21歩目 いろんなモンスターとバトル! Unityで1日1ステップ!ノンフィールドRPG開発日記

1日1歩開発日記

ふりかえり

前回は ScriptableObject を使って、複数のモンスターを定義できるようになりました!

いろんなモンスターとバトルできるようにする

これまでの敵はスライム1体だけ。

今回は、前回作成した複数のモンスターを実際にバトルに登場させる仕組みを実装します!

スクリプトの変更

▶ EnemyManager.cs

  • 登場させるモンスターを List<EnemySO> で管理
  • ステージ開始時や敵が倒された後に、ランダムな敵を出現
  • 敵の画像(Sprite)とスケール(大きさ)も EnemySO から設定
    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}) が出現!");
    }

    //既存のスクリプト

    private void SpawnNewRandomEnemy()
    {
        // 現在のステージレベルを取得して、新しい敵をセットアップする
        int currentStage = (battleManager != null) ? battleManager.GetCurrentStage() : 1;
        SetupNewEnemyForStage(currentStage);

        // 復活アニメーションを再生
        if (animationManager != null)
        {
            // 新しい敵のImageをフェードインさせる
            animationManager.EnemyReviveAnimation();
        }
    }

▶ EnemyUIManager.cs

  • 敵の画像を切り替える UpdateEnemySprite()
  • スプライトの大きさを変更する SetEnemyImageScale() を追加
    // 敵の画像を設定する
    public void UpdateEnemySprite(Sprite newSprite)
    {
        if (enemyImage != null)
        {
            enemyImage.sprite = newSprite;
        }
    }

    // 敵の画像のスケールを設定する
    public void SetEnemyImageScale(Vector2 scale)
    {
        if (enemyImage != null)
        {
            enemyImage.rectTransform.localScale = new Vector3(scale.x, scale.y, 1f);
            Debug.Log($"<color=cyan>敵画像のスケールを ({scale.x}, {scale.y}) に変更しました。</color>");
        }
    }

Unityでの設定

  1. EnemyManager の availableEnemies に EnemySO を複数登録  (例:スライム、ゴブリン、モンキーなど)
  2. 敵画像を表示する Image UI を用意  → これを EnemyUIManager にアタッチ
  3. ゲーム開始時に 画像・名前・ステータスが反映されるように設定

確認

ゲームを開始すると最初のモンスターはサルが出てきました。倒すと次はゴブリンが出てきました。というように作成した敵がランダムに出現するようになりました!

ゲームをスタートすると…

  • 1体目は「サル」
  • 倒すと次は「ゴブリン」
  • さらに倒すと「スライム」…

というように、作成したモンスターがランダムに登場するようになりました!

まとめ

今回は、スライム以外のモンスターとバトルできるようにしました!

モンスターごとに見た目や強さが異なることで、バトルがより魅力的になりました!

次回予告

次回はついに「ボスモンスター」を実装します!

お楽しみに!

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