Unity对象池的简单研究
对象池代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PoolTest : MonoBehaviour {
//集合
public List<GameObject> list = new List<GameObject>();
//预制体
public GameObject GOPrefeb;
public int MaxCount = 10;
//对象保存到对象池
public void Push(GameObject go){
if(list.Count < MaxCount){
list.Add(go);
}else{
Destroy(go);
}
}
//从对象池取出对象
public GameObject Pop(){
if(list.Count > 0){
GameObject go = list[0];
list.RemoveAt(0);
return go;
}else{
return Instantiate(GOPrefeb);
}
}
//清空对象池
public void Clear(){
list.Clear();
}
}
预制体上的消除判断:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Bullet : MonoBehaviour {
// Use this for initialization
public bool Damage;
void Start(){
Damage = false;
}
void OnCollisionEnter(Collision collision){
Damage = true;
}
// Update is called once per frame
void Update () {
}
}
生成对象的测试代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour {
private PoolTest Pool;
private List<GameObject> list = new List<GameObject>();
void Start () {
Pool = GetComponent<PoolTest>();
}
// Update is called once per frame
void Update () {
if(Input.GetMouseButtonDown(0)){
GameObject go = Pool.Pop();
list.Add(go);
go.transform.position = transform.position;
go.SetActive(true);
}
if(list.Count > 0){
bool Damege1 = list[0].GetComponent<Bullet>().Damage;
if(Damege1){
Damage();
}
}
}
void Damage(){
Pool.Push(list[0]);
list[0].SetActive(false);
list.RemoveAt(0);
if(list.Count > 0){
list[0].GetComponent<Bullet>().Damage = false;
}
}
}
效果:
(注意,此处没有多余的预制体生成)