现在假设游戏中我们需要实现一个这样功能,按下鼠标左键,发射一颗子弹,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);
为子弹的预设体创建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);
} }

Bullet

引用自http://blog.csdn.net/qq_25210959/article/details/51221021

unity游戏开发_对象池的更多相关文章

  1. 【Unity游戏开发】用C#和Lua实现Unity中的事件分发机制EventDispatcher

    一.简介 最近马三换了一家大公司工作,公司制度规范了一些,因此平时的业余时间多了不少.但是人却懒了下来,最近这一个月都没怎么研究新技术,博客写得也是拖拖拉拉,周六周天就躺尸在家看帖子.看小说,要么就是 ...

  2. 喵的Unity游戏开发之路 - 多场景:场景加载

    如果丢失格式.图片或视频,请查看原文:https://mp.weixin.qq.com/s/RDVMg6l41uc2IHBsscc0cQ 很多童鞋没有系统的Unity3D游戏开发基础,也不知道从何开始 ...

  3. 【Unity游戏开发】浅谈Lua和C#中的闭包

    一.前言 目前在Unity游戏开发中,比较流行的两种语言就是Lua和C#.通常的做法是:C#做些核心的功能和接口供Lua调用,Lua主要做些UI模块和一些业务逻辑.这样既能在保持一定的游戏运行效率的同 ...

  4. Unity游戏开发常用的一些函数用法

    Unity游戏开发常用函数 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享. ...

  5. Unity 游戏开发技巧集锦之使用cookie类型的纹理模拟云层的移动

    Unity 游戏开发技巧集锦之使用cookie类型的纹理模拟云层的移动 使用cookie类型的纹理模拟云层的移动 现实生活中,当阳光直射大地,而天空中又有很多云时,云层的影子总是会投射在大地上,风吹着 ...

  6. Unity 游戏开发技巧集锦之创建透明的材质

    Unity 游戏开发技巧集锦之创建透明的材质 Unity创建透明的材质 生活中不乏透明或者半透明的事物.例如,擦的十分干净的玻璃,看起来就是透明的:一些塑料卡片,看起来就是半透明的,如图3-23所示. ...

  7. Unity 游戏开发技巧集锦之材质的应用的创建反射材质

    Unity 游戏开发技巧集锦之材质的应用的创建反射材质 Unity中材质的应用 游戏中,大多数材质的应用都离不开纹理,而纹理本身是图片.所以,在学习本章时,最好在电脑上安装一个可以编辑图片的功能强大的 ...

  8. Unity 游戏开发技巧集锦之使用忍者飞镖创建粒子效果

    Unity 游戏开发技巧集锦之使用忍者飞镖创建粒子效果 使用忍者飞镖创建粒子效果 游戏中,诸如烟.火.水滴.落叶等粒子效果,都可以使用粒子系统(particle system)来实现.例如,<明 ...

  9. Unity 游戏开发技巧集锦之制作一个望远镜与查看器摄像机

    Unity 游戏开发技巧集锦之制作一个望远镜与查看器摄像机 Unity中制作一个望远镜 本节制作的望远镜,在鼠标左键按下时,看到的视图会变大:当不再按下的时候,会慢慢缩小成原来的视图.游戏中时常出现的 ...

随机推荐

  1. PHP-- B/S结构

    B/S结构(Browser/Server,浏览器/服务器模式),是WEB兴起后的一种网络结构模式,WEB浏览器是客户端最主要的应用软件.这种模式统一了客户端,将系统功能实现的核心部分集中到服务器上,简 ...

  2. 备战金九银十,Java研发面试题(Spring、MySQL、JVM、Mybatis、Redis、Tomcat)[带答案],刷起来!

    八月在即,马上就是"金九银十",又是跳槽招聘季.咱们这行公认涨薪不如跳槽加的快.但不建议频繁跳槽,还是要学会融合团队,抓住每个机会提升技能. 苏先生在这里给大家整理了一套各大互联网 ...

  3. RocketMQ中Producer的启动源码分析

    RocketMQ中通过DefaultMQProducer创建Producer DefaultMQProducer定义如下: public class DefaultMQProducer extends ...

  4. Linux-Windows 端口转发

    在实际的生产环境中,我们为了安全性,会将一些重要的服务(数据库服务)不开放外网访问,但是当我们某个时刻由于一些特殊需求,需要进行外网访问的时候,我们可以通过端口转发来实现.通过一台和与服务可以互相访问 ...

  5. oracle的JDBC连接

    package com.xian.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Pr ...

  6. maven打jar包包括依赖包

    <build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId& ...

  7. HiveQL DDL 常用QL示例资料

    hive-version2.1.1 DDL操作 Create/Drop/Alter/Use Database 创建数据库 //官方指导 CREATE (DATABASE|SCHEMA) [IF NOT ...

  8. 比特平面分层(一些基本的灰度变换函数)基本原理及Python实现

    1. 基本原理 在灰度图中,像素值的范围为[0, 255],即共有256级灰度.在计算机中,我们使用8比特数来表示每一个像素值.因此可以提取出不同比特层面的灰度图.比特层面分层可用于图片压缩:只储存较 ...

  9. 前端插件之Datatables使用--上篇

    工欲善其事,必先利其器 本系列文章介绍我在运维系统开发过程中用到的那些顺手的前端插件,前边两篇分别介绍了Duallistbox插件和Select2插件的使用,这一篇开始Databases的征服之旅 D ...

  10. SpringBoot 2 HTTP转HTTPS

    @Bean public TomcatServletWebServerFactory servletContainer() { TomcatServletWebServerFactory tomcat ...