Menu
CoddyTech

Kuyruk Kullanan Bir Havuz

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

Bir havuzun yedek nesnelerini tutacağı bir yere ihtiyacı vardır ve C# bunun için bir koleksiyona sahiptir: Queue<T>: Enqueue bir öğeyi kuyruğun sonuna ekler, Dequeue baştakini alır ve Count kaç öğenin beklediğini söyler. Bu akvaryum her 0.3 saniyede bir kabarcık çıkarır ve her kabarcık yüzeye ulaştığında havuza geri döner:

using System.Collections.Generic;
using UnityEngine;

public class BubblePool : MonoBehaviour
{
    public GameObject bubblePrefab;
    private Queue<GameObject> pool = new Queue<GameObject>();
    private float timer;

    void Update()
    {
        timer += Time.deltaTime;
        if (timer >= 0.3f)
        {
            timer = 0f;
            Get(new Vector3(Random.Range(-2f, 2f), 0f, 0f));
        }
    }

    public GameObject Get(Vector3 position)
    {
        GameObject bubble;
        if (pool.Count > 0)
        {
            bubble = pool.Dequeue();
        }
        else
        {
            bubble = Instantiate(bubblePrefab);
            bubble.GetComponent<Bubble>().pool = this;
        }
        bubble.transform.position = position;
        bubble.SetActive(true);
        return bubble;
    }

    public void Return(GameObject bubble)
    {
        bubble.SetActive(false);
        pool.Enqueue(bubble);
    }
}
// Bubble.cs, baloncuk prefab'ında
public BubblePool pool;

void Update()
{
    transform.Translate(0f, 2f * Time.deltaTime, 0f);
    if (transform.position.y > 5f) pool.Return(gameObject);
}

Get önce Count değerini kontrol eder; çünkü boş bir kuyrukta Dequeue çağrısı InvalidOperationException hatasına yol açar. Ancak bundan sonra Instantiate çağrılır ve yalnızca yeni bir kabarcığın pool alanının ayarlanması gerekir: yeniden kullanılan kabarcıkta bu alan zaten ayarlanmıştır. Kuyruk, en uzun süredir bekleyen kabarcığı önce verir; yani ilk giren ilk çıkar. Yüzeye ulaşan bir kabarcık Destroy yerine Return çağrısı yapar ve bir sonraki Get çağrısına kadar sahnede etkin olmayan durumda kalır.

Get, kabarcığı SetActive(true) çağrısından önce konumlandırır; çünkü nesneyi etkinleştirmek OnEnable işlevini hemen çalıştırır ve buradaki her şey kabarcığın en son kaybolduğu yeri değil, yeni konumunu görmelidir. Yeniden kullanılan bir nesne de bu noktada baştan başlar: Awake ve Start, kabarcık oluşturulduğunda bir kez çalışmıştır; OnEnable ise her Get çağrısında çalışır.

challenge icon

Görev

Orta

Ayak izlerini yok etmek yerine havuzda tut.

  1. Trail içinde kullanılmayanları bir Queue<GameObject> içinde tut. Return(footprint) ayak izini devre dışı bırakıp kuyruğa ekler; Start, prewarm sayıda ayak izi oluşturup kuyruğa geri ekler.
  2. Get(position) kuyruktan kullanılmayan bir ayak izi alır (ya da yenisini oluşturur), konumlandırır ve etkinleştirir.
  3. Footprint içinde Destroy çağrısını değiştir: OnEnable içinde yaşı sıfırla; life saniye sonra trail.Return(gameObject) çağır.

“Oyna”ya bas ve yürü: ayak izleri 1.5 saniye sonra kaybolur. Ardından “Kontrol et”e bas.

Kendin dene

using System.Collections.Generic;
using UnityEngine;

public class Trail : MonoBehaviour
{
    public GameObject footprintPrefab;
    public float step = 1f;
    public int prewarm = 6;
    private Vector3 lastDrop;

    void Start()
    {
        lastDrop = transform.position;
        // Havuzu önceden hazırlanmış ayak izleriyle doldur
    }

    void Update()
    {
        if (Vector3.Distance(transform.position, lastDrop) >= step)
        {
            lastDrop = transform.position;
            Get(new Vector3(transform.position.x, 0.02f, transform.position.z));
        }
    }

    public GameObject Get(Vector3 position)
    {
        GameObject footprint = Instantiate(footprintPrefab, position, Quaternion.identity);
        footprint.GetComponent<Footprint>().trail = this;
        return footprint;
    }

    public void Return(GameObject footprint)
    {
        // Yedek ayak izleri havuzda bekler
    }
}

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

Kendi başına pratik yap: Unity playground