Menu
CoddyTech

조준하기

Coddy의 Unity 게임: 타워 디펜스 코스 레슨. 25개 중 10번째.

포탑이 목표물을 향해 돌아섭니다. 받침대 위에 서 있는 포탑 전체가 아니라 포신을 지닌 자식 오브젝트인 포탑 머리가 돌아섭니다. 자식 오브젝트를 돌리면 그 아래의 모든 오브젝트가 함께 돌아가고 부모 오브젝트는 그대로 유지됩니다.

적은 포탑 머리보다 아래쪽으로 이동하므로 포탑 머리에서 적을 향하는 방향은 약간 아래를 가리킵니다. 그 방향을 따라 똑바로 바라보도록 하면 포탑 머리가 앞으로 기울어집니다. 방향의 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만큼 회전하며, 초당 회전 각도에 Time.deltaTime을 곱하면 각 프레임에서 회전할 양을 구할 수 있습니다.
challenge icon

챌린지

중급

각 포탑의 포신이 목표를 향하도록 돌리세요.

  1. Tower에 [SerializeField] private Transform head;와 [SerializeField] private float turnSpeed = 270f;를 추가하세요.
  2. 목표가 있으면 head를 y축만 중심으로 목표 쪽으로 돌리세요. 회전 각도는 turnSpeed * Time.deltaTime도를 넘지 않도록 하고, Quaternion.RotateTowards를 사용하세요.
  3. 포신에서 발사하세요: head.position + head.forward * 0.6f.

‘플레이’를 누르세요. 포신이 적을 따라가며 포신에서 발사합니다. 그런 다음 ‘확인’을 누르세요.

직접 해보기

using UnityEngine;

public class Tower : MonoBehaviour
{
    public float range = 4f;
    public int damage = 2;
    [SerializeField] private Projectile projectilePrefab;

    private Enemy target;
    private float nextShot;

    void Update()
    {
        Enemy found = FindTarget();
        if (found != null && found != target)
        {
            Debug.Log("Target: " + found.name);
        }
        target = found;
        if (target == null)
        {
            return;
        }

        if (Time.time >= nextShot)
        {
            Fire();
            nextShot = Time.time + 1f;
        }
    }

    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;
    }

    void Fire()
    {
        Projectile shot = Instantiate(projectilePrefab, transform.position + Vector3.up, Quaternion.identity);
        shot.Launch(target.transform, damage);
    }
}

Unity 게임: 타워 디펜스의 모든 레슨

직접 연습해 보세요: Unity 플레이그라운드