对象池----unity中应用
对象池应用在unity中能减少资源消耗,节省内存空间具体原理不再赘述.
以下是他的操作步骤:(注意:对象池中应用到了栈或对队列!)
1).先建立一个(怪物)物体 mMonster;
2).再建立一个对象池 private Stack<GameObject> monsterPool
栈:先进后出,后进先出,水杯结构 常用方法: .peek()---->获取栈顶元素
.pop()------->出栈,弹栈
.push()------>压栈,进栈
队列:先进先出,后进后出,水管结构 常用方法: .peek()------------->获取队头元素
.Dequeue()-------->移除队头
.Enqueue()--------->移除队头
3).再建立一个池子,用来存放激活过的(怪物)物体,作用是用来判断场景中有多少个激活的物体,再让最近激活(栈)(或最开始激活(队列))的对象给失活;
4).在Start/Awake函数中将两个对象池赋初值(new一下);
5).创建一个返回值为(怪物)物体的方法,里面进行判断对象池中是否存在所需物体,如果对象池为空,就实例化一个(先不将其加入对象池),否则就直接拿出对象池中所需的物体
6).创建一个方法,当该(怪物)物体失活(SetActive(Fasle)),将其加入到对象池所在物体的旗下( monster.transform.SetParent(transform);),并将其加入到对象池中,以便下次再用!
代码参上:
using System.Collections;
using System.Collections.Generic;
using UnityEngine; public class MySimpleFactory : MonoBehaviour {
public GameObject mMonster;
private Stack<GameObject> monsterPool;
private Stack<GameObject> SetActiveMonsterPool; void Start ()
{
monsterPool = new Stack<GameObject>();
SetActiveMonsterPool = new Stack<GameObject>();
}
void Update ()
{
if (Input.GetMouseButtonDown())
{
GameObject tempMonster = TakeMonster();
tempMonster.transform.position = Vector3.zero;
SetActiveMonsterPool.Push(tempMonster);
}
if (Input.GetMouseButtonDown())
{
PushThisGameObjectToMonsterPool(SetActiveMonsterPool.Pop());
}
} private GameObject TakeMonster()
{
GameObject Monster = null;
if (monsterPool.Count > )
{
Monster = monsterPool.Pop();
Monster.SetActive(true);
}
else
{
Monster = Instantiate(mMonster);
}
return Monster;
}
private void PushThisGameObjectToMonsterPool(GameObject xt)
{
xt.transform.SetParent(gameObject.transform);
xt.SetActive(false);
monsterPool.Push(xt);
}
}
对象池----unity中应用的更多相关文章
- Unity实现简单的对象池
一.简介 先说说为什么要使用对象池 在Unity游戏运行时,经常需要生成一些物体,例如子弹.敌人等.虽然Unity中有Instantiate()方法可以使用,但是在某些情况下并不高效.特别是对于那些需 ...
- Java中的对象池技术
java中的对象池技术,是为了方便快捷地创建某些对象而出现的,当需要一个对象时,就可以从池中取一个出来(如果池中没有则创建一个),则在需要重复重复创建相等变量时节省了很多时间.对象池其实也就是一个内存 ...
- Java 中的对象池实现
点赞再看,动力无限.Hello world : ) 微信搜「程序猿阿朗 」. 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录,有很多知识点和系列文章. 最近在 ...
- simple_pool对象池——优化<二>
本文章由cartzhang编写.转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/55051570 作者:car ...
- Java之对象池
单例模式是限制了一个类只能有一个实例,对象池模式则是限制一个类实例的个数.对象池类就像是一个对象管理员,它以Static列表(也就是装对象的池子)的形式存存储某个实例数受限的类的实例,每一个实例还要加 ...
- 理解ECS的概念和Unity中的ECS设计
组合优于继承 ecs的概念很早就有了,最初的主要目的应该还是为了改善设计. e-c-s三者都有其意义,e-c是组合优于继承,主要用以改善oo的继承耦合过重以及多继承菱形问题. oop常见设计里,每个g ...
- Java 基础 - 对象池
对象池 优点: 防止过多的创建对象合理利用对象, 缺点: 会有线程阻塞 Demo 测试代码 package com.cjcx.pay.obj; import java.util.Enumerati ...
- Java对象池
单例模式是限制了一个类只能有一个实例,对象池模式则是限制一个类实例的个数.对象池类就像是一个对象管理员,它以Static列表(也就是装对象的池子)的形式存存储某个实例数受限的类的实例,每一个实例还要加 ...
- Java对象池示例
单例模式是限制了一个类只能有一个实例,对象池模式则是限制一个类实例的个数.对象池类就像是一个对象管理员,它以Static列表(也就是装对象的池子)的形式存存储某个实例数受限的类的实例,每一个实例还要加 ...
随机推荐
- Spring Tools4
Spring Tools4是一个集成了STS插件的Eclipse,所以下载之后就不需要再下载eclipse. 访问 https://spring.io/tools/ 点击“Download STS4 ...
- VMware虚拟机配置内网电脑能访问
关键字:内网访问虚拟机.内网访问Linux虚拟机.虚拟机访问外部网络 1.vmware虚拟机网络设置为桥接模式 2.虚拟机配置iP地址,以linux系统为示例. 勾选自动连接,选择手动配置ip,然后配 ...
- Rest API
一.前言 在软件行业快速发展的今天,传统的软件授权已经不能足以满足一个IT类的公司的发展.虽然在大部分公司里,它还是现金池的直接源头.但是在可遇见的未来,受摩尔根理论的失效.物联网的发展等影响,应用的 ...
- FreeRTOS如何结束和重新启动调度程序
大多数主机或桌面系统(比如Linux,Mac或Windows)都有一个正常的用例,你可以在早上启动操作系统,然后在晚上关闭它,然后你就离开机器.嵌入式系统是不同的:他们没有参加,他们应该“永远”运行. ...
- layUI弹出框提示
简单介绍:项目使用layUI框架好久了,也没来的及写一篇关于layUI弹出层的随笔.现在补上.经常用到的,一般都是在ajax成功回调函数后边写. //js代码 s和fail 是ajax返回的数据lay ...
- MySQL存储过程(PROCEDURE)(一)
一.定义与目的: 定义:存储过程是数据库 SQL 语言层面的代码封装与重用(是数据库中存储复杂程序,以便外部程序调用的一种数据库对象): 目的:我们为了完成特定功能的SQL语句集,经编译创建并保存在数 ...
- 学习笔记: AOP面向切面编程和C#多种实现
AOP:面向切面编程 编程思想 OOP:一切皆对象,对象交互组成功能,功能叠加组成模块,模块叠加组成系统 类--砖头 系统--房子 类--细胞 系统--人 ...
- 当TFS/VSTS遇上Power BI
引言 众所周知,要对TFS进行深入的图表分析,往往需要依赖于SQL Server Analysis Service和SQL Server Reporting Service.虽然随着TFS对敏捷项目的 ...
- codeforces / project Euler 泛做
目录 PE 15 PE 76 PE 90 PE 577 PE 97 PE 364(坑) 待做 发现这个题库,很有意思,趁着还没有学习微积分,看不了书,赶快从头开始刷,所以都是一些简单的题目,即时简单, ...
- OpenSSL MD5 API
#include <stdlib.h> #define _GNU_SOURCE /* for getline API */ #include <stdio.h> /* Open ...