Unity对象池的实现

原创 2015年07月07日 09:52:23

网上介绍对象池的文章有很多,但是总感觉代码不太清晰,并不适合新手学习

最近在一个工程里看到一段对象池的代码感觉不错,故分享一下

[code]phpcode:

using UnityEngine;

using System.Collections;

using System.Collections.Generic;

using System;

 

public class PoolManager : UnitySingleton<PoolManager> {

 

       public staticDictionary<Type, Stack<IPoolable>> ObjectPoolDic = newDictionary<Type, Stack<IPoolable>>();

       public staticDictionary<Type, int> ObjectPoolSizeDic = new Dictionary<Type,int>();

      

       void Start () {

 

       }

      

       public voidRegistPoolableType(Type type, int poolSize)

       {

              if(!ObjectPoolDic.ContainsKey(type))

              {

                     ObjectPoolDic[type]= new Stack<IPoolable>();

                     ObjectPoolSizeDic[type]= poolSize;

              }

       }

      

       public bool HasPoolObject(Typetype)

       {

              returnObjectPoolDic.ContainsKey(type) && ObjectPoolDic[type].Count > 0;

       }

      

       public bool IsPoolFull(Typetype)

       {

              if(!ObjectPoolDic.ContainsKey(type))

                     return true;

              else if(ObjectPoolDic[type].Count >= ObjectPoolSizeDic[type])

                     return true;

              return false;

       }

      

       public IPoolableTakePoolObject(Type type)

       {

              if(ObjectPoolDic.ContainsKey(type) && ObjectPoolDic[type].Count > 0)

              {

                     returnObjectPoolDic[type].Pop();

              }

              else

              {

                     return null;

              }

       }

      

       public boolPutPoolObject(Type type, IPoolable obj)

       {

              if(!ObjectPoolDic.ContainsKey(type) || ObjectPoolDic[type].Count >=ObjectPoolSizeDic[type])

              {

                     GameObject.Destroy((objas MonoBehaviour).gameObject);

                     return false;

              }

              else

              {

                     (obj as MonoBehaviour).gameObject.SetActive(false);

                     //(obj asMonoBehaviour).transform.parent = GameManager.Instance.PoolRoot;

                     ObjectPoolDic[type].Push(obj);

                     return true;

              }

       }

}

首先继承自一个单例类,就可以用PoolManager.Instance来获取这个类的单例了

定义了两个字典,一个用来对应存储对应的对象类型的栈,一个用来记录实例化的最大个数来控制内存

用的时候Pop,用完了Push

可存储在对象池的对象必须实现IPoolable接口

[code]phpcode:

using UnityEngine;

using System.Collections;

 

public interface IPoolable {

 

       void Destroy();

}

destroy里可以这样写

[code]phpcode:

       if(!PoolManager.Instance.IsPoolFull(GetType()))

              {

                     PoolManager.Instance.PutPoolObject(GetType(),this);

              }

              else

              {

                     GameObject.Destroy(this.gameObject);

              }

 

兄弟连IT教育与全球移动游戏联盟(GMGC)共同设立中国首家基于高端游戏开发的兄弟连&GMGC手游学院!高薪就业,就学手游开发,详情咨询官网客服:http://game.lampbrother.net/

学PHP、Linux、HTML5、UI、Android等视频教程(课件+笔记+视频)!联系Q2430675018

参加活动领取兄弟连原创视频教程光盘合集:http://www.lampbrother.net/newcd.html

 

unity - 对象池技术的实现与应用

本人之前发表在蛮牛网上的,现迁移至此。 本文为学习总结文章,如有错误请大神们指出~ 理论参考:http://www.cnblogs.com/mezero/p/3955130.html ...
  • u013236878
  • u013236878
  • 2016年09月05日 19:55
  • 3447

Unity3d中对象池(ObjectPool)的实现思路

概述 什么是对象池?   池(Pool),与集合在某种意义上有些相似。 水池,是一定数量的水的集合;内存池,是一定数量的已经分配好的内存的集合;线程池,是一定数量的已经创建好的线程的集合。...
  • appppppen
  • appppppen
  • 2016年10月25日 16:39
  • 1600

关于unity对象池的用法

当游戏中需要发射子弹(gameobject)等操作的时候,不停的Instantiate和destroy就会很耗性能,如果又是多人游戏,那多人同时Instantiate和destroy子弹,配置不高的设...
  • liuleitheone
  • liuleitheone
  • 2016年08月04日 10:22
  • 3177

基于Unity3D的对象池的实现

对象池在游戏优化中起着很重要的作用,今天我们来实现一个简单的对象池功能。...
  • YongshuangZhao
  • YongshuangZhao
  • 2017年11月06日 22:10
  • 55

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

第二部分: 1,首先这个 类Gmpool 里面都是静态函数 static ,方便全局调用。 2, 这个类有两个函数,就是两个功能,第一个就是创建和拿gameobject并 SetActive (tru...
  • vipzjh
  • vipzjh
  • 2016年08月15日 15:14
  • 122

Unity对象池的实现

网上介绍对象池的文章有很多,但是总感觉代码不太清晰,并不适合新手学习 最近在一个工程里看到一段对象池的代码感觉不错,故分享一下 [code]phpcode: using UnityE...
  • Ymiku
  • Ymiku
  • 2015年07月05日 16:52
  • 237

【Unity3D 打斗游戏开发】之三 简单实现对象池

关于对象池的概念网上很多资料都已经介绍过来了,而且网上也有大神写的插件PoolManager。我比较少使用,因为平时做的项目偏小型,所以比较排斥把各种插件放到项目里(个人比较崇尚精简主义)。而我更喜欢...
  • chy_xfn
  • chy_xfn
  • 2016年09月13日 11:53
  • 1048

Unity3d对象池源代码

  • 2015年10月15日 16:08
  • 12KB
  • 下载

Unity最新版对象池插件 PoolManager 6.0.0

  • 2017年05月28日 17:23
  • 3.16MB
  • 下载

Unity实现在安卓手机上触屏控制转向--控制对象为飞机

该实例是Unity实现在移动端通过触摸屏幕进行对飞机的移动和转向,用于学习Touch类的相关知识public class AirControl:MonoBehaviour{ private T...
  • WZH_YBW
  • WZH_YBW
  • 2017年12月12日 18:26
  • 1420
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Unity对象池的实现
举报原因:
原因补充:

(最多只允许输入30个字)