Unity 对象池

对象池

原理:存放对象的缓冲区。用户可以从缓冲区中放入/取出对象。满足游戏中经常产生/销毁大量相同游戏对象的需求(比如金币、宝箱、特效)。对象池可以避免重复性的Instantiate和Destroy,进而提高游戏性能。
代码解读:利用字典Dictionary<string,List< GameObject >>存储,由两部分组成,一部分是PushObj将物体放入池子的操作,放入池子的时候,将物体隐藏,并将自身位置移动到挂载脚本文件的物体下。另外一部分是从池子里取物体的操作,取的时候写个方法CreatePool(String objname),先判断池子里有没有这个物体的名字,如果不包含,则先创建一个objList,然后从文件的预制体中获取并实例化这个物体,再把这个物体添加到objList,再添加到池子中。如果池子中有这个名字,但是objList的个数小于等于0,则从文件的预制体里实例化这个物体,添加入objList。这个方法操作完之后,再进行取值操作,取物体时,显示物体,并赋予父物体和位置,返回obj。

using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;

public class Pool : MonoBehaviour
{
    public static Pool Instance;

    public Dictionary<string, List<GameObject>> pool = new Dictionary<string, List<GameObject>>();

    public void PushObj(string objname, GameObject obj)
    {
        obj.transform.gameObject.SetActive(true);        
        obj.SetActive(false);
        obj.transform.SetParent(transform);
        pool[objname].Add(obj);
    }

    public GameObject GetObj(string objname, Transform parent, Vector3 position)
    {
        CreatePool(objname);
        var objList = pool[objname];
        var obj = objList[0];
        objList.Remove(obj);
        obj.SetActive(true);
        obj.name = objname;
        obj.transform.SetParent(parent);
        obj.transform.position = position;
        return obj;
    }

    private void CreatePool(string objname)
    {
        if (!pool.ContainsKey(objname))
        {
            var obj = Instantiate(Resources.Load<GameObject>("Prefab/" + objname));
            var objList = new List<GameObject>();
            objList.Add(obj);
            pool.Add(objname, objList);
        }
        else
        {
            var objList = pool[objname];
            if (objList.Count <= 0)
            {
                var obj = Instantiate(Resources.Load<GameObject>("Prefab/" + objname));
                objList.Add(obj);
            }
        }
    }
    private void Awake()
    {
        Instance = this;
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值