前の記事ではグレネードが爆発すると敵は毎回同じダメージを受けていましたが、転がったグレネードからの距離に応じてダメージ判定をして、敵の受けるダメージを変えてみます。
まずグレネードのスクリプトで敵との距離を調べてダメージの大きさを計算します。
void Explode()
{
GameObject[] enemys = GameObject.FindGameObjectsWithTag("Agent"); // 敵を探す
Vector3 center = transform.position; // グレネードの位置
// 敵がいれば
if (enemys.Length != 0)
{
foreach (GameObject e in enemys)
{
AgentAttackTest sc_agent = e.GetComponent();
if (sc_agent)
{
// 敵との距離
float distance = Vector3.Distance(e.transform.position, center);
if (distance <= 20f)
{
sc_agent.Explode(center, 1f - distance * 0.05f);
}
}
}
}
...
ダメージの大きさは、距離が20mのときに最小の0、距離が0mのときに最大の1になります。冒頭のGIF画像では画面に距離とダメージを表示しています。距離が20より大きいときは敵はダメージを受けません。
この値を敵に付けたスクリプトの爆発のメソッドの引数に渡して、そこでHPを減らします。
public void Explode(Vector3 center, float damage)
{
// 体力を増減してゲージに反映
HP += -damage;
HP = Mathf.Clamp(HP, 0f, 1f);
HpImage.fillAmount = HP;
...
これでグレネードのダメージ判定ができました。
アイテムや敵が受ける力の強さはRigidbody.AddExplosionForceを使えば距離に応じて自動で減少します。