一、脚本1:对象池:用于存放相同类型的游戏对象
usingSystem.Collections;
usingSystem.Collections.Generic;
usingUnityEngine;
///
///对象池
///用于存放相同类型的游戏对象
///
//1.从对象池中取一个游戏对象
//2.回收某一个游戏对象
//3.回收所有游戏对象
//4.检查某个游戏对象是否在池子里
publicclassSubPool{
//对象池,里面存放场景中所需要的游戏对象
Listpool=newList();
//要创建的游戏物体的预设体
GameObjectprefab;
//返回预设体的名字,预设体的名字和对象池的名字一致
//在管理对象池的类里面,可以通过预设体的名字找到相对应的对象池
publicstringname{
get{
returnprefab.name;
}
}
//自定义构造方法
publicSubPool(GameObjectobj){
prefab=obj;
}
//1.从对象池中取一个游戏对象
publicGameObjectSubPoolSpwan(){
GameObjectobj=null;
//遍历集合中所有的对象,如果有就拿来用,如果没有就创建
foreach(GameObjectiteminpool){
//如果游戏对象处于未激活状态就说明该对象可用
if(item.activeSelf==false){
obj=item;
break;
}
}
//对象池里没有可用的对象
if(obj==null){
//创建一个新的游戏对象
obj=GameObject.Instantiate(prefab)asGameObject;
//把新窗间的游戏对象加入到池子里
pool.Add(obj);
}
//游戏对象的状态设置为未激活
obj.SetActive(true);
//通过子类实例化接口对象,子类的脚本组件继承并实现了接口中的方法
//contrlller里面存的就是该类实现的方法
//这个地方的游戏对象暂时就为子弹,之后随意发挥,但是要继承IController接口
IControllercontroller=obj.GetComponent();
if(controller!=null){
controller.Spawn();
}
returnobj;
}
//2.回收某一个游戏对象
publicvoidSubPoolUnSpwan(GameObjectobj){
//如果对象池的集合包含该游戏对象
if(SubPoolContains(obj)){
IControllercontroller=obj.GetComponent();
controller.UnSpawn();
}
//设置激活性
obj.SetActive(false);
}
//3.回收所有游戏对象
publicvoidSubPoolUnSpwanAll(){
//便利池子
foreach(GameObjectiteminpool){
if(item.activeSelf==true){
SubPoolUnSpwan(item);
}
}
}
//4.检查某个游戏对象是否在池子里
publicboolSubPoolContains(GameObjectobj){
returnpool.Contains(obj);
}
}
二、脚本2:用于管理存放各种类型的游戏对象的对象池,管理类 以Key-Value来管理
usingSystem.Collections;
usingSystem.Collections.Generic;
usingUnityEngine;
///
///用于管理存放各种类型的游戏对象的对象池,管理类 以Key-Value来管理
///1.单例类
///2.添加对象池的方法
///3.通过找到对象池,调用对象池里面创建对象的方法返回
///4.回收游戏对象
///
publicclassPoolControl{
#region单例
publicstaticPoolControlinstance;
privatePoolControl(){
}
publicstaticPoolControlInstance{
get{
if(instance==null){
instance=newPoolControl();
}
returninstance;
}
}
//publicstaticPoolControlInstance;
#endregion
//创建字典,根据预设体的名字,找到对象的对象池
//存放各种类型的对象池的集合
DictionarypoolDic=newDictionary();
//1.添加对象池
privatevoidRegister(stringname){
//根据名字去创建池子
GameObjectobj=Resources.Load(name)asGameObject;
SubPoolpool=newSubPool(obj);
//把池子添加到字典里
poolDic.Add(name,pool);
}
//2.获取对象池里面的游戏对象
publicGameObjectSpawn(stringname){
//如果没有这个游戏对象对应的池子
if(!poolDic.ContainsKey(name)){
Register(name);
}
//根据名字找到池子
SubPoolpool=poolDic[name];
returnpool.SubPoolSpwan();
}
//3.回收一个游戏对象
publicvoidUnSpawn(GameObjectobj){
//遍历所有的池子
foreach(SubPoolpoolinpoolDic.Values){
//如果该对象池里面包含这个游戏对象
if(pool.SubPoolContains(obj)){
pool.SubPoolUnSpwan(obj);
break;
}
}
}
}
三、脚本3:接口类:用于管理对象的卵生和回收
usingSystem.Collections;
usingSystem.Collections.Generic;
usingUnityEngine;
//接口类:用于管理对象的卵生和回收
publicinterfaceIController{
//卵生对象
voidSpawn();
//回收对象
voidUnSpawn();
}
四、脚本4:游戏对象(Bullet-Sphere):为了测试,我们在取出一个对象后,让它3S后自动回收;
usingSystem.Collections;
usingSystem.Collections.Generic;
usingUnityEngine;
publicclassBullet:MonoBehaviour,IController{
#regionIControllerimplementtation
publicvoidSpawn(){
//为了测试,我们在取出一个对象后,让它3S后自动回收;
Invoke("BulletUnSpawn",3f);
print("从对象池中取出一个游戏对象");
}
publicvoidUnSpawn(){
print("把游戏对象回收到对象池了");
}
#endregion
//子弹回收的方法
voidBulletUnSpawn(){
//回收游戏对象
PoolControl.Instance.UnSpawn(gameObject);
//重置游戏对象
transform.position=Vector3.zero;
}
voidUpdate(){
transform.position+=Vector3.forward*Time.deltaTime*5f;
}
}
五、脚本5:用来控制“子弹”的发射
usingSystem.Collections;
usingSystem.Collections.Generic;
usingUnityEngine;
publicclassPlayer:MonoBehaviour{
//Updateiscalledonceperframe
voidUpdate(){
if(Input.GetKeyDown(KeyCode.Space)){
PoolControl.Instance.Spawn("Bullet");
}
}
}
实例演示截图: