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

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. iOS调用第三方导航和线路规划

    线路规划: https://blog.csdn.net/qq_19979539/article/details/51938995 百度地图:baidumap: 高德地图:iosamap: 腾讯地图:q ...

  2. AutoMapper介绍(未完待续、部分没实现)

    实体间转换工具.其实也可以用Json来实现同名属性.异名属性(用JsonProperty指明)的自动转换 最新版本6.11 需要使用vs2013以上.vs2012下载新版 nuget会遇到问题.只能旧 ...

  3. [daily][CentOS][SELinux]用key免登陆不成功,原来是SElinux在搞事情

    为了提高效率,一般情况下,会把公钥放到sshd主机的 $HOME/.ssh/authorized_keys 文件内. 把私钥放在client的 $HOME/.ssh/ 下. 然后就可以免密登录了.然而 ...

  4. Mybatis中dao接口和mapper 的加载过程

    这里考虑的是mybatis和spring整合的场景 1.在系统启动的时候,会去执行配置文件中有关扫描mybatis接口的配置:通过MapperScannerConfigurer扫描接口生成spring ...

  5. ajax 上传文件,显示进度条,进度条100%,进度条隐藏,出现卡顿就隐藏进度条,显示正在加载,再显示上传完成

    <form id="uploadForm" method="post" enctype="multipart/form-data"&g ...

  6. Java+selenium 如何操作日历控件

    场景:一般的日期控件都是input标签下弹出来的,如果使用webdriver 去设置日期, 1. 定位到该input 2. 使用sendKeys 方法 但是,有的日期控件是readonly的 ,比如神 ...

  7. 主动触发input框的失去焦点事件,阻止输入法跳出

    今天遇到个问题,我在手机做一个选择生日的功能,但是当我点击input框时,事件选择插件和输入法都弹出来了,很丑,然后就想阻止输入法弹出来, 网上一个方法是:在input框的获取焦点事件里,主动触发失去 ...

  8. winform嵌入word解决方案一

    最近一直想用VC#2005做个内嵌WORD/OFFICE的WINFORM程序,目前主要有以下解决途径: 1.直接通过API把WORD/OFFICE的窗口句柄给放到WINFORM中(感觉较为复杂): 2 ...

  9. VS Code编辑器对git项目的支持

    使用git随便clone一个项目下来, 然后用vscode打开项目, 随便打开某个文件, 添加几行代码: 9-11行是我新添加的, 左边绿色的竖条(点击就会看到明细)就表示这几行是新添加的. 然后修改 ...

  10. MySQL 5.5 服务器变量详解(二)

    innodb_adaptive_flushing={ON|OFF} 设定是否允许MySQL服务器根据工作负载动态调整刷写InnoDB buffer pool中的脏页的速率.动态调整刷写速率的目的在于避 ...