Unity中对象池的使用

Unity中对象池的使用

定义对象池

public class NewObjectPooler : MonoBehaviour
{
    public GameObject _gameObject;
    //需要创建的预制对象
    public int int_PooledAmount = 15;
    //初始化数量
    public Transform _tranForm;
    //放置预制对象的容器
    public bool bool_IsGrow = true;
    //动态创建
    List<GameObject> _gameObjects;

    private void Awake ()
    {
        _gameObjects = new List<GameObject> ();

        for (int i = 0; i < int_PooledAmount; i++) {
            GameObject obj = (GameObject)Instantiate (_gameObject);
            obj.transform.SetParent (_tranForm);
            obj.transform.localScale = Vector3.one;
            obj.transform.position = _tranForm.position;
            obj.transform.rotation = _tranForm.rotation;
            obj.SetActive (false);
            _gameObjects.Add (obj);
        }
    }

    // 初始化
    public void Reset ()
    {
        for (int i = 0; i < _gameObjects.Count; i++) {
            _tranForm.GetChild (i).gameObject.SetActive (false);
        }
    }


    // 获取对象
    public GameObject GetPooledGameObject ()
    {
        for (int i = 0; i < _gameObjects.Count; i++) {
            if (!_gameObjects [i].activeInHierarchy) {
                return _gameObjects [i];
            }
        }

        // 动态添加
        if (bool_IsGrow) {
            GameObject obj = (GameObject)Instantiate (_gameObject);
            obj.transform.SetParent (_tranForm);
            obj.transform.localScale = Vector3.one;
            obj.transform.position = _tranForm.position;
            obj.transform.rotation = _tranForm.rotation;
            _gameObjects.Add (obj);
            return obj;  
        }

        return null;
    }

}

对象池的使用

public void SetData (List<DataClass.TaskData> datas)
    {
        newObjectPooler.Reset ();
        for (int i = 0; i < datas.Count; i++) {
            GameObject obj = newObjectPooler.GetPooledGameObject ();
            obj.SetActive (true);
            UITaskItem item = obj.GetComponent<UITaskItem> ();
            item.SetData (datas [i]);
        }

        content.sizeDelta = new Vector2 (content.sizeDelta.x, 
            (gridLayoutGroup.cellSize.y + gridLayoutGroup.spacing.y) * datas.Count);
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity,可以通过编写脚本来手动实现对象池,也可以使用Unity提供的对象池类来创建对象池。 以下是手动实现对象池的示例代码: ```csharp using UnityEngine; using System.Collections.Generic; public class ObjectPool : MonoBehaviour { public GameObject prefab; // 要缓存的对象的预制件 public int poolSize; // 缓存池的大小 private List<GameObject> objectPool = new List<GameObject>(); void Start () { // 创建缓存池的对象 for (int i = 0; i < poolSize; i++) { GameObject obj = Instantiate(prefab); obj.SetActive(false); objectPool.Add(obj); } } // 从对象池获取空闲对象 public GameObject GetObject() { foreach (GameObject obj in objectPool) { if (!obj.activeInHierarchy) { obj.SetActive(true); return obj; } } // 如果没有空闲对象,则创建一个新对象 GameObject newObj = Instantiate(prefab); objectPool.Add(newObj); return newObj; } // 将对象放回对象池 public void ReturnObject(GameObject obj) { obj.SetActive(false); } } ``` 以上代码演示了如何手动实现一个简单的对象池。首先在Start方法创建一定数量的对象,然后在GetObject方法遍历对象池,找到一个未激活的对象返回。如果没有空闲对象,则创建一个新对象并添加到对象池。最后,在ReturnObject方法将不再需要的对象放回对象池,将其激活状态设为false。 使用以上代码时,需要将希望缓存的对象的预制件赋值给prefab变量,并指定缓存池的大小。 Unity也提供了可重用对象池的类ObjectPool,可以在需要使用时直接调用。以下是Unity官方文档的示例代码: ```csharp using UnityEngine; using UnityEngine.Pool; public class ObjectPoolExample : MonoBehaviour { public GameObject prefab; public int poolSize; private ObjectPool<GameObject> objectPool; void Start() { objectPool = new ObjectPool<GameObject>(() => Instantiate(prefab), poolSize, item => item.SetActive(true), item => item.SetActive(false)); } void Update() { // 从池获取对象 GameObject obj = objectPool.Get(); // 将对象放回池 objectPool.Release(obj); } } ``` 以上代码演示了如何使用Unity提供的ObjectPool类创建可重用对象池。首先,在Start方法创建一个ObjectPool对象,并指定预制件创建方法、池大小、对象取出和放回时的回调函数等。然后,在Update方法可以通过Get方法取出对象,通过Release方法将对象放回对象池。 无论是手动实现对象池还是使用Unity提供的ObjectPool类,都可以有效地减少对象创建和销毁的次数,提高性能并减少内存占用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值