Object Pooling - Các bước cần làm


B1. Tạo file ObjectPooler có nhiêm vụ quản lý tất cả các object pool bạn muốn tạo trong project.
Dưới đây là đoạn code của file script :

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

[System.Serializable]
public class ObjectPoolItem
{
    public GameObject objectToPool;
    public int amountToPool;
    public bool shouldExpand;
}

public class ObjectPooler : MonoBehaviour
{

    public static ObjectPooler SharedInstance;
    public List<ObjectPoolItem> itemsToPool;
    public List<GameObject> pooledObjects;

    void Awake()
    {
        SharedInstance = this;
    }

    // Use this for initialization
    void Start()
    {
        pooledObjects = new List<GameObject>();
        foreach (ObjectPoolItem item in itemsToPool)
        {
            for (int i = 0; i < item.amountToPool; i++)
            {
                GameObject obj = (GameObject)Instantiate(item.objectToPool);
                obj.SetActive(false);
                pooledObjects.Add(obj);
            }
        }
    }

    public GameObject GetPooledObject(string tag)
    {
        for (int i = 0; i < pooledObjects.Count; i++)
        {
            if (!pooledObjects[i].activeInHierarchy && pooledObjects[i].tag == tag)
            {
                return pooledObjects[i];
            }
        }
        foreach (ObjectPoolItem item in itemsToPool)
        {
            if (item.objectToPool.tag == tag)
            {
                if (item.shouldExpand)
                {
                    GameObject obj = (GameObject)Instantiate(item.objectToPool);
                    obj.SetActive(false);
                    pooledObjects.Add(obj);
                    return obj;
                }
            }
        }
        return null;
    }

}

 
Class chỉ có 2 thương thức: Start() và GetPoolObject()
Hàm Start() để tạo một mảng pool sẽ được gọi khi bắt đầu game.
ObjectPoolItem bao gồm đối tượng mà bạn muốn tạo pool, số lượng, và một biến bool để hỏi rằng bạn có muốn tạo mảng pool khác khi mà các điều kiện không thể get được object nào từ mảng pool cũ hay không. 
poolObjects là mảng pool được tạo ra
Hàm GetPoolObject() để lấy đối tượng trong pool ra sử dụng

B2. Khi bắn viên đạn, bạn chỉ cần lấy một object trong pool ra và active nó lên :
GameObject bulletClone;
bulletClone = ObjectPooler.SharedInstance.GetPooledObject("Bullet") as GameObject;
bulletClone.transform.position = shootPointLeft.transform.position;
bulletClone.transform.rotation = shootPointLeft.transform.rotation;
bulletClone.SetActive(true);
bulletClone.GetComponent<Rigidbody2D>().velocity = direction * bulletSpeed;


B3. Khi viên đạn va cham, thay vì destroy nó, chỉ cần setActive false cho nó
 public class Bullet : MonoBehaviour
{
    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.isTrigger != true)
        {
            if (collision.gameObject.CompareTag("Player") || collision.gameObject.CompareTag("Platform"))
            {
                //collision.GetComponent<HeroController>()
                if (gameObject.tag == "Bullet")
                {
                    gameObject.SetActive(false);
                }
            }          
        }
    }
}


Đó là tất cả các bước cần làm, rất đơn giản phải không ?


Comments

Popular posts from this blog

2D Lights trong Unity

Object Pooling - Tại sao phải sử dụng