体力ゲージ
Coddyの「Unityゲーム:タワーディフェンス」コースのレッスン 22/25。
各敵の上には、残りの体力を示すバーがあります。敵のプレハブには、暗い背景とその手前にある緑色の塗りつぶし部分という、2つの細いキューブがあります。塗りつぶし部分の幅は、残りの体力を最大体力で割った値、つまり0から1までの数値です。その値を使って塗りつぶし部分のx方向のスケールを変更すると、幅が短くなります。ただし、キューブは中心を基準に拡大縮小するため、塗りつぶし部分は両端から中央に向かって縮みます。塗りつぶし部分はバーの左端にある空のpivotオブジェクトの下に置き、スクリプトでは代わりにpivotのスケールを変更します。そうすると、その下にあるすべてのものが左端に向かって縮み、バーは右側から減っていきます。
この割合はfloatで計算する必要があります。health / data.maxHealthは2つのintを割るため、C#ではintの除算で小数部分が切り捨てられます。6 / 9は0になるので、最初の攻撃を受けた後にバーが空になってしまいます。片方を先にキャストする(float)health / data.maxHealthなら、0.67になります。底にあるpivotから上に向かって水位が上がる水槽の場合:
float level = (float)water / capacity;
waterPivot.localScale = new Vector3(1f, level, 1f);満タンのバーではプレイヤーに何も伝わらないので、バーは非表示の状態で始まります。プレハブでは非アクティブになっており、最初に攻撃を受けたときに表示されます。非アクティブなオブジェクトではUpdateは実行されませんが、そのメソッドを呼び出すことはできます。各敵はプレハブの個別のコピーで、それぞれに専用のバーがあります。
チャレンジ
難しい各敵が攻撃を受けたら、その敵の上に体力バーを表示します。
HealthBarに[SerializeField] private Transform fill;とpublic void Show(float fraction)を追加します。バーを表示し、fill.localScale = new Vector3(fraction, 1f, 1f);を設定します。Enemyに[SerializeField] private HealthBar healthBar;を追加し、TakeDamageで体力を減らした後にhealthBar.Show((float)health / data.maxHealth);を呼び出します。
「プレイ」を押します。タワーが攻撃すると、バーが表示されて短くなります。その後、「確認」を押します。
自分で試してみよう
using UnityEngine;
// 後で実装:敵の頭上に表示され、残りの体力を示すバー。
public class HealthBar : MonoBehaviour
{
}
Unityゲーム:タワーディフェンスのすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド