Menu
CoddyTech

Nişan Al

Coddy'nin Unity Oyunu: Kule Savunması kursunda ders 10 / 25.

Bir kule hedefiyle yüzleşmek için döner: kaidesinin üzerinde duran kulenin tamamı değil, namluyu taşıyan çocuk nesnesi olan başlığı. Bir çocuk nesneyi döndürmek, onun altındaki her şeyi döndürür ve ebeveyn nesneyi olduğu gibi bırakır.

Düşmanlar başlıklardan daha alçakta yürür, bu yüzden başlıktan düşmanına doğru olan yön biraz aşağıyı gösterir ve bu yön boyunca dümdüz bakan bir başlık öne doğru eğilir. Yönün y değerini 0 yapmak, başlığı düz tutar; böylece başlık yalnızca dikey eksen çevresinde döner. Bir gemiyi takip eden deniz feneri lambası:

Vector3 toShip = ship.position - lamp.position;
toShip.y = 0f;
lamp.rotation = Quaternion.LookRotation(toShip);
Quaternion.LookRotation(direction), o yöne bakan rotasyondur; dolayısıyla lamba anında gemiye döner. Bir kule başlığı ise belirli bir hızla dönmelidir: Rotation bölümündeki Quaternion.RotateTowards(from, to, maxDegrees), en fazla maxDegrees kadar döner ve saniyedeki derece cinsinden dönüş hızı Time.deltaTime ile çarpıldığında her kareye düşen miktarı verir.
challenge icon

Görev

Orta

Her kulenin başlığını hedefini gösterecek şekilde döndür.

  1. Tower içine [SerializeField] private Transform head; ve [SerializeField] private float turnSpeed = 270f; ekle.
  2. Bir hedef varken Quaternion.RotateTowards ile head nesnesini yalnızca y ekseni etrafında, en fazla turnSpeed * Time.deltaTime derece döndür.
  3. Namludan ateş et: head.position + head.forward * 0.6f.

“Oyna” düğmesine bas: başlıklar düşmanları takip eder ve namludan ateş eder. Ardından “Kontrol et” düğmesine bas.

Kendin dene

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 Oyunu: Kule Savunması bölümündeki tüm dersler

Kendi başına pratik yap: Unity playground