对象池----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列表(也就是装对象的池子)的形式存存储某个实例数受限的类的实例,每一个实例还要加 ...
随机推荐
- Selenium-WebDriver框架常用基本操作
1.基础元素定位的八种方法 WebDriver driver = new ChromeDriver(); WebElement element = new WebElement(); 1.1 By.i ...
- 快速搭建Docker Registry私有仓库
前提条件: 服务器已经安装Docker(我的服务器是CentOS 7) 服务器已经安装Docker Compose 满足以上条件时就可以开始搭建了: 1. 生成用户密码文件:(运行下面命令后会在当前目 ...
- identifier of an instance of **** was altered from **** to *****
在用hibernate getSession().save(entity)方法保存数据库表实体类的时候报这个异常 我的需求是一个请求要往数据库表插两条数据,根据传值判断做了for循环调两次save() ...
- C#基于websocket-sharp实现简易httpserver(封装)
一.背景 其实就是很简单的,公司会桌面开发的人员紧缺啊,项目又赶,而我们公司的前端人员人多还厉害(ps:吐槽下,后端的人真的少啊,会桌面开发的更少啊),所以萌生出了使用html+js来构建本地应用程序 ...
- <转>Go语言TCP Socket编程
授权转载: Tony Bai 原文连接: https://tonybai.com/2015/11/17/tcp-programming-in-golang/ Golang的主要 设计目标之一就是面向大 ...
- BootstrapTable,选中某几行,获取其数据并进行后台处理。以及其他的属性使用。
参考链接:bootstrap Table API 中文版 Bootstrap Table 选中某几行,获取其数据 Ajax传递数组,struts2接收数组 1.首先将复选框搞出来,<table ...
- 学习现代 JavaScript 编程的最佳教程
天天编码 , 版权所有丨本文标题:0.0 学习现代 JavaScript 编程的最佳教程 转载请保留页面地址:http://www.tiantianbianma.com/the-modern-java ...
- Docker 学习4 Docker容器虚拟化网络概述
一.docker 虚拟化网络概述 1.OVS: OpenVSwitch,不仅能模拟二层网络,还能模拟三层网络,或者VLAN,VXLAN,流控 SDN软件定义网络技术等. 2.overlay netwo ...
- Docker使用问题记录贴
请参考: https://blog.csdn.net/u013948858/article/details/78429954 问题:安装Docker之后,执行docker run hello-worl ...
- 输出第n个丑数
方法一:暴力法 代码如下: 判断是否是丑数 public static boolean isUgly(int n){ while(n!=1){ if(n%2 == 0){ n /= 2; }else ...