unity3d对象池的使用
说对象池之前首先来看看单例类和单例脚本的区别。这里有介绍
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对象池的使用的更多相关文章
- Unity3d对象池
Singleton.cs 12345678910111213 using UnityEngine;/// <summary>/// 单例模版类/// </summary>pub ...
- Unity3D 对象池思想 在游戏开发中的运用
分类:U3D 1.在王者荣耀中,每30秒小兵会出现一波,出现之后会被敌方玩家或敌方小兵销毁,一局游戏下来,小兵会被创建多次,同时也会被销毁,在游戏中,这种频繁的创建和销毁游戏对象是很损耗性能的.在游戏 ...
- Unity3D 基于预设(Prefab)的泛型对象池实现
背景 在研究Inventory Pro插件的时候,发现老外实现的一个泛型对象池,觉得设计的小巧实用,不敢私藏,特此共享出来. 以前也看过很多博友关于对象池的总结分享,但是世界这么大,这么复杂到底什么样 ...
- 游戏开发设计模式之对象池模式(unity3d 示例实现)
前篇:游戏开发设计模式之命令模式(unity3d 示例实现) 博主才学尚浅,难免会有错误,尤其是设计模式这种极富禅意且需要大量经验的东西,如果哪里书写错误或有遗漏,还请各位前辈指正. 原理:从一个固定 ...
- [译]Unity3D内存管理——对象池(Object Pool)
原文地址:C# Memory Management for Unity Developers (part 3 of 3), 其实从原文标题可以看出,这是一系列文章中的第三篇,前两篇讲解了从C#语言本身 ...
- Unity3D 游戏开发构架篇 —— 动态大场景生成 = 区域加载+对象池管理
项目做一个类似无尽模式的场景,想了一想,其实方法很简单,做一个相关的总结. 主要先谈一谈构架,后期附上代码. 一.区域加载 其实无尽场景的实现很简单,因为屏幕限制,那么不论何时何地,我们只能看到自己的 ...
- 设计模式之美:Object Pool(对象池)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):实现 DatabaseConnectionPool 类. 实现方式(二):使用对象构造方法和预分配方式实现 ObjectPool ...
- Egret中的对象池ObjectPool
为了可以让对象复用,防止大量重复创建对象,导致资源浪费,使用对象池来管理. 对象池具体含义作用,自行百度. 一 对象池A 二 对象池B 三 字符串key和对象key的效率 一 对象池A /** * 对 ...
- 对象池与.net—从一个内存池实现说起
本来想写篇关于System.Collections.Immutable中提供的ImmutableList里一些实现细节来着,结果一时想不起来源码在哪里--为什么会变成这样呢--第一次有了想写分析的源码 ...
随机推荐
- CodeForces 1099E - Nice table - [好题]
题目链接:https://codeforces.com/problemset/problem/1099/E You are given an $n×m$ table, consisting of ch ...
- [No0000133]c# ERROR:“.”(十六进制值 0x00)是无效的字符
December 24, 2013 c# exception “.”(十六进制值 0x00)是无效的字符. 解决方法:常见于socket方式连接(包括HTTP方式)等.报文交互时候,对方会在字符串后面 ...
- [No0000CC]眼袋和黑眼圈的应对方法——疏筋穴
眼袋和黑眼圈不是自然衰老的必然产物.<黄帝内经>上说:"肝主筋."筋就是人身体上的韧带.肌腱部分.很多病症,说不清原因,但都可以遵循一个原则,那就是从筋论治. 1.常按 ...
- 【每日一题】Flooded! UVA - 815 模拟阅读格式题
https://cn.vjudge.net/problem/UVA-815 题意:给你一个矩阵,每个格子的数代表一个海拔并且每个格子的面积100平方米.给你整个区域的降水量(立方米),问降水量(米). ...
- python循环字符转换
pyhon函数传参的时候穿的是引用,而不是实际值,这样可以节省内存 变量名要求:最好是以字母下划线作为变量名,不能和py关键字重复 import getpass提供了平台无关的在命令行下输入密码的方法 ...
- elasticsearch解决控制台中文乱码问题
找到conf目录下的jvm.options文件,找到如下的配置行: 我将之前的UTF-8 改成GBK,ok.
- pandas网页操作基础
ipython notebook 命令行输入ipython notebook 此时,浏览器会自动运行并打开ipython网页 基本操作 如上图所示,新建一个项目 导入相关模块,建立一个数据集 制造数据 ...
- java 大数据运算 BigInteger BigDecimal
package cn.sasa.demo5; import java.math.BigDecimal; import java.math.BigInteger; public class BigDat ...
- UVA11491 奖品的价值
奖品的价值C804 运行时间限制:1000ms: 运行空间限制:51200KB 试题描述 你是一个电视节目的获奖嘉宾.主持人在黑板上写出一个 n 位非负整数(不以 0 开头),邀请你删除其中的 d 个 ...
- es6学习一 promise上
简单来说promise在异步操作上提供可读性.(原来es5的异步操作可读性实在太糟糕了,如下图) 瞬间眼前百万只奔腾的马,只不过这种马有个别名,羊驼. 一.创建形式 1. 使用的基本形式: let p ...