一梦鉴、腳本1:對(duì)象池:用于存放相同類(lèi)型的游戲?qū)ο?br>
usingSystem.Collections;
usingSystem.Collections.Generic;
usingUnityEngine;
///
///對(duì)象池
///用于存放相同類(lèi)型的游戲?qū)ο?/p>
///
//1.從對(duì)象池中取一個(gè)游戲?qū)ο?/p>
//2.回收某一個(gè)游戲?qū)ο?/p>
//3.回收所有游戲?qū)ο?/p>
//4.檢查某個(gè)游戲?qū)ο笫欠裨诔刈永?/p>
publicclassSubPool{
//對(duì)象池,里面存放場(chǎng)景中所需要的游戲?qū)ο?/p>
Listpool=newList();
//要?jiǎng)?chuàng)建的游戲物體的預(yù)設(shè)體
GameObjectprefab;
//返回預(yù)設(shè)體的名字,預(yù)設(shè)體的名字和對(duì)象池的名字一致
//在管理對(duì)象池的類(lèi)里面,可以通過(guò)預(yù)設(shè)體的名字找到相對(duì)應(yīng)的對(duì)象池
publicstringname{
get{
returnprefab.name;
}
}
//自定義構(gòu)造方法
publicSubPool(GameObjectobj){
prefab=obj;
}
//1.從對(duì)象池中取一個(gè)游戲?qū)ο?/p>
publicGameObjectSubPoolSpwan(){
GameObjectobj=null;
//遍歷集合中所有的對(duì)象,如果有就拿來(lái)用,如果沒(méi)有就創(chuàng)建
foreach(GameObjectiteminpool){
//如果游戲?qū)ο筇幱谖醇せ顮顟B(tài)就說(shuō)明該對(duì)象可用
if(item.activeSelf==false){
obj=item;
break;
}
}
//對(duì)象池里沒(méi)有可用的對(duì)象
if(obj==null){
//創(chuàng)建一個(gè)新的游戲?qū)ο?/p>
obj=GameObject.Instantiate(prefab)asGameObject;
//把新窗間的游戲?qū)ο蠹尤氲匠刈永?/p>
pool.Add(obj);
}
//游戲?qū)ο蟮臓顟B(tài)設(shè)置為未激活
obj.SetActive(true);
//通過(guò)子類(lèi)實(shí)例化接口對(duì)象力图,子類(lèi)的腳本組件繼承并實(shí)現(xiàn)了接口中的方法
//contrlller里面存的就是該類(lèi)實(shí)現(xiàn)的方法
//這個(gè)地方的游戲?qū)ο髸簳r(shí)就為子彈,之后隨意發(fā)揮爽篷,但是要繼承IController接口
IControllercontroller=obj.GetComponent();
if(controller!=null){
controller.Spawn();
}
returnobj;
}
//2.回收某一個(gè)游戲?qū)ο?/p>
publicvoidSubPoolUnSpwan(GameObjectobj){
//如果對(duì)象池的集合包含該游戲?qū)ο?/p>
if(SubPoolContains(obj)){
IControllercontroller=obj.GetComponent();
controller.UnSpawn();
}
//設(shè)置激活性
obj.SetActive(false);
}
//3.回收所有游戲?qū)ο?/p>
publicvoidSubPoolUnSpwanAll(){
//便利池子
foreach(GameObjectiteminpool){
if(item.activeSelf==true){
SubPoolUnSpwan(item);
}
}
}
//4.檢查某個(gè)游戲?qū)ο笫欠裨诔刈永?/p>
publicboolSubPoolContains(GameObjectobj){
returnpool.Contains(obj);
}
}
二周蹭、腳本2:用于管理存放各種類(lèi)型的游戲?qū)ο蟮膶?duì)象池爵嗅,管理類(lèi) 以Key-Value來(lái)管理
usingSystem.Collections;
usingSystem.Collections.Generic;
usingUnityEngine;
///
///用于管理存放各種類(lèi)型的游戲?qū)ο蟮膶?duì)象池,管理類(lèi)?以Key-Value來(lái)管理
///1.單例類(lèi)
///2.添加對(duì)象池的方法
///3.通過(guò)找到對(duì)象池笨蚁,調(diào)用對(duì)象池里面創(chuàng)建對(duì)象的方法返回
///4.回收游戲?qū)ο?/p>
///
publicclassPoolControl{
#region單例
publicstaticPoolControlinstance;
privatePoolControl(){
}
publicstaticPoolControlInstance{
get{
if(instance==null){
instance=newPoolControl();
}
returninstance;
}
}
//publicstaticPoolControlInstance;
#endregion
//創(chuàng)建字典睹晒,根據(jù)預(yù)設(shè)體的名字,找到對(duì)象的對(duì)象池
//存放各種類(lèi)型的對(duì)象池的集合
DictionarypoolDic=newDictionary();
//1.添加對(duì)象池
privatevoidRegister(stringname){
//根據(jù)名字去創(chuàng)建池子
GameObjectobj=Resources.Load(name)asGameObject;
SubPoolpool=newSubPool(obj);
//把池子添加到字典里
poolDic.Add(name,pool);
}
//2.獲取對(duì)象池里面的游戲?qū)ο?/p>
publicGameObjectSpawn(stringname){
//如果沒(méi)有這個(gè)游戲?qū)ο髮?duì)應(yīng)的池子
if(!poolDic.ContainsKey(name)){
Register(name);
}
//根據(jù)名字找到池子
SubPoolpool=poolDic[name];
returnpool.SubPoolSpwan();
}
//3.回收一個(gè)游戲?qū)ο?/p>
publicvoidUnSpawn(GameObjectobj){
//遍歷所有的池子
foreach(SubPoolpoolinpoolDic.Values){
//如果該對(duì)象池里面包含這個(gè)游戲?qū)ο?/p>
if(pool.SubPoolContains(obj)){
pool.SubPoolUnSpwan(obj);
break;
}
}
}
}
三括细、腳本3:接口類(lèi):用于管理對(duì)象的卵生和回收
usingSystem.Collections;
usingSystem.Collections.Generic;
usingUnityEngine;
//接口類(lèi):用于管理對(duì)象的卵生和回收
publicinterfaceIController{
//卵生對(duì)象
voidSpawn();
//回收對(duì)象
voidUnSpawn();
}
四伪很、腳本4:游戲?qū)ο螅˙ullet-Sphere):為了測(cè)試,我們?cè)谌〕鲆粋€(gè)對(duì)象后奋单,讓它3S后自動(dòng)回收;
usingSystem.Collections;
usingSystem.Collections.Generic;
usingUnityEngine;
publicclassBullet:MonoBehaviour,IController{
#regionIControllerimplementtation
publicvoidSpawn(){
//為了測(cè)試锉试,我們?cè)谌〕鲆粋€(gè)對(duì)象后,讓它3S后自動(dòng)回收;
Invoke("BulletUnSpawn",3f);
print("從對(duì)象池中取出一個(gè)游戲?qū)ο?);
}
publicvoidUnSpawn(){
print("把游戲?qū)ο蠡厥盏綄?duì)象池了");
}
#endregion
//子彈回收的方法
voidBulletUnSpawn(){
//回收游戲?qū)ο?/p>
PoolControl.Instance.UnSpawn(gameObject);
//重置游戲?qū)ο?/p>
transform.position=Vector3.zero;
}
voidUpdate(){
transform.position+=Vector3.forward*Time.deltaTime*5f;
}
}
五览濒、腳本5:用來(lái)控制“子彈”的發(fā)射
usingSystem.Collections;
usingSystem.Collections.Generic;
usingUnityEngine;
publicclassPlayer:MonoBehaviour{
//Updateiscalledonceperframe
voidUpdate(){
if(Input.GetKeyDown(KeyCode.Space)){
PoolControl.Instance.Spawn("Bullet");
}
}
}
實(shí)例演示截圖: