第二部分:
1,首先这个 类Gmpool里面都是静态函数 static,方便全局调用。
2,这个类有两个函数,就是两个功能,第一个就是创建和拿gameobject并 SetActive (true);,第二个是把gameobject放到里面并
SetActive (false);
public class Gmpool : MonoBehaviour {
public static Dictionary <string,ArrayList> dic = new Dictionary<string, ArrayList> ();
public static GameObject getObj(string prefabName,Vector3 position,Quaternion rotation){
go=(GameObject)Instantiate (Resources.Load("prefabs/"+prefabName),position,rotation);
return go; //注意预制体要放在
Resources/
prefabs目录下,我的图片有显示 getObj()拿object,函数后面会扩展
}
先写这么个简单的。这个
Dictionary是字典功能,可以去前面章节学习下,是用来存我们不用的gameobject也就是
g.SetActive (false)的物体。
然后这么一个简单的函数在
Gmmanager那边调用,会发生什么事情呢。
public class Gmmanager : MonoBehaviour {
void Update () {
if(Input.GetMouseButtonDown(0)){
Gmpool.getObj("Cube",transform.position,transform.rotation);
}
}
}
发生的事情就是和对象池讲解一里的一样,点下鼠标左键发射一个物体,物体一会自己摧毁。既然一样的话就没有什么卵用啊,所以发射后不能让他摧毁,让他不见也就是 SetActive (false);。所以先来到物体自身的代码
cubeForce。 public class cubeForce : MonoBehaviour {
public float mforce;
void Start () {
GetComponent<Rigidbody>().AddForce (Vector3.forward*mforce);
}
IEnumerator AutoHide()
{
yield return new WaitForSeconds(2f);
Gmpool.returnObj (this.transform.gameObject);
}
void Update(){
StartCoroutine(AutoHide());
}
}
物体自身就做这么一件事,开始一个协程,2秒后来到Gmpool.returnObj这个函数。好了,我们继续来到Gmpool这个类。看下returnObj的代码
public static GameObject returnObj(GameObject g){
string key = g.name;
if (dic.ContainsKey (key)) {//先判断有没有这个名称的key值,也就是Cube(Clone)
dic [key].Add (g);//然后把物体装进去,其实确切的意思应该是让dic [key]对应的数组元素指向g
} else {
dic [key] = new ArrayList (){ g};//这个就是没有Cube(Clone)这个名字就建一个,在g装进去
}
g.SetActive (false);//把物体变不见
return g;
}
///
这样就完成了什么功能的,就是鼠标点击一下,发射一个方块,然后过两秒方块消失---同时装到或者说藏到了 dic[key]里面,也就是dic[Cube(Clone)]里面。
所以还有一个重要问题没有解决,就是不停的点击鼠标不停的新建出方块,那么内存也就不停的在消耗,所以应该创建方块的时候先判断dic[key]里面有没有现成的方块,有的话取出就可以了,除非没有,那只能Instantiate新建了。所以继续回到Gmpool 类的这里函数getObj()。
GameObject go;
string gameObjname=prefabName+"(Clone)";//prefabName传进来的参数是Cube,要组合下
if (dic.ContainsKey (gameObjname) && dic[gameObjname].Count > 0) {
Debug.Log ("有Cube字和有数组了");//主要是判断Count>0,说明有藏东西的了
//returnObj之后有数组了,g.SetActive (false)了
ArrayList tempList= dic[gameObjname];//把东西先赋值给tempList这个临时变量
go = (GameObject)tempList [0];//把藏的第一个物体取出来,赋值给go这个临时变量
tempList.RemoveAt (0);//tempList里面的第一个元素移除调,那么之后tempList第一个可能有元素可能没元素了
go.SetActive (true);//让物体显示出来
go.transform.position = position;
go.transform.rotation = rotation;
} else {
Debug.Log("什么都没有");
go=(GameObject)Instantiate (Resources.Load("prefabs/"+prefabName),position,rotation);
}
return go;
这样就是这个对象池的整个顺序逻辑了。那么搞清楚之后,就可以自己加工了,比如什么时候getObj(),什么时候returnObj()。都可以由自己设计。
第三部分:
链接:http://pan.baidu.com/s/1slcQGZN 密码:gwr9
1,首先这个 类Gmpool里面都是静态函数 static,方便全局调用。
2,这个类有两个函数,就是两个功能,第一个就是创建和拿gameobject并 SetActive
public
}
发生的事情就是和对象池讲解一里的一样,点下鼠标左键发射一个物体,物体一会自己摧毁。既然一样的话就没有什么卵用啊,所以发射后不能让他摧毁,让他不见也就是 SetActive
cubeForce。 public
}
public
///
这样就完成了什么功能的,就是鼠标点击一下,发射一个方块,然后过两秒方块消失---同时装到或者说藏到了 dic[key]里面,也就是dic[Cube(Clone)]里面。
所以还有一个重要问题没有解决,就是不停的点击鼠标不停的新建出方块,那么内存也就不停的在消耗,所以应该创建方块的时候先判断dic[key]里面有没有现成的方块,有的话取出就可以了,除非没有,那只能Instantiate新建了。所以继续回到Gmpool 类的这里函数getObj()。
这样就是这个对象池的整个顺序逻辑了。那么搞清楚之后,就可以自己加工了,比如什么时候getObj(),什么时候returnObj()。都可以由自己设计。
第三部分:
链接:http://pan.baidu.com/s/1slcQGZN 密码:gwr9