Menu
CoddyTech

Bir Hedef Bul

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

Bir kule, o düşman kulenin range değeri içindeyse kendisine en yakın düşmana ateş eder. Seçim yapabilmek için kulenin oyun alanındaki her düşmanı bilmesi gerekir. FindObjectsByType<Enemy> her kule için her karede tüm sahneyi tarardı; bunun yerine düşmanlar kendi listelerini tutar: Enemy sınıfında statik bir liste bulunur ve her düşman OnEnable içinde listeye katılır, OnDisable içinde listeden çıkar. Unity, yok edilmekte olan bir nesne için OnDisable çağırır; bu nedenle ölü bir düşman da listeden çıkar. Bir oyundaki toplanabilir nesneler de aynısını yapabilir:

public class Pickup : MonoBehaviour
{
    public static readonly List<Pickup> All = new List<Pickup>();

    void OnEnable()
    {
        All.Add(this);
    }

    void OnDisable()
    {
        All.Remove(this);
    }
}

En yakındakini bulmak, şimdiye kadarki en iyiyi akılda tutan bir döngüdür. pullRange içindeki en yakın toplanabilir nesneyi çeken bir mıknatıs, başlangıçta hiçbir toplanabilir nesne olmadığını ve en iyi mesafenin menzil olduğunu varsayar; böylece daha uzaktaki bir nesne asla seçilemez:

Pickup best = null;
float bestDistance = pullRange;
foreach (Pickup pickup in Pickup.All)
{
    // Şimdiye kadarki en iyisinden daha mı yakın? Onu ve mesafesini sakla
}
Vector3.Distance(a, b) iki nokta arasındaki mesafeyi verir. Menzil içinde hiçbir şey yoksa döngü hiçbir şeyi seçmez ve yanıt null olur.
challenge icon

Görev

Orta

Her kule, menzilindeki en yakın düşmanı seçer.

  1. Enemy içinde public static readonly List<Enemy> All = new List<Enemy>(); ekle; OnEnable içinde this öğesini ekle, OnDisable içinde kaldır.
  2. Tower içine public float range = 4f; ve private Enemy target; ekle.
  3. Her karede, Enemy.All içinde range mesafesindeki en yakın düşmanı bul (yoksa null); yeni olduğunda "Target: " + found.name mesajını kayda geçir ve onu target içinde tut.

“Oyna” düğmesine bas ve yolun yanına kule inşa et: Console her yeni hedefin adını gösterir. Ardından “Kontrol et” düğmesine bas.

Kendin dene

using UnityEngine;

// Daha sonra eklenecek: Bir kule menzilindeki bir düşmanı bulur, ona döner ve ateş eder.
public class Tower : MonoBehaviour
{
}

Unity Oyunu: Kule Savunması bölümündeki tüm dersler

Kendi başına pratik yap: Unity playground