说对象池之前首先来看看单例类和单例脚本的区别。这里有介绍
使用对象池的好处是不用每次都创建对象。销毁在创建,比如子弹的发射,当创建好的子弹。可以在使用后保存到对象池里面。当用的时候。直接从对象池中取即可
这里随便举个列子
鼠标左键单击发射蓝色球。右键发射红色球
Main Camera挂载Fire.cs脚本
GameObject挂载单列脚本ObjectPools.cs
Fire.cs代码
1 using UnityEngine; 2 using System.Collections; 3 4 public class Fire : MonoBehaviour 5 { 6 7 public GameObject builPrefabRed; 8 9 public GameObject builPrefabGreen;10 11 GameObject o;12 13 // Use this for initialization14 void Start()15 {16 17 }18 19 // Update is called once per frame20 void Update()21 {22 23 if (Input.GetMouseButtonDown(1))24 {25 26 o = ObjectPools.Instance.MyInstantiate(builPrefabRed, transform.position, Quaternion.identity) as GameObject;27 28 //o = Instantiate(builPrefab, transform.position, Quaternion.identity) as GameObject;29 30 o.rigidbody.AddForce(Vector3.forward * 200);31 32 //Destroy(o, 2);33 }34 else if (Input.GetMouseButtonDown(0))35 {36 o = ObjectPools.Instance.MyInstantiate(builPrefabGreen, transform.position, Quaternion.identity) as GameObject;37 38 o.rigidbody.AddForce(Vector3.forward * 200);39 }40 }41 }
ObjectPools.cs类
1 using UnityEngine; 2 using System.Collections; 3 using System.Collections.Generic; 4 5 ///6 /// 对象池脚本 7 /// 8 /// 管理子弹。当子弹用完后。回收 9 /// 10 public class ObjectPools : MonoBehaviour11 {12 13 GameObject result;14 15 Listpoolsred;16 17 18 Dictionary > poolList;19 20 21 private static ObjectPools instance;22 23 public static ObjectPools Instance24 {25 get { return instance; }26 //set { ObjectPools.instance = value; }27 }28 29 void Awake()30 {31 poolsred = new List (); //实例化对象池32 33 instance = this; //单列34 35 poolList = new Dictionary >();36 }37 string tag;38 public GameObject MyInstantiate(GameObject prefab, Vector3 position, Quaternion rotation)39 {40 tag = prefab.tag;41 //如果有某个小集合的key,并且小集合内元素数量大于042 if (poolList.ContainsKey(tag) && poolList[tag].Count > 0) //弹夹里面有子弹43 {44 result = poolList[tag][0];//取弹夹里面的第一颗子弹45 poolList[tag].Remove(result); //从弹夹移除子弹46 47 result.transform.position = position;48 result.transform.rotation = rotation;49 }50 else51 {52 53 if (!poolList.ContainsKey(tag))54 {55 poolList.Add(tag, new List ());56 }57 result = Instantiate(prefab, position, rotation) as GameObject;58 }59 //开启协程方法60 StartCoroutine(ReturnToPools(result));61 result.SetActive(true);62 return result;63 }64 65 66 /// 67 /// 协程 同步方法 在同一个线程里面68 /// 69 /// 70 ///71 public IEnumerator ReturnToPools(GameObject bullet)72 {73 yield return new WaitForSeconds(2f); //等待2秒74 75 poolList[bullet.tag].Add(bullet);76 77 //poolsred.Add(bullet);78 79 80 //取消力81 bullet.rigidbody.velocity = Vector3.zero;82 83 bullet.SetActive(false);84 }85 86 // Use this for initialization87 void Start()88 {89 90 }91 92 // Update is called once per frame93 void Update()94 {95 96 }97 }