【Unity公式チュートリアル】 サバイバルシューター part.8 敵の体力を管理する!
こんにちは!ヤギです!
Unity公式チュートリアルのサバイバルシューターをやってみるpart.8になります。
記事概要
今回の記事では、敵の体力を管理する方法についてご説明していきます。※part.8に対応する公式チュートリアルは、
Harming Enemies - Unityとなります。
※前回の記事はこちら
www.yagigame.com
敵の体力管理用スクリプトの作成
敵の体力を管理するためのスクリプトを作っていきます。1. Project > Assets > Scripts > Enemy > EnemyHealthを、Hierarchy > Zombunnyにドラッグし適用します。
2. Hierarchy > Zombunny > Inspector > Enemy Health(Script) > Death ClipにZombunny Deathを設定します。
3. EnemyHealth.csに敵の体力を管理するための処理を書いていきます。
※ソース内に解説を記載しています。ご確認ください。
using UnityEngine; public class EnemyHealth : MonoBehaviour { public int startingHealth = 100; //敵のHPの初期値 public int currentHealth; //敵の最新のHP public float sinkSpeed = 2.5f; //敵の消滅時間 public int scoreValue = 10; //敵を倒した時のスコア public AudioClip deathClip; Animator anim; //アニメータ AudioSource enemyAudio; //敵の効果音 ParticleSystem hitParticles; //攻撃された時のエフェクト CapsuleCollider capsuleCollider; //Collider bool isDead; //敵が倒されたかフラグ bool isSinking; //敵の消滅フラグ void Awake () { //コンポーネントの設定 anim = GetComponent <Animator> (); enemyAudio = GetComponent <AudioSource> (); hitParticles = GetComponentInChildren <ParticleSystem> (); capsuleCollider = GetComponent <CapsuleCollider> (); //最新のHPを初期化 currentHealth = startingHealth; } void Update () { //消滅フラグがオンの場合 if(isSinking) { //敵が沈んでいく transform.Translate (-Vector3.up * sinkSpeed * Time.deltaTime); } } //攻撃を受けた時の処理 public void TakeDamage (int amount, Vector3 hitPoint) { //倒されたフラグがオンの場合 if(isDead) return; //攻撃を受けた時の音を鳴らす enemyAudio.Play (); //HPを減らす currentHealth -= amount; //攻撃を受けた時のエフェクトを表示する hitParticles.transform.position = hitPoint; hitParticles.Play(); //敵のHPが0以下になった場合 if(currentHealth <= 0) { //敵が倒される Death (); } } //敵が倒された場合の処理 void Death () { //敵が倒されたかフラグをオンにする isDead = true; capsuleCollider.isTrigger = true; //倒された時のアニメーショントリガーをオンにする anim.SetTrigger ("Dead"); //倒された時の効果音を設定する enemyAudio.clip = deathClip; //敵が倒された時の効果音を鳴らす enemyAudio.Play (); } //敵を消滅させる処理 //Zombunnyのアニメーション(Death)の中から呼び出されます //この呼び出す設定は既に完了しています public void StartSinking () { //NavMesh Agentコンポーネントをオフにする GetComponent <UnityEngine.AI.NavMeshAgent> ().enabled = false; //RigidbodyコンポーネントのKinematicをオンにする(重力の効果を受けない) GetComponent <Rigidbody> ().isKinematic = true; //消滅フラグをオンにする isSinking = true; //ScoreManager.score += scoreValue; //敵のオブジェクトを破壊する Destroy (gameObject, 2f); } }
4. EnemyAttack.csを修正していきます。
※Update関数内で、敵が生きている場合のみ攻撃するように条件を追加します。
※こちらもソース内に解説を記載しています。
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; //EnemyHealthスクリプト bool playerInRange; //攻撃する範囲にプレイヤーが存在するかのフラグ float timer; //経過時間 void Awake () { //プレイヤーを取得 player = GameObject.FindGameObjectWithTag ("Player"); //プレイヤーのHPを取得 playerHealth = player.GetComponent <PlayerHealth> (); //敵のHPを取得 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; //攻撃の時間間隔よりも経過時間が長い、かつプレイヤーが攻撃範囲に存在する場合、かつ敵のHPが0以上の場合 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); } } }
※これで敵の体力の管理が出来るようになりました!
次回予告
次回は、遂にプレイヤーが敵を攻撃する(シューティングする)部分を作成していきます!※次回の記事はこちら
www.yagigame.com
次回に対応する公式チュートリアルは引き続き、「Harming Enemies」です!
読んでいただきありがとうございました!