ふりかえり
前回は、敵の攻撃に Invoke を使ってディレイ処理を加えました。これにより、より「ターン制バトルらしさ」が演出できました!
倒されたらリスポーンさせる!
現状では、プレイヤーや敵が倒されるとゲームが終了してしまいます。
今回は、倒されたら自動でリスポーンする仕組みを作っていきます!
PlayerManager の変更
プレイヤーの生成は SpawnPlayer() 関数で行うようにし、HPが0になったらその関数を呼び出してリスポーンするようにします。
using UnityEngine; public class PlayerManager : MonoBehaviour { public PlayerData player; void Start() { SpawnPlayer(); // 初期プレイヤーを生成 } private void SpawnPlayer() { player = new PlayerData { name = "勇者", level = 1, maxHP = 100, currentHP = 100, attack = 10, defense = 5, }; Debug.Log($"{player.name}が作成されました。HP:{player.currentHP}/{player.maxHP}"); } public void TakeDamage(int damage) { player.currentHP -= damage; if (player.currentHP <= 0) { player.currentHP = 0; Debug.Log($"{player.name}を倒した!"); SpawnPlayer(); // リスポーン } } public void Attack(EnemyManager enemyManager) { int damage = Mathf.Max(0, player.attack - enemyManager.enemy.defense); enemyManager.TakeDamage(damage); Debug.Log($"{player.name}が{enemyManager.enemy.name}に{damage}ダメージ!"); } }
EnemyManager の変更
敵も同様に、SpawnEnemy() 関数でリスポーンできるようにします。
using UnityEngine; public class EnemyManager : MonoBehaviour { public EnemyData enemy; void Start() { SpawnEnemy(); // 初期敵キャラを生成 } private void SpawnEnemy() { enemy = new EnemyData { name = "スライム", level = 1, maxHP = 50, currentHP = 50, attack = 8, defense = 2 }; Debug.Log($"{enemy.name} が出現しました。HP: {enemy.currentHP}/{enemy.maxHP}"); } public void TakeDamage(int damage) { enemy.currentHP -= damage; if (enemy.currentHP <= 0) { enemy.currentHP = 0; Debug.Log($"{enemy.name}を倒した!"); SpawnEnemy(); // リスポーン } } public void Attack(PlayerManager playerManager) { int damage = Mathf.Max(0, enemy.attack - playerManager.player.defense); playerManager.TakeDamage(damage); Debug.Log($"{enemy.name}が{playerManager.player.name}に{damage}ダメージ!"); } }
実際にプレイして確認!
スライムのHPが残り2の状態で攻撃すると、

ログに「スライムを倒した!」と表示され、すぐに「スライムが出現しました!」とリスポーンが確認できます。
ゲーム画面でもスライムが再登場し、連続でバトルを続けられます!

まとめ
今回は、プレイヤーと敵が倒されてもリスポーンできるようにしました!
これで、バトルが途切れず続けられるようになりました!
次回予告
次回は、敵を倒すと経験値とお金をドロップする仕組みを作っていきたいと思います!
お楽しみに!
コメント