【Unity公式チュートリアル】 サバイバルシューター part.7 プレイヤーの体力を管理する!
こんにちは!ヤギです!
Unity公式チュートリアルのサバイバルシューターをやってみるpart.7になります。
記事概要
今回の記事では、プレイヤーの体力の管理方法についてご説明していきます。敵に攻撃された場合、プレイヤーの体力を減らし、HPバーの表示にも反映できるようにしていきます!
※part.7に対応する公式チュートリアルは、
Player Health - Unityとなります。
※前回の記事はこちら
www.yagigame.com
プレイヤーの体力管理用スクリプトの作成
まず初めに、プレイヤーの体力を管理するためのスクリプトを作っていきます。1. Project > Assets > Scripts > Player > PlayerHealthを、Hierarchy > Playerにドラッグし適用します。
2. PlayerHealth.csのソースを書いていきます。
※ソース内に解説を記載していますので、ご確認ください!
using System.Collections; using UnityEngine.SceneManagement; public class PlayerHealth : MonoBehaviour { public int startingHealth = 100; //スタート時点のHP public int currentHealth; //最新のHP public Slider healthSlider; //HPバー public Image damageImage; //攻撃された時の画像 public AudioClip deathClip; //倒された時の効果音 public float flashSpeed = 5f; //攻撃された時の画像の表示速度 public Color flashColour = new Color(1f, 0f, 0f, 0.1f); //攻撃された時の画像の色 Animator anim; //アニメーション AudioSource playerAudio; //音楽 PlayerMovement playerMovement; //PlayerMovementスクリプト //PlayerShooting playerShooting; bool isDead; //プレイヤーが倒されているかのフラグ bool damaged; //プレイヤーがダメージを受けているかのフラグ void Awake () { //コンポーネントを設定 anim = GetComponent <Animator> (); playerAudio = GetComponent <AudioSource> (); playerMovement = GetComponent <PlayerMovement> (); //playerShooting = GetComponentInChildren <PlayerShooting> (); //体力を初期化 currentHealth = startingHealth; } void Update () { //プレイヤーがダメージを受けた場合 if(damaged) { //攻撃された時の画像の色を設定する damageImage.color = flashColour; } //ダメージを受けていない場合 else { //攻撃された時の画像の色をクリアする damageImage.color = Color.Lerp (damageImage.color, Color.clear, flashSpeed * Time.deltaTime); } //ダメージを受けているかのフラグをオフにする damaged = false; } //プレイヤーが攻撃された時の処理 public void TakeDamage (int amount) { //ダメージを受けているかのフラグをオンにする damaged = true; //プレイヤーのHPを減らす currentHealth -= amount; //HPバーを減らす healthSlider.value = currentHealth; //攻撃を受けた時の効果音を鳴らす playerAudio.Play (); //HPが0以下になった場合、かつ既にたい押されていない場合、倒される if(currentHealth <= 0 && !isDead) { Death (); } } //プレイヤーが倒された場合の処理 void Death () { //プレイヤーが倒されているかのフラグをオンにする isDead = true; //playerShooting.DisableEffects (); //倒された時のアニメーションのフラグをオンにする anim.SetTrigger ("Die"); //倒された時の効果音を設定する playerAudio.clip = deathClip; //倒された時の効果音を鳴らす playerAudio.Play (); //プレイヤーを動けなくする playerMovement.enabled = false; //playerShooting.enabled = false; } public void RestartLevel () { SceneManager.LoadScene (0); } }
3. Hieraechy > Player > Inspector > Player Health(Script)を以下の内容で設定します。
・Health Slider > HealthSlider
・Damage Image > DamageImage
・Death Clip > Player Death
※これで、プレイヤーの体力を管理するスクリプトが完成しました。
敵の攻撃用スクリプトの作成
次に、敵がプレイヤーを攻撃するスクリプトの作成を行なっていきます。1. Project > Assets > Scripts > Enemy > EnemyAttackを、Hierarchy > Zombunnyにドラッグし適用します。
2. EnemyAttack.csのソースを書いていきます。
※ソース内に解説を記載していますので、ご確認ください!
using UnityEngine; using System.Collections; public class EnemyAttack : MonoBehaviour { public float timeBetweenAttacks = 0.5f; //攻撃する時間間隔 public int attackDamage = 10; //攻撃のダメージ量 Animator anim; //アニメーション GameObject player; //プレイヤー PlayerHealth playerHealth; //PlayerHealthスクリプト //EnemyHealth enemyHealth; bool playerInRange; //攻撃する範囲にプレイヤーが存在するかのフラグ float timer; //経過時間 void Awake () { //プレイヤーを取得 player = GameObject.FindGameObjectWithTag ("Player"); //プレイヤーのHPを取得 playerHealth = player.GetComponent <PlayerHealth> (); //enemyHealth = GetComponent<EnemyHealth>(); //アニメータコンポーネントを取得 anim = GetComponent <Animator> (); } //物体と衝突した時の処理 void OnTriggerEnter (Collider other) { //衝突した物体がプレイヤーの場合 if(other.gameObject == player) { //攻撃する範囲にプレイヤーが存在するかのフラグをオンにする playerInRange = true; } } //衝突した物体が離れた時の処理 void OnTriggerExit (Collider other) { //衝突した物体がプレイヤーの場合 if(other.gameObject == player) { //攻撃する範囲にプレイヤーが存在するかのフラグをオフにする playerInRange = false; } } void Update () { //経過時間を加算する timer += Time.deltaTime; //攻撃の時間間隔よりも経過時間が長い、かつプレイヤーが攻撃範囲に存在する場合 if(timer >= timeBetweenAttacks && playerInRange/* && enemyHealth.currentHealth > 0*/) { //プレイヤーを攻撃する Attack (); } //プレイヤーのHPが0以下になった場合 if(playerHealth.currentHealth <= 0) { //プレイヤーが倒された時のアニメーションフラグをオンにする anim.SetTrigger ("PlayerDead"); } } //敵が攻撃する処理 void Attack () { //経過時間を0にする timer = 0f; //プレイヤーのHPが0よりも大きい場合 if(playerHealth.currentHealth > 0) { //プレイヤーにダメージを与える playerHealth.TakeDamage (attackDamage); } } }
※これで、敵がプレイヤーを攻撃するようになりました!
ゲームを実行してみましょう
プレイヤーと敵が接触した時、画面が赤く光る演出と共に、HPバーが減っていきます!そして、HPが尽きた時、プレイヤーが倒されれば、大成功です!
次回予告
次回は、敵の体力を管理出来るようにしていきます!※次回の記事はこちら
www.yagigame.com
次回に対応する公式チュートリアルは、「Harming Enemies」です!
読んでいただきありがとうございました!