ヘルスバー
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); はバーが満タンのときは緑で、減るにつれて赤に変わります。
チャレンジ
簡単騎士には、体力より先にダメージを吸収するシールドがあります。矢印キーで騎士を動かし(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未満にしない。その後、両方のバーを表示する。
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。