Menu
CoddyTech

Kule Savunması Lite

Coddy'nin Unity Journey'sinin Unity'de Oyun Mimarisi bölümünün bir parçası. Ders 61 / 64.

Creep'ler yol boyunca üssüne doğru ilerler ve üssü tek bir kule korur. Kule, menziline giren en yakın creep'e mermi atar ve indirdiği her creep altın kazandırır. Boşluk tuşuna basmak, altını kulenin bir sonraki seviyesine harcar: her seviye daha uzağa erişir, daha hızlı ateş eder veya daha güçlü vurur. Üsse ulaşan bir creep içeri girer. Seviyeler, tasarımcının koda dokunmadan bir varlıkta ayarladığı oyun verileridir; kule çok sayıda mermi ateşlediğinden, her atış için yeni bir tane oluşturup yok etmek yerine bunları bir havuzdan yeniden kullanır.

İki betik yaz: varlık türü olan TowerData ve Tower. Creep, Bolt ve CreepSpawner hazır; kulenin Nearest ve Show özellikleri de hazır.

challenge icon

Görev

Zor

Kuleyi tamamla; Nearest(range) ve Show() hazır.

  1. TowerLevel: serileştirilebilir, public range, fireEvery, damage, cost. TowerData, public List<TowerLevel> levels içerir.
  2. Her fireEvery saniyede bir, Nearest(range) bir yaratık bulursa kuleden bir ObjectPool<Bolt> kullanarak bir bolt oluştur: bolt.Launch(creep, damage, pool.Release).
  3. Creep.Killed sonrasında ganimet olarak bounty verildiğinde ve Space tuşuyla bir sonraki seviye cost bedeliyle satın alındığında Show() çağrılır ve Tower level 2 günlüğe kaydedilir.

“Oyna” düğmesine bas ve yükselt. Ardından “Kontrol et” düğmesine bas.

Kendin dene

using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.Pool;
using TMPro;

public class Tower : MonoBehaviour
{
    [SerializeField] private TowerData data;
    [SerializeField] private Bolt boltPrefab;
    [SerializeField] private TMP_Text infoText;

    private int level;
    private int gold;

    // Hazır: menzil içindeki kuleye en yakın creep veya null.
    Creep Nearest(float range)
    {
        Creep nearest = null;
        float best = Mathf.Infinity;
        foreach (Collider hit in Physics.OverlapSphere(transform.position, range))
        {
            if (hit.TryGetComponent(out Creep creep))
            {
                float distance = Vector3.Distance(transform.position, creep.transform.position);
                if (distance < best)
                {
                    best = distance;
                    nearest = creep;
                }
            }
        }
        return nearest;
    }

    // Hazır: seviyeyi ve altın miktarını Level 1, 0 gold biçiminde gösterir.
    void Show()
    {
        infoText.text = "Level " + (level + 1) + ", " + gold + " gold";
    }
}

Unity'de Oyun Mimarisi bölümündeki tüm dersler

Kendi başına pratik yap: Unity playground