Menu
CoddyTech

ヘルスバー

CoddyのUnityジャーニー「本格的なゲームを作る」セクションの一部。レッスン 10/56。

減っていくバーは、Image Type が Filled に設定された UI Image です。この設定は Image に Source Image が設定されると表示されます。None の場合、Inspector には表示されません。Fill Method を Horizontal、Fill Origin を Left にすると、バーは左端に向かって縮みます。fillAmount は 0 から 1 までの値で、バーがどれだけ描画されるかを表します。その後ろに暗い Image を置くと、空の部分を表示できます。Unity は fillAmount を範囲内に収めるため、1.4 ではバー全体が描画され、-0.2 では空になります。

fillAmount は残りの体力の割合です。体力を最大値で割って求めます。int フィールドでは整数除算になるため、350 / 500 は 0 になります。そのため、先に片方を float にキャストします。Image は UnityEngine.UI にあります。このボスバーは攻撃を受けるたびに更新されます。

public Image bossBar;
public int bossMaxHp = 500;
private int bossHp = 500;

public void Hit(int damage)
{
    bossHp = Mathf.Max(bossHp - damage, 0);
    bossBar.fillAmount = (float)bossHp / bossMaxHp;   // 350 / 500 = 0.7
}

バーの色も体力に応じて変えられます。bossBar.color = Color.Lerp(Color.red, Color.green, bossBar.fillAmount); はバーが満タンのときは緑で、減るにつれて赤に変わります。

challenge icon

チャレンジ

簡単

騎士には、体力より先にダメージを吸収するシールドがあります。矢印キーで騎士を動かし(Mover.cs)、トゲの上を歩くと30ダメージを受けます(Spikes.cs)。Knight.csを作成してください。シーンにはhealthBarとshieldBarがリンクされていますが、どちらも空の状態です。

  • hpはmaxHp(80)から始まり、shieldはmaxShield(40)から始まります。また、両方のバーは満タンの状態から始まります。
  • TakeDamage(int amount):シールドは残っている分だけダメージを受け、残りはhpから差し引かれます。hpが0未満になることはありません。
  • 攻撃を受けるたびに、両方のバーに残量を表示します。shieldBarにはmaxShieldに対するシールドの残量を、healthBarにはmaxHpに対するhpの残量を表示します。

再生を押し、トゲの上を何度か歩いてから、チェックを押してください。

自分で試してみよう

using UnityEngine;
using UnityEngine.UI;

public class Knight : MonoBehaviour
{
    public Image healthBar;
    public Image shieldBar;
    public int maxHp = 80;
    public int maxShield = 40;
    private int hp;
    private int shield;

    void Start()
    {
        hp = maxHp;
        shield = maxShield;
        // 両方のバーを満たす
    }

    public void TakeDamage(int amount)
    {
        // まずシールドで可能な限りダメージを受け、残りをhpから差し引く。ただし、hpは0未満にしない。その後、両方のバーを表示する。
    }
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

本格的なゲームを作るのすべてのレッスン