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

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. python字典查询功能

    def fetch(data): print(' 查询功能') print('用户数据是',data) def add(): pass def change(): pass def delete(): ...

  2. 从 Firefox 35 版本开始,就无法兼容 PAC 式代理

    经过反复的测试,包括在“高级”选项里启用 PAC 代理的设置,也都无法使用 PAC 的代理——无法登陆 Twitter 账号,无法打开 Google 网页. 不知道各位有什么好办法吗? 以及中文火狐社 ...

  3. grafana----alert

    Alert只有grafana V4.0以上. Introduction(介绍) Grafana中的alert允许在dashboard panels你附加一些规则.当你保存仪表板Grafana将提取的报 ...

  4. 远程登录oracle 12.2数据库报错ORA-28040解决办法

    今天新安装的oracle 12.2.0.1数据库,通过本地sqlplus远程登录12c数据库报错ora-28040,如下: ORA-28040: No matching authentication ...

  5. hung_task_timeout_secs和blocked for more than 120 seconds的解决方法

    Linux系统出现hung_task_timeout_secs和blocked for more than 120 seconds的解决方法 Linux系统出现系统没有响应. 在/var/log/me ...

  6. Etcd+Confd实现Nginx配置文件自动管理

    一.需求 我们使用Nginx做七层负载均衡,后端是Tomcat.项目采用灰度发布方式,每次项目升级,都要手动先从Nginx下摘掉一组,然后再升级这组,当项目快速迭代时,手动做这些操作显然会增加部署时间 ...

  7. 美团点评基于 Flink 的实时数仓建设实践

    https://mp.weixin.qq.com/s?__biz=MjM5NjQ5MTI5OA==&mid=2651749037&idx=1&sn=4a448647b3dae5 ...

  8. [daily][mirror][daemonlogger][tc] 我想把一个网卡(port A)的流量,镜像到虚拟机的一个网卡(port VA)上去

    iptables tee 模块 https://blog.gnuers.org/?p=740 http://blog.csdn.net/wesleyflagon/article/details/385 ...

  9. [adminitrative][archlinux][setfont] 设置console的字体大小

    电脑的分辨率高了之后,用命令行进入的时候,完全看不清楚,是否容易导致眼瞎. 第一步便把字体调大就成了很必要的操作. 使用一个命令能马上生效: setfont 使用配置文件 /etc/vconsole. ...

  10. [httpd] httpd directory list character encoding

    在httpd下放置文件用来直接从浏览器访问的时候,中文文件名有可能产生乱码. 做以下设置,调整字符编码: 1: Add this to your .htaccess: IndexOptions +Ch ...