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

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

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

こんにちは!ヤギです!

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

記事概要

今回の記事では、プレイヤーの体力の管理方法についてご説明していきます。
敵に攻撃された場合、プレイヤーの体力を減らし、HPバーの表示にも反映できるようにしていきます!
※part.7に対応する公式チュートリアルは、
Player Health - Unityとなります。
※前回の記事はこちら
www.yagigame.com

プレイヤーの体力管理用スクリプトの作成

まず初めに、プレイヤーの体力を管理するためのスクリプトを作っていきます。
1. Project > Assets > Scripts > Player > PlayerHealthを、Hierarchy > Playerにドラッグし適用します。
f:id:yagigame:20181117170813p:plain
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
f:id:yagigame:20181117172955p:plain
※これで、プレイヤーの体力を管理するスクリプトが完成しました。

敵の攻撃用スクリプトの作成

次に、敵がプレイヤーを攻撃するスクリプトの作成を行なっていきます。
1. Project > Assets > Scripts > Enemy > EnemyAttackを、Hierarchy > Zombunnyにドラッグし適用します。
f:id:yagigame:20181117173118p:plain
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が尽きた時、プレイヤーが倒されれば、大成功です!
https://yagigameblog.tumblr.com/post/180199281320/unity公式チュートリアル-サバイバルシューター-part7

次回予告

次回は、敵の体力を管理出来るようにしていきます!
※次回の記事はこちら
www.yagigame.com
次回に対応する公式チュートリアルは、「Harming Enemies」です!

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