超初心者のゲーム開発記~Unity~

超初心者がUnityでゲーム(目標はAndroidアプリ )を開発していくブログです!

【Unity公式チュートリアル】 サバイバルシューター part.8 敵の体力を管理する!

こんにちは!ヤギです!

Unity公式チュートリアルのサバイバルシューターをやってみるpart.8になります。

記事概要

今回の記事では、敵の体力を管理する方法についてご説明していきます。
※part.8に対応する公式チュートリアルは、
Harming Enemies - Unityとなります。
※前回の記事はこちら
www.yagigame.com

敵の体力管理用スクリプトの作成

敵の体力を管理するためのスクリプトを作っていきます。
1. Project > Assets > Scripts > Enemy > EnemyHealthを、Hierarchy > Zombunnyにドラッグし適用します。
f:id:yagigame:20181117202507p:plain
2. Hierarchy > Zombunny > Inspector > Enemy Health(Script) > Death ClipにZombunny Deathを設定します。
f:id:yagigame:20181117202710p:plain
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」です!

読んでいただきありがとうございました!