Menu
CoddyTech

発射する

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と等しくなります。弾はもう飛んでいく先がないため、自身を破棄します。

challenge icon

チャレンジ

中級
  1. IDamageableはvoid TakeDamage(int amount)を宣言します。Enemyにこれを実装し、渡された量だけ体力を減らし、体力が0以下になったら敵を破棄します。
  2. Projectileに、シリアライズされたfloat型のspeed(プレハブでは12に設定)と、両方の値を保持するpublic void Launch(Transform target, int damage)を追加します。Updateでは、speedの速度でターゲットに向かって飛ばします。到着したら、ターゲットのIDamageableに対してTakeDamage(damage)を呼び出し、弾丸を破棄します。ターゲットがいなくなった場合も、弾丸を破棄します。
  3. 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
{
}
quiz icon腕試し

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

Unityゲーム:タワーディフェンスのすべてのレッスン