Pool dengan Queue
Termasuk bagian Arsitektur Game di Unity dalam perjalanan Unity di Coddy. Pelajaran 47 dari 64.
Sebuah kolam membutuhkan tempat untuk menyimpan objek cadangannya, dan C# memiliki koleksi untuk itu, Queue<T>: Enqueue menambahkan item di belakang, Dequeue mengambil item di depan, dan Count menunjukkan jumlah yang menunggu. Akuarium ini mengeluarkan gelembung setiap 0.3 detik, dan setiap gelembung kembali ke kolam saat mencapai permukaan:
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, pada prefab gelembung
public BubblePool pool;
void Update()
{
transform.Translate(0f, 2f * Time.deltaTime, 0f);
if (transform.position.y > 5f) pool.Return(gameObject);
}Get memeriksa Count terlebih dahulu, karena Dequeue pada queue kosong akan memunculkan InvalidOperationException. Baru setelah itu Get menjalankan Instantiate, dan hanya gelembung baru yang perlu diisi field pool-nya: gelembung yang digunakan kembali masih memilikinya. Queue memberikan gelembung yang paling lama menunggu terlebih dahulu, yang masuk pertama keluar pertama. Gelembung di permukaan memanggil Return alih-alih Destroy, lalu tetap berada di scene dalam keadaan tidak aktif sampai Get berikutnya.
Get menempatkan gelembung sebelum SetActive(true), karena mengaktifkannya langsung menjalankan OnEnable, dan apa pun yang ada di sana harus melihat posisi baru, bukan posisi tempat gelembung terakhir kali menghilang. Di sinilah object yang digunakan kembali memulai dari awal: Awake dan Start berjalan satu kali saat gelembung dibuat, sedangkan OnEnable berjalan setiap kali Get dipanggil.
Tantangan
SedangGunakan kembali jejak kaki alih-alih menghancurkannya.
- Di
Trail, simpan objek cadangan dalamQueue<GameObject>.Return(footprint)menonaktifkannya dan memasukkannya ke antrean;Startmembuatprewarmjejak kaki dan mengembalikannya. Get(position)mengambil objek cadangan dari antrean (atau membuatnya), menempatkannya, lalu mengaktifkannya.- Di
Footprint, ganti Destroy: atur ulang usia diOnEnable; setelahlifedetik, panggiltrail.Return(gameObject).
Tekan tombol “Main” dan berjalanlah: jejak kaki memudar setelah 1.5 detik. Lalu tekan tombol “Periksa”.
Coba sendiri
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;
// Isi pool dengan jejak kaki awal sebanyak prewarm
}
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)
{
// Jejak kaki cadangan menunggu di pool
}
}
Semua pelajaran di Arsitektur Game di Unity
1Komponen, Bukan Hierarki
Komponen KecilSkrip Dasar MusuhKomponen AbstrakKomponen yang Bekerja BersamaRangkuman: Turret ModularRangkuman: Meriam Kembar4Data yang Diserialisasi
Class yang Dapat DiserialisasiList di InspectorEnum di InspectorRangkuman: Tabel LootRangkuman: Acak Loot2Antarmuka di Unity
IDamageableAntarmuka dan TryGetComponentGetComponentsRingkasan: Tombol InteractRingkasan: Terdekat dalam Jangkauan5ScriptableObjects
Aset DataStatistik SenjataPengaturan BersamaSelamatkan AnginGelombang sebagai DataRekap: database ItemBeli dari Toko8Kode yang Dapat Digunakan Kembali
Extension methodSingleton GenerikHelper GenerikUlasan: FindNearest3Event
Event C# di UnityBerlangganan di OnEnableField UnityEventEvent Menggerakkan UIRangkuman: Popup PencapaianRangkuman: Timer Popup6Menyimpan dengan JSON
JsonUtilitySimpan GameMuat dan Nilai DefaultRingkasan: Slot SimpananPilih dan Hapus Slot9Object Pooling
Mengapa Menggunakan Object PoolPool dengan QueueObjectPool di UnityRingkasan: Pool PeluruLatihan sendiri: Playground Unity