unity3D学习【功能实现】之八:对象池讲学习二

来源:互联网 发布:消防大数据平台 编辑:程序博客网 时间:2024/06/04 01:19
第二部分:
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);。所以先来到物体自身的代码
cubeForcepublic 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
0 0
原创粉丝点击