【Unity】HPを自動回復させたり減少させる処理をコピペ化なスクリプト付で解説

【Unity】HPを自動回復させたり減少させる処理をコピペ化なスクリプト付で解説

 今回はHPを一定時間ごとに増減させる処理を作っていきます。初心者向けにわかりやすく操作画面を使って解説していくので安心してくださいね。簡単なUnityの操作とC#のスクリプトをコピペするだけ実装できるように紹介していきます。どの端末でも回復速度を一定に保って処理できます。

今回作るもの

 ボタンで自動回復状態と毒状態を切り替えれるようにします。

前準備

HPバーを作る

 上の画像を見てください。こちらの手順に従ってHPバーを作っていきます。

 まず初めに、ヒエラルキーの好きな場所を右クリックし、UI→スライダを選択してSliderを作ります。この時、子要素として自動作成されるHandle Slide Areaはスライダーのつまみのことで今回は不要なので削除します。

 Sliderの名前をHPbarに変更しましょう。

 次に、HPbarの子要素として作成されたBackgroundFillの色を変えます。Imageコーポメントのカラーを赤と緑に変更しましょう。

 最後に、Rect Transformを操作して大きさや座標を変えます。

 画像側の設定を参考にしてください。

 Fill AreaとFillはデフォルトで左・右の値に数字が入っています。この値を0にしないとHPbarが満タンにならないので注意しましょう。

HP自動回復ボタンを作る

 上の画像の手順で回復ボタンを作って行きます。

 ヒエラルキーで右クリックをし、UI→ボタンで作成。

 テキストは自由ですが今回は『回復』にしてあります。

HP自動減少ボタンを作る

 HP自動回復ボタンを複製し、Poisonに名前を変更しましょう。

 Rect TransformのX座標を-170にするといい感じに左右対称になります。

 テキストは『毒状態』にしました。

GameManagerを作る

 この空のオブジェクトにスクリプトを張り付けて管理していきます。

スクリプトを1つ作る

 画面下のAssetなどのファイルがある場所で右クリックを押します。

 作成→C#でスクリプトを作成し、名前を”GM”にします。このスクリプトをGameManagerに張り付けておきましょう。

 スクリプトに実装したい項目は以下の通りです。

  • HPの定義
  • HPバーを取得
  • HPバーの値を更新
  • 一定時間を定義する処理
  • HP自動回復する関数
  • HP自動減少する関数

スクリプトを作成

 この項目ではしっかりと理解したい方向けに順を追ってソースコードを記述していきます。

 お急ぎの方は最後の項目に完成形のスクリプトがあるのでコピペして使ってください。

HPバーを取得+毎フレーム回復させる

 とりあえず、一定時間毎に回復させるのではなく毎フレーム回復させるようにしてみました。

 注意点があるので必ず最後まで読んでから実装してくださいね。

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

public class GM : MonoBehaviour
{
    //Sliderコーポネントを管理する用
    Slider HPbar;
    //HPを定義
    public int HP = 100;

    // Start is called before the first frame update
    void Start()
    {
        //HPバーを取得
        HPbar = GameObject.Find("HPbar").GetComponent<Slider>();
        //HPバーの最大値をHPにする
        HPbar.maxValue = HP;

        //HPの初期値を0に
        HPbar.value = 0;
    }

    // Update is called once per frame
    void Update()
    {
        //毎フレームHPを回復
        HPbar.value += 1;
    }
}

 ここで注意ですが、毎フレーム処理する場合端末の性能によって速度や間隔が変わります。必ず、後述する一定時間ごとに処理させる方法で実装してください。詳しくはこちらの記事へ。

 実際に動かしてみるとこのようになります。

おまけ:ゲームオブジェクトを探す方法

        //"ob"という名前のGameObjectを取得する
        GameObject ob = GameObject.Find("ob");

        //"tr"という名前のTransformを取得する
        Transform tr = GameObject.Find("tr").GetComponent<Transform>();

        //"ob"という名前のゲームオブジェクトから "Component"という名前のコーポネントを"cp"に取得する
        Component cp = ob.GetComponent<Component>();

おまけ:スライダーの値を参照する方法

(Slider型).maxValueスライダーの最大値
(Slider型).minValue スライダーの最小値
(Slider型).value スライダーの現在値

一定時間ごとに処理を行う部分を実装する

 前のフレームから経過した秒数を格納するTime.deltaTimeを使います。

 これを毎フレーム加算することで、どの端末でも同じ時間間隔で処理を行えます。

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

public class GM : MonoBehaviour
{
    //Sliderコーポネントを管理する用
    Slider HPbar;
    //HPを定義
    public int HP = 100;

    //現在の時間
    private float currentTime = 0f;

    // Start is called before the first frame update
    void Start()
    {
        //HPバーを取得
        HPbar = GameObject.Find("HPbar").GetComponent<Slider>();
        //HPバーの最大値をHPにする
        HPbar.maxValue = HP;
        
        //HPの初期値を0に
        HPbar.value = 0;
    }

    // Update is called once per frame
    void Update()
    {
        //前のフレームから経過した秒数を加算
        currentTime += Time.deltaTime;

        //毎秒処理を行う
        if (currentTime >= 1.0f)
        {
            HPbar.value += 10;
            currentTime = 0;
        }
    }
}

 動かしてみるとこのようになります。

 しっかり毎秒機能していますね。

関数でONとOFFにできるようにする

 まずはフラグと関数を作って行きましょう。

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

public class GM : MonoBehaviour
{
    //Sliderコーポネントを管理する用
    Slider HPbar;
    //HPを定義
    public int HP = 100;

    //現在の時間
    private float currentTime = 0f;

    //自動回復と毒状態のフラグ
    public bool heal_flag = false;
    public bool poison_flag = false;

    // Start is called before the first frame update
    void Start()
    {
        //HPバーを取得
        HPbar = GameObject.Find("HPbar").GetComponent<Slider>();
        //HPバーの最大値をHPにする
        HPbar.maxValue = HP;
        
        //HPの初期値を0に
        HPbar.value = 0;
    }

    // Update is called once per frame
    void Update()
    {
        //前のフレームから経過した秒数を加算
        currentTime += Time.deltaTime;

        //毎秒処理を行う
        if (currentTime >= 1.0f)
        {
            //フラグがtrueの時だけ処理する
            if (heal_flag == true)
            {
                HPbar.value += 10;
            }
            if (poison_flag == true)
            {
                HPbar.value -= 10;
            }
            currentTime = 0;
        }
    }

    //ボタンで呼び出される関数
    public void heal()
    {
        poison_flag = false;
        heal_flag = true;
    }

    //ボタンで呼び出される関数
    public void poison()
    {
        heal_flag = false;
        poison_flag = true;
    }
}

 これで関数が呼び出された時だけ自動回復や毒状態を付与できるようになりました。

 次にボタンを押したときに関数を呼び出されるようにしましょう。

 作成したHealボタンとPoisonボタンのインスペクターを開き、Buttonコーポメントを操作します。

 上の画像の手順に従って、HealとPoisonボタンに関数を張り付けましょう。

 こうすることでボタンを押したときにGameManagerのGMスクリプトの関数を呼び出すことができます。

 動かしてみるとこのようになります。

最後に

 これで実装できるようになりましたね。

 今後も役に立つ記事を書いていきます!

 要望等ありましたら可能な範囲で対応させて頂きますので、コメントやお問い合わせページからお願いします。