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.Görev
OrtaHer kulenin başlığını hedefini gösterecek şekilde döndür.
Toweriçine[SerializeField] private Transform head;ve[SerializeField] private float turnSpeed = 270f;ekle.- Bir hedef varken
Quaternion.RotateTowardsileheadnesnesini yalnızca y ekseni etrafında, en fazlaturnSpeed * Time.deltaTimederece döndür. - 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