对象池
原理:存放对象的缓冲区。用户可以从缓冲区中放入/取出对象。满足游戏中经常产生/销毁大量相同游戏对象的需求(比如金币、宝箱、特效)。对象池可以避免重复性的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;
}
}