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.
Görev
OrtaAyak izlerini yok etmek yerine havuzda tut.
Trailiçinde kullanılmayanları birQueue<GameObject>içinde tut.Return(footprint)ayak izini devre dışı bırakıp kuyruğa ekler;Start,prewarmsayıda ayak izi oluşturup kuyruğa geri ekler.Get(position)kuyruktan kullanılmayan bir ayak izi alır (ya da yenisini oluşturur), konumlandırır ve etkinleştirir.FootprintiçindeDestroyçağrısını değiştir:OnEnableiçinde yaşı sıfırla;lifesaniye sonratrail.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
1Kalıtım Değil, Bileşenler
Küçük BileşenlerTemel Düşman Script'iSoyut BileşenlerBirlikte Çalışan BileşenlerTekrar: Modüler TaretTekrar: Çift Namlulu Top4Serileştirilmiş Veriler
Serileştirilebilir SınıflarInspector'da ListelerInspector'da Enum'larTekrar: Ganimet TablosuTekrar: Ganimeti At2Unity'de Arayüzler
IDamageableArayüzler ve TryGetComponentGetComponentsÖzet: Etkileşim TuşuÖzet: Erişim Mesafesindeki En Yakın5ScriptableObjects
Veri VarlıklarıSilah İstatistikleriOrtak AyarlarRüzgârı KaydetVeri Olarak DalgalarTekrar: Eşya VeritabanıTekrar: Dükkândan Satın Al8Yeniden Kullanılabilir Kod
Genişletme MetotlarıGeneric SingletonGeneric YardımcılarTekrar: FindNearest3Olaylar
Unity'de C# OlaylarıOnEnable'da Abone OlUnityEvent AlanlarıOlaylar UI'ı YönlendirirÖzet: Başarım Açılır PenceresiÖzet: Açılır Pencere Zamanlayıcısı6JSON ile Kaydetme
JsonUtilityOyunu KaydetmeYükleme ve VarsayılanlarÖzet: Kayıt YuvalarıBir Yuva Seçme ve Silme9Nesne Havuzu
Nesneleri Neden Havuzda ToplarızKuyruk Kullanan Bir HavuzUnity'nin ObjectPool'ıÖzet: Mermi HavuzuKendi başına pratik yap: Unity playground