HPバーをスライドで調整する方法


こんにちは!ほたてです。
今回は、Unityで使われるSliderを、HPバーとして使用する方法をスクリプトの書き方をメインにして紹介したいと思います。
スクリプト以外の基本的な手順はこちらで紹介されているのを参考にしています。

注意点

上記のURLを参考にした際に気をつけておかなければならないことをいくつか挙げておきます。

・MovingEnemyを選択し、必ずMovingEnemyを親としてCanvasを作成した後にそのCanvas内でSliderを作りましょう!おそらく、すでにCanvasはゲーム画面として使われているものがあると思いますが、それとは別にもう一つCanvasを作っておく必要があります。

・MovingEnemyにCanvasとSliderとこれから紹介するScriptをつけたら、inspectorビューのApplyをクリックしましょう。そうすると、プレファブ化されているゲームオブジェクト全てにHPバーが適用されます!

最終的にはMovingEnemyのヒエラルキービューはこんな感じ。Canvas名は紛らわしいのでSliderCanvasという名前に変更しています。

MovingEnemyのInspectorビューはこんな感じを目指します!EnemyHPScriptの中身をこれから解説していきます!

スクリプトでHPバーを調整する方法

本題に入る前に、おそらく、以前の鬼宿題の通りだと、MovingEnemyにはEnemyScriptが付いていたと思いますが、今回はそれとは別に新しくEnemyHPScriptというものを作りました。最終的には、EnemyScriptを外して、新しく作ったEnemyHPScriptをつけましょう。

1:SliderのMaxvalueを調べる

まず、SliderのInspectorビューのMinvalueを0,MaxValueを1,Valueを1に設定しましょう。

2:スクリプト解説

本題のScriptの説明をしていきます。slider.maxValueは敵HPの最大値を示していて、今回だと最大HPは1です。slider.valueは現在のHPと考えましょう。

Startメソッドで最初に敵HPの最大値を所得して、Updateメソッドで、現在の敵HPを随時更新していきます。

Damageメソッドは前回のEnemyScriptとほぼ同じ内容ですが、最大HPを1と考えているので、ここでは一度の攻撃で0.2減る設定にしています。前回から書き換えていなければ、GunScriptからDamegeメソッドを呼び出す設定にしてあるはずなので、ここでの関数名は必ずDamageのままにしておきましょう!

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class EnemyHPScript : MonoBehaviour {

    public Slider slider;
    float moveEnemyHp;
    public GameObject Bomb; // 爆発のオブジェクト

    // Use this for initialization
    void Start () {
        moveEnemyHp = slider.maxValue;
    }

    // Update is called once per frame
    void Update () {
        slider.value = moveEnemyHp;
    }

    void Damage(){
        moveEnemyHp -= 0.2f;
        if (moveEnemyHp <= slider.minValue) {
            if (Bomb) {
                // 爆発を起こす
                Instantiate (Bomb, transform.position, transform.rotation);
            }
            ScoreManager.instance.enemyCount++;
            Destroy (this.gameObject);
        }
    }

    // 物にさわった時に呼ばれる
    void OnTriggerEnter(Collider col){
        // もしPlayerにさわったら
        if (col.gameObject.tag == "Player") {
            col.SendMessage ("Damage"); //ダメージを与えて
        }
        // 自分は消える
        Destroy (this.gameObject);
    }
}

後は、前述したように、このScriptをMovingEnemyにつけて、sliderを関連づけましょう。そして、Applyするのを忘れずに!

おまけ

Canvasが常にPlayerの方を向くようにするには下記のコードをMovingEnemy内のCanvasにつけましょう!(ここではSliderCanvas)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class UIScript : MonoBehaviour {

    private RectTransform myRect;

    // Use this for initialization
    void Start () {
        myRect = GetComponent<RectTransform> ();
    }

    // Update is called once per frame
    void Update () {
        myRect.LookAt (Camera.main.transform);
    }
}