🍖

【Unity】コピペOK!体力ゲージを作る【C#】

2024/01/28に公開

環境

Unity Editer version : 2021.3.16f1
日本語化済み
2Dで作成

完成品


満タンの体力ゲージ


ダメージが入るとゲージが削れ、後ろの猶予ゲージが見える


時間が経つと猶予ゲージも削れる

必要な要素をUnityで作る

この体力ゲージは主に三つのImageオブジェクトと一つのスクリプトで出来ています。
まずImageオブジェクトを用意します。

ヒエラルキーを右クリックして、UI→キャンバスグループを選択
作成されたキャンバスグループの中に、空のオブジェクトを一つ作成します。
空のオブジェクトに”HealthGauge”と名前をつけておきます。

”HealthGauge”の下に、右クリックでUI→画像を選択しImageを作成します。

Imageを選択し、インスペクターから幅を200、高さを10に設定します。
またピポットのXを0に設定します。

Imageを二つ複製し、上から”BackGround”、”GraceGauge”、”Gauge”と名前をつけておきます。
それぞれのImageコンポーネントの色から、わかりやすいように色を変えておきます
(今回はBackGroundがグレー、GraceGaugeが白、Gaugeは水色にしています)

これで要素の準備は完了です

スクリプトをつける

プロジェクトのAssets内で右クリックし、作成からC#スクリプトを選択し、
ファイルネームを"GaugeController"に変更します。

スクリプトの内容は以下のとおりです。

GaugeController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GaugeController : MonoBehaviour
{
    // 体力ゲージ(表面の常に見える部分)
    [SerializeField] private GameObject _gauge;
    // 猶予ゲージ(体力が減ったとき一瞬見える部分)
    [SerializeField] private GameObject _graceGauge;

    // 最大HP
    [SerializeField] private int _HP;
    // HP1あたりの幅
    private float _HP1;
    // 体力ゲージが減った後裏ゲージが減るまでの待機時間
    private float _waitingTime = 0.5f;

    void Awake(){
        // スプライトの幅を最大HPで割ってHP1あたりの幅を”_HP1”に入れておく
        _HP1 = _gauge.GetComponent<RectTransform>().sizeDelta.x / _HP;
    }

    // 攻撃力をそれぞれのボタンで設定
    public void BeInjured(int atacck){
        // 攻撃力と体力1あたりの幅の積が実際に体力ゲージから減らす幅
        float damege = _HP1*atacck;

        // 減らす幅を設定してコルーチン”damegeEm”を呼び出し
        StartCoroutine(damegeEm(damege));
    }
    
    // 体力ゲージを減らすコルーチン
    IEnumerator damegeEm(float damege){
        // 体力ゲージの幅と高さをVector2で取り出す(Width,Height)
        Vector2 nowsafes = _gauge.GetComponent<RectTransform>().sizeDelta;
        // 体力ゲージの幅からダメージ分の幅を引く
        nowsafes.x -= damege;
        // 体力ゲージに計算済みのVector2を設定する
        _gauge.GetComponent<RectTransform>().sizeDelta = nowsafes;

        // ”_waitingTime”秒待つ
        yield return new WaitForSeconds(_waitingTime);
        // 猶予ゲージに計算済みのVector2を設定する
        _graceGauge.GetComponent<RectTransform>().sizeDelta = nowsafes;
    }
}

できたスクリプトをHealthGaugeのインスペクターにドラッグ&ドロップで追加します。

追加したスクリプトにオブジェクトとHPの初期値を指定しましょう。
Gaugeに先ほど作ったGaugeオブジェクト、Grace GaugeにGraceGaugeオブジェクトをドラッグ&ドロップで指定します。
今回はHPは100に設定しておきます。

これでスクリプトのセッティングは完了です。

動作確認

動作確認のためにボタンを設置します。
先ほど作ったキャンバスグループの中で右クリック、UI→古い機能→ボタンを選択します。
(TextMeshProのボタンでも構いません)

作成したボタンのインスペクターの、Buttonコンポーネントのクリック時のリストに、右下の+ボタンから要素を追加します。

追加した要素のうち左下の枠にHealthGaugeオブジェクトをドラッグ&ドロップで指定して、

右のプルダウンリストからGaugeController→BeInjured(int)を選択します。

すると、プルダウンリストの下に整数を指定できる窓が現れますので、与えるダメージを設定します。
今回は10としておきます。

ゲームを再生してボタンを押してみます。

ゲージがボタンを押すごとに時間差で減っていくのが確認できると思います。

応用

今回作ったゲージは左から右に減っていくものでしたが、GaugeオブジェクトとGraceGaugeオブジェクトのピボットXの数字を変えることで、右から左へ減るものや、中央に向かって減るものも作ることができます。

右:ピボットXが1,左:ピボットXが0.5

体力ゲージだけでなく、スタミナゲージや様々なゲージに使えそうです。

おわりに

記事の中でわからないところや、間違いなど気づいたことありましたら、コメントお願いします!

Discussion