说对象池之前首先来看看单例类和单例脚本的区别。这里有介绍

http://blog.csdn.net/lzhq1982/article/details/12649281

使用对象池的好处是不用每次都创建对象。销毁在创建,比如子弹的发射,当创建好的子弹。可以在使用后保存到对象池里面。当用的时候。直接从对象池中取即可

这里随便举个列子

鼠标左键单击发射蓝色球。右键发射红色球

aaarticlea/png;base64,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" alt="" />

Main Camera挂载Fire.cs脚本

GameObject挂载单列脚本ObjectPools.cs

Fire.cs代码

 using UnityEngine;
using System.Collections; public class Fire : MonoBehaviour
{ public GameObject builPrefabRed; public GameObject builPrefabGreen; GameObject o; // Use this for initialization
void Start()
{ } // Update is called once per frame
void Update()
{ if (Input.GetMouseButtonDown())
{ o = ObjectPools.Instance.MyInstantiate(builPrefabRed, transform.position, Quaternion.identity) as GameObject; //o = Instantiate(builPrefab, transform.position, Quaternion.identity) as GameObject; o.rigidbody.AddForce(Vector3.forward * ); //Destroy(o, 2);
}
else if (Input.GetMouseButtonDown())
{
o = ObjectPools.Instance.MyInstantiate(builPrefabGreen, transform.position, Quaternion.identity) as GameObject; o.rigidbody.AddForce(Vector3.forward * );
}
}
}

ObjectPools.cs类

 using UnityEngine;
using System.Collections;
using System.Collections.Generic; /// <summary>
/// 对象池脚本
///
/// 管理子弹。当子弹用完后。回收
/// </summary>
public class ObjectPools : MonoBehaviour
{ GameObject result; List<GameObject> poolsred; Dictionary<string, List<GameObject>> poolList; private static ObjectPools instance; public static ObjectPools Instance
{
get { return instance; }
//set { ObjectPools.instance = value; }
} void Awake()
{
poolsred = new List<GameObject>(); //实例化对象池 instance = this; //单列 poolList = new Dictionary<string, List<GameObject>>();
}
string tag;
public GameObject MyInstantiate(GameObject prefab, Vector3 position, Quaternion rotation)
{
tag = prefab.tag;
//如果有某个小集合的key,并且小集合内元素数量大于0
if (poolList.ContainsKey(tag) && poolList[tag].Count > ) //弹夹里面有子弹
{
result = poolList[tag][];//取弹夹里面的第一颗子弹
poolList[tag].Remove(result); //从弹夹移除子弹 result.transform.position = position;
result.transform.rotation = rotation;
}
else
{ if (!poolList.ContainsKey(tag))
{
poolList.Add(tag, new List<GameObject>());
}
result = Instantiate(prefab, position, rotation) as GameObject;
}
//开启协程方法
StartCoroutine(ReturnToPools(result));
result.SetActive(true);
return result;
} /// <summary>
/// 协程 同步方法 在同一个线程里面
/// </summary>
/// <param name="bullet"></param>
/// <returns></returns>
public IEnumerator ReturnToPools(GameObject bullet)
{
yield return new WaitForSeconds(2f); //等待2秒 poolList[bullet.tag].Add(bullet); //poolsred.Add(bullet); //取消力
bullet.rigidbody.velocity = Vector3.zero; bullet.SetActive(false);
} // Use this for initialization
void Start()
{ } // Update is called once per frame
void Update()
{ }
}

