为了避免每次发射的子弹和敌人都要实例化一个新的对象,使用对象池将对象循环利用起来。使用对象池,将使用过的子弹和敌人、陨石反激活,而不是将这些预制体Destroy,当再次需要被实例化的时候,将他们激活就可以循环使用。
public class ObjectList
{
private List<GameObject> _ObjectList { get; set; }
public ObjectList()
{
_ObjectList = new List<GameObject>();
}
public GameObject GetGameObject(string name)
{
for (int i = 0; i < _ObjectList.Count; i++)
{
if (_ObjectList[i].activeSelf==false)
{
_ObjectList[i].SetActive(true);
return _ObjectList[i];
}
}
GameObject gameObject = GameObject.Instantiate(PrefabManager.GetPrefab(name));
_ObjectList.Add(gameObject);
return gameObject;
}
}
public class PrefabManager
{
static Dictionary<string, GameObject> _prefabDictionary;
static PrefabManager()
{
_prefabDictionary = new Dictionary<string, GameObject>();
}
public static GameObject GetPrefab(string name)
{
if (_prefabDictionary.ContainsKey(name))
{
return _prefabDictionary[name];
}
GameObject prefab = Resources.Load<GameObject>(name);
if (prefab==null)
{
Debug.LogError("未发现该预制体");
return null;
}
return prefab;
}
}
public class ObjectPool
{
private static Dictionary<string, ObjectList> _objectPool;
private static Dictionary<string, ObjectList> _ObjectPool
{
get
{
if (_objectPool==null)
{
_objectPool = new Dictionary<string, ObjectList>();
}
return _objectPool;
}
}
private static ObjectList GetObjectList(string name)
{
if (_ObjectPool.ContainsKey(name))
{
return _ObjectPool[name];
}
ObjectList objectList = new ObjectList();
_ObjectPool.Add(name, objectList);
return objectList;
}
public static GameObject GetGameObject(string name)
{
ObjectList objectList = GetObjectList(name);
return objectList.GetGameObject(name);
}
public static void CallBack(GameObject gameObject)
{
gameObject.SetActive(false);
}
}