Menu
CoddyTech

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.

challenge icon

Tantangan

Sedang

Gunakan kembali jejak kaki alih-alih menghancurkannya.

  1. Di Trail, simpan objek cadangan dalam Queue<GameObject>. Return(footprint) menonaktifkannya dan memasukkannya ke antrean; Start membuat prewarm jejak kaki dan mengembalikannya.
  2. Get(position) mengambil objek cadangan dari antrean (atau membuatnya), menempatkannya, lalu mengaktifkannya.
  3. Di Footprint, ganti Destroy: atur ulang usia di OnEnable; setelah life detik, panggil trail.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

Latihan sendiri: Playground Unity