Unity2Dでゲームを作成している者です。
今まで作成したゲームではHPは数字での表記にしてきていたのですが、今回はゲージでHPを表すようにしてみました。
HPを使うゲームは多いと思うので、今回作成したHPゲージは結構使いまわせそうな気がしています。
作成した手順について記載をしていきたいと思います。
作成したHPゲージ

今回の記事で作成したHPゲージは上記のようなものです。
シンプルで最低限という感じですが、画像を差し替えるなどすれば、もっと良い見た目になるかなと思います。
早速作成した手順について記載をしていこうと思います。
画像を2種類用意して重ねる
まず下記のような2種類の画像を作成しました。
(保存して自由に使ってもらっても構わないです。ただの四角の図形ですが…)


この2種類の四角を「黒が下、青が上」になるように重ねます。HPの減り方によって青い四角の高さを減らすことでゲージに見せるようにします。
まずUnityでCanvas上に「HPGauge」というオブジェクトを作成します。

そしてImageとして、上記の黒色の四角を指定します。
高さ260、幅15とかなり細長い形にして、PivotのYを0に指定します。PivotのYが0になっていないと高さを変更した時に、ゲージの位置がずれてしまうので注意です。
HPゲージを操作するスクリプトを作成する
次にスクリプトを作成しました。以下のとおりです。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Gauge : MonoBehaviour
{
public int max;
public int cur;
public string txtHeader;
public Image curImg;
public Text txt;
void Update()
{
if (max > 0)
{
txt.text = txtHeader + "\n" + cur.ToString() + "\n/" + max.ToString();
if (cur > max)
{
curImg.GetComponent<RectTransform>().localScale = new Vector3(1f, 1f, 1f);
}
else if (cur < 0)
{
curImg.GetComponent<RectTransform>().localScale = new Vector3(1f, 0f, 1f);
}
else
{
float hpRate = (float)cur / (float)max;
curImg.GetComponent<RectTransform>().localScale = new Vector3(1f, hpRate, 1f);
}
}
}
}
変数についてですが、
maxがHPの最大値
curが現在のHP
txtHeaderが”HP”とか”MP”などといった種類を表す文字列
curImgが青色の画像のオブジェクト
TxtがHPを表示するテキストのオブジェクト
となります。
Updateメソッドの中で、
HPが最大値以上であれば青色の画像の高さは100%
HPが0未満であれば青色の画像の高さは0%
HPが1以上最大未満であれば、青色の画像の高さは現在値/最大値に設定しています。
現在のHPのオブジェクトとテキストのオブジェクトを作成する
次に、下記のような形で現在のHPを表すオブジェクトを作成します。黒色の四角のオブジェクトと全く同じ位置と大きさに設定します。

黒色の画像と同じようにPivotのYを0に指定します。そしてImageのSourceImageに青色の画像を指定します。
次にゲージの下にTextで以下のように数値を表示するオブジェクトを作成します。


オブジェクトを引数に指定する
最後に黒色の画像のオブジェクトに、先ほど作成したスクリプトを追加して以下のように設定します。

CurImgとTxtというのは前項で作成したオブジェクトになります。
前述したとおり、このHPゲージのオブジェクトのMaxがHPの最大値、Curが現在のHPの値となっています。この値をHPに応じて変更していけばHPゲージの完成となります。
例えば、このオブジェクトの上位にPlayerというオブジェクトを作成し以下のように操作します。
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
public int maxhp;
public int hp;
public Gauge hpGauge;
// Start is called before the first frame update
void Start()
{
hpGauge.max = this.maxhp;
}
// Update is called once per frame
void Update()
{
}
public void addHP(int plus)
{
this.hp += plus;
if (hp > maxhp)
{
this.hp = this.maxhp;
}
hpGauge.cur = this.hp;
}
}
今回作成したHPゲージをオブジェクトをhpGaugeという変数に格納します。
addHPというメソッドでHPを増やした時に、hpGaugeのcur(現在値)を変更することで、HPが増えた時にゲージのHPも増えるようになります。
同様の考えで、HPが減ったときにはhpGaugeのcur(現在値)を減らせばゲージの高さを減らすことができます。
コメント