unity3d对象池的使用的更多相关文章

  1. Unity3d对象池

    Singleton.cs 12345678910111213 using UnityEngine;/// <summary>/// 单例模版类/// </summary>pub ...

  2. Unity3D 对象池思想 在游戏开发中的运用

    分类:U3D 1.在王者荣耀中,每30秒小兵会出现一波,出现之后会被敌方玩家或敌方小兵销毁,一局游戏下来,小兵会被创建多次,同时也会被销毁,在游戏中,这种频繁的创建和销毁游戏对象是很损耗性能的.在游戏 ...

  3. Unity3D 基于预设(Prefab)的泛型对象池实现

    背景 在研究Inventory Pro插件的时候,发现老外实现的一个泛型对象池,觉得设计的小巧实用,不敢私藏,特此共享出来. 以前也看过很多博友关于对象池的总结分享,但是世界这么大,这么复杂到底什么样 ...

  4. 游戏开发设计模式之对象池模式(unity3d 示例实现)

    前篇:游戏开发设计模式之命令模式(unity3d 示例实现) 博主才学尚浅,难免会有错误,尤其是设计模式这种极富禅意且需要大量经验的东西,如果哪里书写错误或有遗漏,还请各位前辈指正. 原理:从一个固定 ...

  5. [译]Unity3D内存管理——对象池(Object Pool)

    原文地址:C# Memory Management for Unity Developers (part 3 of 3), 其实从原文标题可以看出,这是一系列文章中的第三篇,前两篇讲解了从C#语言本身 ...

  6. Unity3D 游戏开发构架篇 —— 动态大场景生成 = 区域加载+对象池管理

    项目做一个类似无尽模式的场景,想了一想,其实方法很简单,做一个相关的总结. 主要先谈一谈构架,后期附上代码. 一.区域加载 其实无尽场景的实现很简单,因为屏幕限制,那么不论何时何地,我们只能看到自己的 ...

  7. 设计模式之美:Object Pool(对象池)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):实现 DatabaseConnectionPool 类. 实现方式(二):使用对象构造方法和预分配方式实现 ObjectPool ...

  8. Egret中的对象池ObjectPool

    为了可以让对象复用,防止大量重复创建对象,导致资源浪费,使用对象池来管理. 对象池具体含义作用,自行百度. 一 对象池A 二 对象池B 三 字符串key和对象key的效率 一 对象池A /** * 对 ...

  9. 对象池与.net—从一个内存池实现说起

    本来想写篇关于System.Collections.Immutable中提供的ImmutableList里一些实现细节来着,结果一时想不起来源码在哪里--为什么会变成这样呢--第一次有了想写分析的源码 ...

随机推荐

  1. {MySQL存储引擎介绍}一 存储引擎解释 二 MySQL存储引擎分类 三 不同存储引擎的使用

    MySQL存储引擎介绍 MySQL之存储引擎 本节目录 一 存储引擎解释 二 MySQL存储引擎分类 三 不同存储引擎的使用 一 存储引擎解释 首先确定一点,存储引擎的概念是MySQL里面才有的,不是 ...

  2. [No0000139]轻量级文本编辑器,Notepad最佳替代品:Notepad++

    在详细介绍Notepad++之前,先来解释一下,为何要选择Notepad++,即把常见的一些文本编辑器和Notepad++比较,看看其有哪点好: 常见的文本编辑器有很多,此处,只提及Notepad,N ...

  3. OC变量限定符和属性限定符

    ARC当中变量的四种生命周期限定符 __strong __weak __unsafe_unretained __autoreleaseing __strong 是默认的限定符,无需显示引入,只要有强引 ...

  4. arcengine直连sde

    搞了半天,找了好多资料,实验好多次,终于解决.参考资料:http://www.cnblogs.com/gaxin/p/5777864.html

  5. jcgrid

    1.jcgrid实现 <span class="JcGrid" id="MyGrid" listdata="Rds.List.UserList& ...

  6. DevExpress前端组件库

    适用于为.Net环境(也有dephi版本,其他环境未知)下 WinForm\WebForm\ASP MVC的前端扩展组件,帮助生成高度windows office统一风格的界面. 在winform下, ...

  7. oracle优化:避免全表扫描

    http://blog.csdn.net/onetree2010/article/details/6098259

  8. 自然语言处理nlp工具

    1.结巴 适合语言:python 应用场景:中文分词较好 不适用于命名实体识别.信息抽取 2.nltk 适合语言:python 应用场景:不适用于中文分词,效果较差 提供了一些用于方便的方法

  9. VS Code Html Zen coding

    zen coding是一种编写html和css的方法, 很快捷. 打开Views/Home/About.cshtml, 然后在空白处输入div然后按Tab: 随后完整的div标签就出来了: zen c ...

  10. python datetime 模块

    import datetime datetime.datetime.now() 打印本地当前时间 >>> print(datetime.datetime.now()) 2017-12 ...