unity游戏开发_对象池
现在假设游戏中我们需要实现一个这样功能,按下鼠标左键,发射一颗子弹,3秒之后消失。在这个功能中,我们发射了上百上千发子弹,就需要实例化生成上百上千次。这时候,我们就需要使用对象池这个概念,每次实例化生成一个子弹对象后,三秒钟后不销毁(不执行destroy),而是将其将其隐藏(SetActive(false))并且放入对象池中。再次按下鼠标时,如果对象池不为空,就去对象池里将隐藏的对象显示出来。如果对象池里面没有可用对象时,再执行实例化子弹的方法。
首先创建一个对象池脚本,此脚本是一个单例脚本(不需要挂在任何游戏对象上面)。
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class GameObjectPool : MonoBehaviour {
//集合里面的元素,相当于对象池里面的对象,这里的集合可看作为对象池。
List<GameObject> pools = new List<GameObject> ();
//首先创建一个单例
private GameObjectPool(){}
private static GameObjectPool instance;
public static GameObjectPool GetInstance(){
if(instance == null){
//动态的生成一个名为“GameObjectPool”的对象并将单例脚本附加上去
instance = new GameObject("GameObjectPool").AddComponent<GameObjectPool>();
}
return instance;
}
//从对象池中取对象
public GameObject MyInstantiate(GameObject name){
//如果对象池中没有可以对象
if(pools.Count == ){
//就实例化一个新的对象
return Instantiate(name,Vector3.zero,Quaternion.identity) as GameObject;
}else{
//取出对象池里面的第一个元素
GameObject obj = pools[];
//将对象设置为激活状态
obj.SetActive(true);
//将被取出的元素,从对象池中移除
pools.Remove(obj);
return obj; } }
//向对象池里面存对象
public void MyDisable(GameObject name){
//将传进来的对象隐藏(处于非激活状态)
name.SetActive(false);
//添加到对象池中(添加到集合中)
pools.Add(name);
}
}
GameObjectPool
2.创建一个名为Game Manager的脚本,来控制子弹的生成
创建子弹的预设体
using UnityEngine;
using System.Collections; public class gameManager : MonoBehaviour {
//创建子弹的预设体
public GameObject mBulletPrefab; void Update () {
//如果按下鼠标左键
if(Input.GetMouseButtonDown()){
//调用单例脚本里面的从对象池中取对象的方法
GameObjectPool.GetInstance().MyInstantiate(mBulletPrefab);
} }
}
gameManager
using UnityEngine;
using System.Collections; public class gameManager : MonoBehaviour {
//创建子弹的预设体
public GameObject mBulletPrefab; void Update () {
//如果按下鼠标左键
if(Input.GetMouseButtonDown()){
//调用单例脚本里面的从对象池中取对象的方法
GameObjectPool.GetInstance().MyInstantiate(mBulletPrefab);
} }
} .为子弹的预设体创建Bullet脚本 using UnityEngine;
using System.Collections;
public class Bullet : MonoBehaviour {
void OnEnable () {
//脚本可用的时候,重置子弹的位置。
//如果不加这句代码,从对象池中取出的子弹就会从上一次消失的位置开始运动。而不是你设定的子弹生成位置
transform.position = Vector3.zero;
//开启协程方法
StartCoroutine(DelayDisable(3f));
} void Update () {
//子弹生成,自动向前运动
transform.Translate(Vector3.forward*Time.deltaTime*);
}
void OnDisable(){
Debug.Log("I'm over");
}
//子弹消失的方法
IEnumerator DelayDisable(float time){
//等待三秒
yield return new WaitForSeconds(time);
//调用单例中向对象池里面存对象的方法
GameObjectPool.GetInstance().MyDisable(gameObject);
using UnityEngine;
using System.Collections;
public class Bullet : MonoBehaviour
{
void OnEnable ()
{
//脚本可用的时候,重置子弹的位置。
//如果不加这句代码,从对象池中取出的子弹就会从上一次消失的位置开始运动。而不是你设定的子弹生成位置
transform.position = Vector3.zero;
//开启协程方法
StartCoroutine(DelayDisable(3f));
} void Update ()
{
//子弹生成,自动向前运动
transform.Translate(Vector3.forward*Time.deltaTime*);
}
void OnDisable()
{
Debug.Log("I'm over");
}
//子弹消失的方法
IEnumerator DelayDisable(float time)
{
//等待三秒
yield return new WaitForSeconds(time);
//调用单例中向对象池里面存对象的方法
GameObjectPool.GetInstance().MyDisable(gameObject);
} }
Bullet
引用自http://blog.csdn.net/qq_25210959/article/details/51221021
unity游戏开发_对象池的更多相关文章
- 【Unity游戏开发】用C#和Lua实现Unity中的事件分发机制EventDispatcher
一.简介 最近马三换了一家大公司工作,公司制度规范了一些,因此平时的业余时间多了不少.但是人却懒了下来,最近这一个月都没怎么研究新技术,博客写得也是拖拖拉拉,周六周天就躺尸在家看帖子.看小说,要么就是 ...
- 喵的Unity游戏开发之路 - 多场景:场景加载
如果丢失格式.图片或视频,请查看原文:https://mp.weixin.qq.com/s/RDVMg6l41uc2IHBsscc0cQ 很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始 ...
- 【Unity游戏开发】浅谈Lua和C#中的闭包
一.前言 目前在Unity游戏开发中,比较流行的两种语言就是Lua和C#.通常的做法是:C#做些核心的功能和接口供Lua调用,Lua主要做些UI模块和一些业务逻辑.这样既能在保持一定的游戏运行效率的同 ...
- Unity游戏开发常用的一些函数用法
Unity游戏开发常用函数 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享. ...
- Unity 游戏开发技巧集锦之使用cookie类型的纹理模拟云层的移动
Unity 游戏开发技巧集锦之使用cookie类型的纹理模拟云层的移动 使用cookie类型的纹理模拟云层的移动 现实生活中,当阳光直射大地,而天空中又有很多云时,云层的影子总是会投射在大地上,风吹着 ...
- Unity 游戏开发技巧集锦之创建透明的材质
Unity 游戏开发技巧集锦之创建透明的材质 Unity创建透明的材质 生活中不乏透明或者半透明的事物.例如,擦的十分干净的玻璃,看起来就是透明的:一些塑料卡片,看起来就是半透明的,如图3-23所示. ...
- Unity 游戏开发技巧集锦之材质的应用的创建反射材质
Unity 游戏开发技巧集锦之材质的应用的创建反射材质 Unity中材质的应用 游戏中,大多数材质的应用都离不开纹理,而纹理本身是图片.所以,在学习本章时,最好在电脑上安装一个可以编辑图片的功能强大的 ...
- Unity 游戏开发技巧集锦之使用忍者飞镖创建粒子效果
Unity 游戏开发技巧集锦之使用忍者飞镖创建粒子效果 使用忍者飞镖创建粒子效果 游戏中,诸如烟.火.水滴.落叶等粒子效果,都可以使用粒子系统(particle system)来实现.例如,<明 ...
- Unity 游戏开发技巧集锦之制作一个望远镜与查看器摄像机
Unity 游戏开发技巧集锦之制作一个望远镜与查看器摄像机 Unity中制作一个望远镜 本节制作的望远镜,在鼠标左键按下时,看到的视图会变大:当不再按下的时候,会慢慢缩小成原来的视图.游戏中时常出现的 ...
随机推荐
- HashTable源码解读
一:总述 底层实现原理是用数组+链表,与HashMap一样,但HashTable是线程安全的,HashMap是非线程安全的 下面是其结构图(与hashMap类似) 二:属性说明 /** * The h ...
- 用python输出菱形
num = eval(input('请输入最多*所在行数:')) a = num b = num #上三角 for i in range(1,num+1): print((a-1) *' ', (2* ...
- jProfiler远程连接Linux监控jvm、tomcat运行状态
第一步.下载软件 官网地址:https://www.ej-technologies.com/download/jprofiler/files , Mac客户端 GUI界面 Linux服务端 第二步.安 ...
- Java性能调优之让程序“飞”起来-Java 代码优化
代码优化的目标是: 1.减小代码的体积 2.提高代码运行的效率 代码优化细节 1.尽量指定类.方法的final修饰符 带有final修饰符的类是不可派生的.在Java核心API中,有许多应用final ...
- 【iOS】Signing for "project_name" requires a development team. Select a development team in the project editor
Xcode 8.3.2 运行 GitHub 上下载的代码时报了这个错. 解决方法: 单击工程名 --> Signing --> Team --> 选择对应的Account(如果没有A ...
- 【iOS】Your account already has a valid ios
打包内测的时候遇到了这个问题,如图所示: 官网解决办法: If the certificate already exists in Member Center, a “Your account alr ...
- 深入理解JVM-java字节码文件结构剖析(练习解读字节码)
public class MyTest2 { String str = "Welcome"; private int x = 5; public static Integer in ...
- 夯实Java基础(一)——数组
1.Java数组介绍 数组(Array):是多个相同类型元素按一定顺序排列的集合. 数组是编程中最常见的一种数据结构,可用于存储多个数据,每个数组元素存放一个数据,通常我们可以通过数组元素的索引来访问 ...
- 【Java例题】2.4求函数
4.输入x,编程试求函数 y=sin(x^2)/(1-cosx)的值. 这里的"^"表示乘方. package study; import java.util.Scanner; p ...
- Scala集合(四)
1. 集合 集合主要有三种: Sequence Map Set sequence是一种线性元素的集合,可能会是索引或者线性的(链表).map是包含键值对的集合,就像Java的Map,set是包含无重复 ...