Unity3D 对象池思想 在游戏开发中的运用
分类:U3D
1.在王者荣耀中,每30秒小兵会出现一波,出现之后会被敌方玩家或敌方小兵销毁,一局游戏下来,小兵会被创建多次,同时也会被销毁,在游戏中,这种频繁的创建和销毁游戏对象是很损耗性能的。在游戏开发过程中,我们会频繁的创建对象和销毁对象,为了提高游戏性能,我们就要用到对象池思想了。
2.在射击游戏中,会频繁的销毁和创建子弹,这就可以用对象池思想了。
什么是对象池?
池,想到了水池,水池是水的集合。所以,对象池就是对象的集合,我们可以初步的按照这种想法来理解对象池。使用原理的话就是,我们在创建游戏对象时,我们就从对象池里取出来,并设置为可见(Obj.seAactive(true)),要销毁对象时又把对象放到对象池里再隐藏(Obj.setActive(false)),以备下次需要从对象池中取对象时使用。
接下来就来看实现过程。
先来说说要实现的效果,我们单机屏幕上的任意一点,然后就可以发射一个子弹(球),并利用对象池对子弹进行存储,达到优化性能的目标;

首先创建一个脚本,这个脚本不用继承自Mono,并且用单例模式实现。
using System.Collections;
using System.Collections.Generic;
using UnityEngine; public class GameObjectManage
{
private List<GameObject> gameobjectlist; // 保存对象的集合
// 不再累述单例模式
private GameObjectManage()
{
gameobjectlist=new List<GameObject>();
} private static GameObjectManage instance; public static GameObjectManage GetInstance
{
get
{
if (instance == null )
{
instance=new GameObjectManage();
}
return instance;
}
}
// 创建子弹的方法
public GameObject Instance_obj(GameObject obj)
{
GameObject result;
if (gameobjectlist.Count > ) // 假如集合不为空,就从集合中取出对象
{
result = gameobjectlist[]; // 获得集合中的第一个对象
result.SetActive(true); // 并将其显示
gameobjectlist.Remove(result); // 已获得对象,将这个对象从集合中移除
}
else // 集合为空,无法从池中取对象,得直接创建
{
result= MonoBehaviour.Instantiate(obj) ;
}
return result;
}
// 销毁子弹的方法(其实是隐藏子弹)
public void DestroryObj(GameObject obj)
{
obj.transform.position=new Vector3(,,); // 将这个子弹的位置归零
obj.SetActive(false); // 并设置不可见
gameobjectlist.Add(obj); // 加入到对象池中,为了下次创建对象时备用
} }
然后再创建一个脚本用来实现创建子弹,把这个脚本挂载再相机上
using System.Collections;
using System.Collections.Generic;
using System.Threading;
using UnityEngine; public class contro : MonoBehaviour
{
public GameObject obj;
private Ray _ray; // 射线
void Update()
{
if (Input.GetMouseButtonDown())
{
_ray = Camera.main.ScreenPointToRay(Input.mousePosition);//发射射线
GameObject gb= GameObjectManage.GetInstance.Instance_obj(obj);
obj.transform.position = transform.position;
gb.GetComponent<Rigidbody>().velocity = _ray.direction *;
} }
}
为了可以实现子弹2秒钟后将其隐藏,我们还需要创建一个脚本来挂载在子弹预制体上,对了,预制体上还需要加刚体。
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine; public class cube_contro : MonoBehaviour
{
private void OnEnable() // 不可换成Start哦
{
StartCoroutine(WaitDestrory());
} IEnumerator WaitDestrory() // 协程实现2秒钟后隐藏
{
yield return new WaitForSeconds(2f);
GameObjectManage.GetInstance.DestroryObj(gameObject);
} }
通过这几个脚本就可以通过对象池来实现子弹发射效果咯,蛮简单的,但很使用。
多多思考,举一反三,将对象池思想用于自己的游戏中吧!
Unity3D 对象池思想 在游戏开发中的运用的更多相关文章
- Unity3d修炼之路:游戏开发中,3d数学知识的练习【1】(不断更新.......)
#pragma strict public var m_pA : Vector3 = new Vector3(2.0f, 4.0f, 0.0f); public var m_pB : Vector3 ...
- c++实现游戏开发中常用的对象池(含源码)
c++实现游戏开发中常用的对象池(含源码) little_stupid_child2017-01-06上传 对象池的五要素: 1.对象集合 2.未使用对象索引集合 3.已使用对象索引集合 4.当前 ...
- 算法、数据结构、与设计模式等在游戏开发中的运用 (一):单例设计(Singleton Design)
算法.数据结构.与设计模式等在游戏开发中的运用 (一):单例设计(Singleton Design) 作者: Compasslg 李涵威 1. 什么是单例设计(Singleton Design) 在学 ...
- [Unity游戏开发]向量在游戏开发中的应用(三)
本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/51088236 在上一篇博客中讲了利用向量点乘在游戏开发中应用的几种情景.本 ...
- [Unity游戏开发]向量在游戏开发中的应用(一)
本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/50810102 向量在游戏开发中是非常实用的,我们在学校学完向量的知识后,只 ...
- OpenNI结合Unity3D Kinect进行体感游戏开发(转)
OpenNI结合Unity3D Kinect进行体感游戏开发(转) 楼主# 更多 发布于:2012-07-17 16:42 1. 下载安装Unity3D(目前版本为3.4)2. 下载OpenN ...
- Cocos2d-x游戏开发中的消息机制:CCNotificationCenter的使用
在HTML5游戏开发中,js可以使用Event对象的addEventListener(添加事件监听).dispatchEvent(触发事件)实现监听机制,如果在coocos2d-x中,去实现这种机制该 ...
- 二、Cocos2dx概念介绍(游戏开发中不同的坐标系,cocos2dx锚点)
注:ccp是cocos2dx中的一个宏定义,#define ccp(__X__,__Y__)CCPointMake((float)__X__, (float)__Y__),在此文章中表示坐标信息 1. ...
- 游戏开发中IIS常见支持MIME类型文件解析
游戏开发中IIS常见支持MIME类型文件解析 .apkapplication/vnd.android .ipaapplication/vnd.iphone .csbapplication/octet- ...
随机推荐
- common-fileupload上传文件
文件上传在web应用中非常普遍,要在jsp环境中实现文件上传功能是非常容易的,因为网上有许多用java开发的文件上传组件,本文以commons-fileupload组件为例,为jsp应用添加文件上传功 ...
- tp5对接支付宝支付简单集成
对于每个刚开始工作的新手来说,无论支付宝支付还是微信支付都是跑不掉的一个小门槛. 在加上本人比较技术比较渣(比较懒导致的),不太喜欢引用那么大的SDK,于是就简单集成了一下支付宝的支付. 但也只是只有 ...
- Mac OSX用 dd 命令,浇灌ISO镜像到USB驱动器
Mac OSX用 dd 命令,浇灌ISO镜像到USB驱动器 字数244 阅读197 评论0 喜欢0 把ISO镜像转换为一个可启动的USB设备.一种可行的方法是通过OS X的Terminal “浇灌”到 ...
- 随机生成一份试卷,试卷的种类分为单选、多选、判断三种题型。nodejs6.0 mysql
背景:从数据库中,随机生成一份试卷,试卷的种类分为单选.多选.判断三种题型. 首先我需要生成随机数id(在这之前我需要知道数据库中各个题型的题数,这样我才能设置随机数),并依据生成的随机数id,去查找 ...
- js转换金钱为中文单位元、万元、亿元、万亿
function unitConvert(num) { var moneyUnits = ["元", "万元", "亿元", "万 ...
- Git学习——创建与合并分支
分支概念 当前我们所在的分支是master(主分支),可以通过创建分支: git branch <branch_name> 创建完成后,可以查看当前的分支状态: git branch 当前 ...
- Codeforces Round #439 (Div. 2) E. The Untended Antiquity
E. The Untended Antiquity 题目链接http://codeforces.com/contest/869/problem/E 解题心得: 1.1,x1,y1,x2,y2 以(x1 ...
- BZOJ 2508: 简单题
题目大意: 加入直线,删除直线,求点到所有直线的距离的平方和. 题解: 把点到直线的距离公式写出来,然后展开.维护六个值,计算一个二元的多项式的最小值. 对x和y分别求导,导数都为零时取到极值.然后解 ...
- mac下secureCRT 客户端 $redis-cli回车后没有反应的解决办法
启动redis server后,SecureCRT进入redis-cli,输入不断在后面追加IP:Port显示设置当前的Session Options-->Terminal-->Emula ...
- Mac下Python和Pycharm之virtualenv
一.python如何配置virtualenv 1.安装virtualenv pip3 install virtualenvpip install -i https://pypi.tuna.tsin ...