性感码农,在线解答:有什么问题可以扫屏幕右方二维码加我微信或者在下方留言。

跟着公司的发展战略走,不得不从cocoscreator转向了unity,转型成本不太大,很顺手。

在使用unity的过程中,发现很多cocos有的系统组件unity没有,需要自己来集成。比如:对象池,动作系统,spine动画系统等等。

今天简单说下对象池。

对于喜欢做饭的我来说,对象池就像是一个碗柜,需要用碗时去里面拿,等用完了洗洗干净再放回去,碗不够了再买新的放进去。

游戏中对应的就是需要使用游戏对象时从对象池里获取,使用完了再把游戏对象放回去,但要注意下次再拿出来时记得要重置游戏对象的各种属性。

代码如下:

using System.Collections.Generic;
using UnityEngine;

public class ObjectPool
{
    private GameObject _prefab;//对象池中的对象
    private readonly List<GameObject> _list = new List<GameObject>();//对象List

    //传游戏对象进来,并填充对象池
    public void CreateObject(GameObject prefab, int count = 1, bool worldPositionStays = false)
    {
        _prefab = prefab;
        for (var i = 0; i < count; ++i)
        {
            var obj = Object.Instantiate(prefab, null, worldPositionStays);
            obj.gameObject.SetActive(false);
            _list.Add(obj);
        }
    }

    //获取对象
    public GameObject Get()
    {
        if (_list.Count > 0)
        {
            var obj = _list[0];
            _list.RemoveAt(0);
            obj.gameObject.SetActive(true);
            return obj;
        }
        else
        {
            //若对象不足,则再创建新的
            return Object.Instantiate(_prefab, null, false);
        }
    }

    //回收对象
    public void Put(GameObject obj)
    {
        obj.transform.SetParent(null);
        obj.gameObject.SetActive(false);
        _list.Add(obj);
    }
}

使用如下:

var testPool = new ObjectPool();
testPool.CreateObject(testPrefab, 10);
var testObj = testPool.Get();
testPool.Put(testObj);

这样一个简单的对象池就完成了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注