您的位置:首页 > 移动开发 > Unity3D

Unity3D对象池技术(ObjectPool)小例子

2017-06-01 14:31 375 查看


ObjectPool 对象池脚本

这里面用继承单例框架脚本,此脚本在我的另一篇博客上单例框架脚本

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class ObjectPool : SingleTon<ObjectPool> {
//创建一个池子来存储这些对象(用字典的形式来区分不同类型)
private IDictionary<string,List<GameObject>>pool;//key用来存池子名称,value用list存游戏对象,我们用来叫做pool
//实例化我的对象池
public ObjectPool(){
pool = new Dictionary<string, List<GameObject>> ();
}

//========
//对象池无非两种一个是存,一个是取
//========

/// <summary>
/// 获取对象
/// </summary>
public GameObject GetObj(string objName,Vector3 pos,Quaternion qua){
//要获取的对象
GameObject currentObj=null;
//判断是否有该类型的对象池,如果包含这个对象池
if(pool.ContainsKey(objName)){
//再判断对象池中是否有东西
if(pool[objName].Count>0){
//获取当前对象
currentObj=pool[objName][0];//从第0号开始
//从池中移除
pool[objName].Remove(currentObj);
}
}
//如果没有该类型对象池
//如果对象为空
if (currentObj == null) {
//找一个继承mono的单例
currentObj = GameManager.instance.LoadObj (objName);
}
currentObj.transform.position = pos;
currentObj.transform.rotation = qua;
//激活对象
currentObj.SetActive(true);
return currentObj;
}

/// <summary>
/// 保存对象
/// </summary>
public void SetObj(GameObject go){
//取消激活对象
go.SetActive (false);//对象要进入对象池里,不要对游戏产生影响,所以先设置为非激活
//获取对象池名称
string objPoolName = go.name.Replace ("(Clone)", "");//replace(替换)把带有clone的文件替换
//判断这个池子里是否有存在
//如果该类型的对象池存在
if (pool.ContainsKey (objPoolName)) {
//将对象保存到对象池
pool [objPoolName].Add (go);
//否则该类型的对象池不存在
} else {
//创建对象池,并保存对象到对象池
pool.Add(objPoolName,new List<GameObject>(){go});
}

}
}


GameManager对象管理脚本

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class GameManager : MonoBehaviour {

public static GameManager instance;

void Awake(){
//单例脚本跟单例类的区别是,单例脚本要挂载到游戏对象上
instance = this;
}
void Update(){
if (Input.GetKeyDown (KeyCode.Space)) {
ObjectPool.GetInstance ().GetObj ("Sphere", Vector3.zero, Quaternion.identity);
}
}
/// <summary>
///加载并生成预设体的方法
/// </summary>
/// <returns>The object.</returns>
public GameObject LoadObj(string objName){
//加载预设体
GameObject currentPrefab = Resources.Load<GameObject> ("Prefabs/" + objName);
return Instantiate (currentPrefab);
}
}


SphereObj 脚本(主要是协程)

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class SphereObj : MonoBehaviour {
void OnEnable(){
StartCoroutine (Recycle());//设为非激活证明他启用,那么他既是开始
}
IEnumerator Recycle(){
yield return new WaitForSeconds (2f);
ObjectPool.GetInstance ().SetObj (gameObject);
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息