発射する
Coddyの「Unityゲーム:タワーディフェンス」コースのレッスン 9/18。
タワーは1秒あたりfireRate回、ターゲットに向けて発射します。カウントダウンするタイマーを使うのではなく、タワーは次に発射する時刻を保持します。Time.timeがその時刻に達すると発射し、次の時刻を1f / fireRate秒先に進めます。1秒に2回水をまくスプリンクラーの例:
if (Time.time >= nextSpray)
{
Spray();
nextSpray = Time.time + 1f / spraysPerSecond;
}各弾はProjectileで、MoveTowardsを使ってターゲットまで飛び、ターゲットが歩くとそれを追いかけ、到着時にダメージを与えます。Enemyに命中したかどうかを知る必要はありません。インターフェースの章と同様に、ダメージを受けることのできるものすべてに使えるインターフェースIDamageableをターゲットに問い合わせるので、これを実装したものなら何でも撃つことができます。
弾が飛んでいる間に、別のタワーの弾によってターゲットが倒されることがあります。その場合、破棄されたすべてのUnityオブジェクトと同様に、弾のtargetはnullと等しくなります。弾はもう飛んでいく先がないため、自身を破棄します。
チャレンジ
中級IDamageableはvoid TakeDamage(int amount)を宣言します。Enemyにこれを実装し、渡された量だけ体力を減らし、体力が0以下になったら敵を破棄します。Projectileに、シリアライズされたfloat型のspeed(プレハブでは12に設定)と、両方の値を保持するpublic void Launch(Transform target, int damage)を追加します。Updateでは、speedの速度でターゲットに向かって飛ばします。到着したら、ターゲットのIDamageableに対してTakeDamage(damage)を呼び出し、弾丸を破棄します。ターゲットがいなくなった場合も、弾丸を破棄します。Towerに、public int型のdamage、public float型のfireRate(1秒あたりの発射数)、およびシリアライズされたprojectilePrefab(Projectile)を追加します。タワーがターゲットを捉えている間、1秒あたりfireRate回を上限として発射します。弾丸をヘッドの少し前、head.position + head.forward * 0.6fの位置にインスタンス化し、タワーのdamageを使ってターゲットに向けて発射します。
ArrowTowerプレハブではdamageが2、fireRateが1.5に設定されており、弾丸はArrowShotです。Playを押し、タワーを建てて最初のウェーブを止めたら、Checkを押します。
自分で試してみよう
using UnityEngine;
// 後で実装:タワーからターゲットに向かって飛ぶ弾。
public class Projectile : MonoBehaviour
{
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。