Menu
CoddyTech

Membidik

Pelajaran 10 dari 25 dalam kursus Game Unity: Tower Defense di Coddy.

Sebuah menara berputar menghadap targetnya: bukan seluruh menara yang berdiri di alasnya, melainkan kepalanya, sebuah object anak yang membawa laras. Memutar object anak akan memutar semua yang berada di bawahnya dan membiarkan induknya tetap seperti semula.

Musuh berjalan lebih rendah daripada kepala menara, jadi arah dari kepala menuju musuh sedikit mengarah ke bawah, dan kepala yang menghadap lurus ke arah itu akan condong ke depan. Mengatur nilai y arah tersebut menjadi 0 membuatnya tetap mendatar, sehingga kepala hanya berputar pada sumbu vertikal. Lampu mercusuar yang mengikuti kapal:

Vector3 toShip = ship.position - lamp.position;
toShip.y = 0f;
lamp.rotation = Quaternion.LookRotation(toShip);
Quaternion.LookRotation(direction) adalah rotasi yang menghadap ke arah tersebut, jadi lampu langsung menghadap kapal. Kepala menara sebaiknya berputar dengan kecepatan tertentu: Quaternion.RotateTowards(from, to, maxDegrees) dari bab Rotation memutar paling banyak maxDegrees, dan kecepatan putar dalam derajat per detik dikalikan Time.deltaTime menghasilkan jatah putaran untuk setiap frame.
challenge icon

Tantangan

Sedang

Putar kepala setiap tower agar menghadap targetnya.

  1. Di Tower, tambahkan [SerializeField] private Transform head; dan [SerializeField] private float turnSpeed = 270f;.
  2. Saat ada target, putar head ke arahnya hanya pada sumbu y, paling banyak sebesar turnSpeed * Time.deltaTime derajat, dengan Quaternion.RotateTowards.
  3. Tembakkan dari laras: head.position + head.forward * 0.6f.

Tekan tombol “Main”: kepala tower mengikuti musuh dan menembak dari laras. Lalu tekan tombol “Periksa”.

Coba sendiri

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

Semua pelajaran di Game Unity: Tower Defense

Latihan sendiri: Playground Unity