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

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. Prometheus 函数

    函数列表 一些函数有默认的参数,例如:year(v=vector(time()) instant-vector).v是参数值,instant-vector是参数类型.vector(time())是默认 ...

  2. angularjs 异步请求无法更新数据

    angularjs 有个问题就是第二次ajax请求数据再次赋值给 $scope.data,需要更新视图数据的时候,却不能更改视图数据,这个是因为angularjs的$watch不能监听到JS对$sco ...

  3. English class 82 The Importance of traveling

    1,since I could basically walk : pretty much 2,Malaysian girl 3,profound love: deep very inportant 4 ...

  4. Python中生成器和迭代器的区别(代码在Python3.5下测试):

    https://blog.csdn.net/u014745194/article/details/70176117 Python中生成器和迭代器的区别(代码在Python3.5下测试):Num01–& ...

  5. C++生成静态库

    //StaticMath.h #include <iostream> class StaticMath { public: //StaticMath(void); //~StaticMat ...

  6. Linux中常用命令

    .cd命令 cd    回到跟目录 cd uqihong     进入到uqihong这个文件夹(且cd命令只能一级一级的进入) 2.复制命令      cp -r /usr/local/tomcat ...

  7. 【pyqtgraph绘图】安装pyqtgraph

    解读官方API-安装 安装 参考:http://www.pyqtgraph.org/documentation/installation.html 根据您的需要,有许多不同的方式来安装pyqtgrap ...

  8. 只读事务@Transactional(readOnly = true)

        定义 从设置的时间点(时间点beta)开始到事务结束的过程中,该事务将看不见其他事务所提交的数据,即查询中不会出现别人在beta之后提交的数据.     应用场合 对于一个函数,如果执行的只是 ...

  9. .NET Core 使用 Kestrel

    Kestrel介绍 Kestrel是一个基于libuv的跨平台web服务器 在.net core项目中就可以不一定要发布在iis下面了 Kestrel体验 可以使用useUrls来设置一个请求的地址 ...

  10. 20180925 SQL Server游标使用

    之前写了一个存储过程 目标: 根据时间,获取指定范围的数据集A, 再从数据集A 中,取出每行数据中的两个时间,卡另外一个B表里面的某列时间范围的值集.得到均值进行配置值比对. 这里有个问题,就是取得B ...