热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

【Unity3d】手机游戏关卡制作

很多手机游戏的关卡都是采用激活和未激活的状态当某一关通过以后则再次进入关卡选择界面时相应的图标显示激活状态否则为未激活状态如愤怒的小鸟这里使用unity3d内置GUI系统

很多手机游戏的关卡都是采用激活和未激活的状态

当某一关通过以后 则再次进入关卡选择界面时 相应的图标显示激活状态 否则为未激活状态

如愤怒的小鸟

 

这里使用unity3d内置GUI系统

绘制按钮之前我们需要知道哪些关卡是已经通过了的

在unity3d中可以使用PlayerPrefs来保存关卡信息 详见PlayerPrefs

我们使用一个boolean数组来标识关卡的激活状态

var m_bActive : boolean[];

在初始化过程中读取PlayerPrefs保存的关卡信息 

如果已经通过则为true  否则为false  关卡通过条件取决于具体的游戏规则  例如每关所用时间小于3分钟为通过等等

m_bActive = new boolean[m_iLevelTotals];

for (idx = 1; idx (关卡通过条件) ? m_bActive[idx] = true : m_bActive = false;
m_bActive[0] = true;

这里将第一关默认为激活状态  不然所有关卡全锁定  则现场直憋了

通过初始化  已经知道了关卡的通过信息

绘制关卡图标之前 我们知道unity3d的GUI有GUISkin和GUIStyle

GUISkin可以指定多个GUI的风格

而GUIStyle只是针对一个GUI风格

因此我们要为关卡的按钮定义一个GUIStyle 

 

var m_GuiStageBtn    : GUIStyle;

并有一个激活状态的图片和未激活状态的图片

 

var m_texLocked : Texture2D;
var m_texActive : Texture2D;

下面开始绘制关卡图标  这里假设当前页有16关  则要绘制16个图标  4行4列

 

// col_1
for ( i = 0; i <13; i += 4)
{
if (!m_bEasyActive[i])
m_GuiStageBtn.normal.background = m_texLocked;
else
m_GuiStageBtn.normal.background = m_texActive;

if (GUI.Button(Rect(81, 29 * i + 220 , 57, 52), "", m_GuiStageBtn))
{
if (!m_bEasyActive[i])
return;
if (m_bEffectActive)
audio.PlayOneShot(g_ButtonDownClip);

g_iCurrentLevel = i + 1;
LoadSelectLevel(g_iCurrentLevel);
}
}
// col_2
for ( i = 1; i <14; i += 4)
{
if (!m_bEasyActive[i])
m_GuiStageBtn.normal.background = m_texLocked;
else
m_GuiStageBtn.normal.background = m_texActive;

if (GUI.Button(Rect(165, 29 * (i - 1) + 220, 57, 52), "", m_GuiStageBtn))
{
if (!m_bEasyActive[i])
return;
if (m_bEffectActive)
audio.PlayOneShot(g_ButtonDownClip);

g_iCurrentLevel = i + 1;
LoadSelectLevel(g_iCurrentLevel);
}
}
// col_3
for (i = 2; i <15; i += 4)
{
if (!m_bEasyActive[i])
m_GuiStageBtn.normal.background = m_texLocked;
else
m_GuiStageBtn.normal.background = m_texActive;

if (GUI.Button(Rect(250, 29 * (i - 2)+ 220, 57, 52), "", m_GuiStageBtn))
{
if (!m_bEasyActive[i])
return;
if (m_bEffectActive)
audio.PlayOneShot(g_ButtonDownClip);

g_iCurrentLevel = i + 1;
LoadSelectLevel(g_iCurrentLevel);
}
}
// col_4
for ( i = 3; i <16; i += 4)
{
if (!m_bEasyActive[i])
m_GuiStageBtn.normal.background = m_texLocked;
else
m_GuiStageBtn.normal.background = m_texActive;

if (GUI.Button(Rect(345, 29 * (i - 3) + 220, 57, 52 ), "", m_GuiStageBtn))
{
if (!m_bEasyActive[i])
return;
if (m_bEffectActive)
audio.PlayOneShot(g_ButtonDownClip);

g_iCurrentLevel = i + 1;
LoadSelectLevel(g_iCurrentLevel);
}
}

当然  可以在绘制之前  也就是 if (GUI.Button(...)) 之前  直接根据当前关卡的激活状态来处理按钮的激活状态  加上GUI.enabled = m_bActive[i];

很简单  但是在循环绘制时候要细心  设想这只是绘制16个图标  若是绘制很多  再加上Easy模式  Hard模式  Expert模式等等  则很容易出错 

但是原理基本上不变  

使用Unity3d的内置GUI  则绘制GUI时的位置是很头疼的  而且GUI的绘制函数OnGUI是消耗比较大的  再加上drawcall带来的渲染效率

在手机游戏的应用中都是不容忽视的问题  另外Unity3d中GUI的自适应缩放可以查看另一篇文章 

 



推荐阅读
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • C# WPF自定义按钮的方法
    本文介绍了在C# WPF中实现自定义按钮的方法,包括使用图片作为按钮背景、自定义鼠标进入效果、自定义按压效果和自定义禁用效果。通过创建CustomButton.cs类和ButtonStyles.xaml资源文件,设计按钮的Style并添加所需的依赖属性,可以实现自定义按钮的效果。示例代码在ButtonStyles.xaml中给出。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • 在JavaScript中,函数没有重载的概念,如果声明了多个重名的函数,不管函数的形参个数是否一样,只有最后一个有效。如果调用函数时传入的参数个数与函数定义时的参数个数不符,会出现不同的情况。函数调用时,传入的参数个数少于函数定义时的参数个数,未传入的参数会被当做undefined处理,可能会导致错误。而传入的参数个数多于函数定义时的参数个数,多余的参数不会被使用,但不会报错。 ... [详细]
  • JavaScript和HTML之间的交互是经由过程事宜完成的。事宜:文档或浏览器窗口中发作的一些特定的交互霎时。能够运用侦听器(或处置惩罚递次来预订事宜),以便事宜发作时实行相应的 ... [详细]
  • JS实现一键分享功能
    本文介绍了如何使用JS实现一键分享功能,并提供了2019独角兽企业招聘Python工程师的标准。同时,给出了分享到QQ空间、新浪微博和人人网的链接。 ... [详细]
  • 本文介绍了pack布局管理器在Perl/Tk中的使用方法及注意事项。通过调用pack()方法,可以控制部件在显示窗口中的位置和大小。同时,本文还提到了在使用pack布局管理器时,应注意将部件分组以便在水平和垂直方向上进行堆放。此外,还介绍了使用Frame部件或Toplevel部件来组织部件在窗口内的方法。最后,本文强调了在使用pack布局管理器时,应避免在中间切换到grid布局管理器,以免造成混乱。 ... [详细]
  • Gitlab接入公司内部单点登录的安装和配置教程
    本文介绍了如何将公司内部的Gitlab系统接入单点登录服务,并提供了安装和配置的详细教程。通过使用oauth2协议,将原有的各子系统的独立登录统一迁移至单点登录。文章包括Gitlab的安装环境、版本号、编辑配置文件的步骤,并解决了在迁移过程中可能遇到的问题。 ... [详细]
  • jQuery实现简单的动画效果及用法详解
    本文详细介绍了使用jQuery实现简单动画效果的方法,包括显示/隐藏、向上收缩/向下展开、淡入/淡出、自定义动画等。同时提供了具体的用法示例,并解释了参数的含义和使用技巧。通过本文的学习,读者可以掌握如何使用jQuery实现各种动画效果,为网页增添生动和互动性。 ... [详细]
  • 最近在使用C#进行录屏,通过调用ffmpeg的cmd命令进行录制。设置的录制时长是30秒,但实际只录制了11秒就停止了。关闭程序后,又开始录制并成功录制了30秒。请问大神,这是什么原因?附上了简单的调用程序。 ... [详细]
  • C#多线程解决界面卡死问题的完美解决方案
    当界面需要在程序运行中不断更新数据时,使用多线程可以解决界面卡死的问题。一个主线程创建界面,使用一个子线程执行程序并更新主界面,可以避免卡死现象。本文分享了一个例子,供大家参考。 ... [详细]
  • Android源码中的Builder模式及其作用
    本文主要解释了什么是Builder模式以及其作用,并结合Android源码来分析Builder模式的实现。Builder模式是将产品的设计、表示和构建进行分离,通过引入建造者角色,简化了构建复杂产品的流程,并且使得产品的构建可以灵活适应变化。使用Builder模式可以解决开发者需要关注产品表示和构建步骤的问题,并且当构建流程发生变化时,无需修改代码即可适配新的构建流程。 ... [详细]
  • Java图形化计算器设计与实现
    本文介绍了使用Java编程语言设计和实现图形化计算器的方法。通过使用swing包和awt包中的组件,作者创建了一个具有按钮监听器和自定义界面尺寸和布局的计算器。文章还分享了在图形化界面设计中的一些心得体会。 ... [详细]
  • 我用Tkinter制作了一个图形用户界面,有两个主按钮:“开始”和“停止”。请您就如何使用“停止”按钮终止“开始”按钮为以下代码调用的已运行功能提供建议 ... [详细]
  • Visual C# TabControl中TabPage分离成若干个Form的小办法
    写Visual的同学们都会用到这个TabControl的控件,然后会分好几页的TabPage,每页都有很多控件和业务逻辑,但是每页的关系也 ... [详细]
author-avatar
mobiledu2502854827
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有