10歩目 ターンを導入 Unityで1日1ステップ!ノンフィールドRPG開発日記

1日1歩開発日記

10歩目 ターンを導入

Unityで1日1ステップ!ノンフィールドRPG開発日記


振り返り

前回は、敵の攻撃機能を実装しました!

プレイヤーが攻撃ボタンを押した後に、敵もボタンで攻撃できるようになりましたね。


ターン制バトルの導入

前回の状態では、プレイヤーと敵それぞれに攻撃ボタンがありました。

しかし、プレイヤー側だけが攻撃ボタンを押し続ければ勝ててしまうため、

これはターン制とは言えません。

そこで今回は、プレイヤーが攻撃したら、自動的に敵が反撃するような

ターン制バトルの仕組みを導入していきます!


1. BattleManagerの作成

ターンの流れを管理する新しいスクリプト BattleManager を作成します。

using UnityEngine;

public class BattleManager : MonoBehaviour
{
    public PlayerManager playerManager;
    public EnemyManager enemyManager;

    private bool isPlayerTurn = true; // 現在がプレイヤーのターンかどうか

    void Start()
    {
        if (isPlayerTurn)
        {
            Debug.Log(playerManager.player.name + "のターン:攻撃ボタンをタップしてください");
        }
        else
        {
            Debug.Log(enemyManager.enemy.name + "のターン");
        }
    }

    public void PlayerAttack()
    {
        if (isPlayerTurn)
        {
            playerManager.PlayerAttack(enemyManager);
            isPlayerTurn = false;

            Debug.Log(enemyManager.enemy.name + "のターン");
            EnemyAttack(); // 敵の攻撃処理を呼び出す
        }
    }

    public void EnemyAttack()
    {
        if (!isPlayerTurn)
        {
            enemyManager.EnemyAttack(playerManager);
            isPlayerTurn = true;

            Debug.Log(playerManager.player.name + "のターン:攻撃ボタンをタップしてください");
        }
    }
}

isPlayerTurn というフラグで、どちらのターンかを制御しています。

プレイヤーが攻撃したら、すぐに敵のターンへ移り、自動的に攻撃が発生します。

2. PlayerUIManagerの修正

攻撃ボタンを押したとき、BattleManager を介して攻撃を行うように変更します。

using UnityEngine;
using TMPro;

public class PlayerUIManager : MonoBehaviour
{
    public PlayerManager playerManager;
    public EnemyManager enemyManager;
    public BattleManager battleManager;

    public TextMeshProUGUI nameText;
    public TextMeshProUGUI hpText;
    public TextMeshProUGUI levelText;

    void Update()
    {
        UpdateUI();
    }

    void UpdateUI()
    {
        nameText.text = playerManager.player.name;
        hpText.text = "HP: " + playerManager.player.currentHP + "/" + playerManager.player.maxHP;
        levelText.text = "Lv: " + playerManager.player.level;
    }

    public void OnAttackButtonClicked()
    {
        if (battleManager != null)
        {
            battleManager.PlayerAttack();
        }
        else
        {
            Debug.LogError("BattleManager が設定されていません。");
        }
    }
}

3. Unity上での設定

Unityエディタで以下の変更を行います:

  • Enemy Attackボタンを削除(もう不要なため)
  • 空のゲームオブジェクトを作成し、名前を BattleManager に変更
  • 作成したオブジェクトに BattleManager.cs をアタッチ
  • BattleManager のインスペクターで、PlayerManager と EnemyManager の参照を設定
  • PlayerUIManager にも BattleManager をアサイン

4. 実行して確認!

ゲームを再生して PlayerAttack ボタンをクリックすると:

  • スライムのHPが減少
  • 続いて自動的にスライムの攻撃が発生
  • プレイヤーのHPも減少

ログには以下のように表示されます:


まとめ

今日は、自動でターンが切り替わるバトルシステムを導入しました!

これで、プレイヤーと敵が交互に攻撃する本格的なRPGバトルらしくなってきましたね。


次回予告

現在はプレイヤーの攻撃後にすぐ敵の攻撃が実行されるため、流れが一瞬で終わってしまいます

次回は、敵の攻撃に少し遅延(ディレイ)を入れて、よりRPGっぽい演出を加えていきます!

お楽しみに!


お役立ちTips:スクリプトの実行順を制御する

複数のスクリプトで Start() 関数を使うと、どのスクリプトが先に実行されるかで動作が変わってしまうことがあります。

たとえば今回、PlayerManager や EnemyManager が先に実行されていないと、BattleManager の Start() 内で表示されるプレイヤー名が空白になってしまいます。

そんなときは以下の手順で実行順を制御できます:

  1. メニューから「Edit → Project Settings → Script Execution Order」を開く
  2. 「+」をクリックして、スクリプトを追加
  3. 数値を設定することで実行順を制御(数値が小さいほど先に実行)

例:

  • PlayerManager → 1
  • EnemyManager → 2
  • BattleManager → 5

こうすることで、確実に必要な初期化が終わった状態でBattleManagerが動作します。

コメント

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