分享

Unity关于对象池的使用

 W_R_F 2017-01-06
在游戏中大量的出现的,比如敌人,子弹,都可以用到对象池,为什么要用的对象池呢?
  其实是因为系统在创建,销毁对象是非常消耗内存的,这样对优化内存会有很大的帮助。回头再总结一下优化方面的注意方面。那么,如何使用,或者说如何创建对象池呢?首先我们Assets 下创建一个Resources文件夹。里面放上需要重复创建的预制体。(注意给这个预制体加上刚体),创建脚本
  using UnityEngine;using System.Collections;using System.Collections.Generic;public class ObjectPool : MonoBehaviour { //定义一个池子,里面存的是对象名字,以及游戏对象 Dictionary> pool = new Dictionary>(); //这里定义一个伪单例 public static ObjectPool instance; void Awake() { instance = this; } //存对象的方法 public void ReturnPool(GameObject go) { //获取对象名 string name = go.name; //判断有无对象 if (pool.ContainsKey(name)) { pool[name].Add(go); } else {//没有对象池时,实例化一个 pool.Add(name, new List() {go}); } go.SetActive(false);//隐藏对象 } //取对象 public GameObject GetFromPool(string name, Vector3 p, Quaternion q) { GameObject go; //存的名字是(Clone) string prefabName = name '(Clone)'; //对象池中有改对象池时,并且其中存在的数量大于0,直接取对象 if (pool.ContainsKey(prefabName) && pool[prefabName].Count > 0) { go = pool[prefabName][0]; //获取后移除 pool[prefabName].RemoveAt(0); //设置坐标 go.SetActive(true); go.transform.position = p; go.transform.rotation = q; } else { go = Instantiate(Resources.Load(name), p, q)as GameObject; } return go; }}
  创建一个需要子弹打的墙,在鼠标点击的时候,发射子弹,在子弹触发的时候,存子弹进对象池:给墙加脚本
  using UnityEngine;using System.Collections;public class attack : MonoBehaviour { //鼠标按下,调用GetFromPool void OnMouseDown() { GameObject o= ObjectPool.instance.GetFromPool('Bullet', GameObject.Find('Point').transform.position, Quaternion.identity); o.transform.LookAt(transform.position); o.GetComponent().AddForce(Vector3.forward*3000); } //触发,调用方法ReturnPool void OnTriggerEnter(Collider collider) { if (collider.name=='Bullet(Clone)') { collider.gameObject.GetComponent().velocity = Vector3.zero; ObjectPool.instance.ReturnPool(collider.gameObject); } }}
  这样就实现了。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多