狙いを定める
Coddyの「Unityゲーム:タワーディフェンス」コースのレッスン 8/18。
塔は標的の方を向きます。土台の上に立つ塔全体ではなく、砲身を備えた子オブジェクトである頭部が向きを変えます。子オブジェクトを回転させると、その下にあるすべてのオブジェクトも回転し、親オブジェクトはそのままです。
敵は頭部より低い位置を歩くため、頭部から敵へ向かう方向は少し下向きになり、その方向をまっすぐ向いた頭部は前に傾いてしまいます。方向のyを0にすると水平を保てるので、頭部は垂直軸を中心にだけ回転します。船を追う灯台のランプの例です。
Vector3 toShip = ship.position - lamp.position;
toShip.y = 0f;
lamp.rotation = Quaternion.LookRotation(toShip);Quaternion.LookRotation(direction)はその方向を向く回転なので、ランプは一瞬で船の方を向きます。塔の頭部は、代わりに一定の速度で回転させます。Rotationの章で説明したQuaternion.RotateTowards(from, to, maxDegrees)は、最大でもmaxDegreesだけ回転します。1秒あたりの回転速度(度)にTime.deltaTimeを掛けると、各フレームで回転する分量が得られます。チャレンジ
中級Towerに、シリアライズされたフィールドを2つ追加します。head(Transform)とturnSpeed(float、1秒あたりの度数)です。ArrowTower プレハブでは、子オブジェクトの ArrowHead と 270 を設定します。- タワーにターゲットがいる間、垂直軸のみを中心に、1秒あたり最大
turnSpeed度の速さでヘッドをターゲットの方向へ回転させます。 - ターゲットがいない場合、ヘッドの向きはそのままにします。
Play を押し、道のそばにタワーを建てて敵を追う様子を確認してから、Check を押します。
自分で試してみよう
using UnityEngine;
public class Tower : MonoBehaviour
{
public int cost = 50;
public float range = 4f;
private Enemy target;
void Update()
{
target = FindTarget();
}
Enemy FindTarget()
{
Enemy nearest = null;
float nearestDistance = range;
foreach (Enemy enemy in Enemy.All)
{
float distance = Vector3.Distance(transform.position, enemy.transform.position);
if (distance <= nearestDistance)
{
nearest = enemy;
nearestDistance = distance;
}
}
return nearest;
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。