热门标签 | 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的自适应缩放可以查看另一篇文章 

 



推荐阅读
  • 在维护公司项目时,发现按下手机的某个物理按键后会激活相应的服务,并在屏幕上模拟点击特定坐标点。本文详细介绍了如何使用ADB Shell Input命令来模拟各种输入事件,包括滑动、按键和点击等。 ... [详细]
  • 本文详细介绍了 React 中的两个重要 Hook 函数:useState 和 useEffect。通过具体示例,解释了如何使用它们来管理组件状态和处理副作用。 ... [详细]
  • 分享一个简化版的Silverlight链接图项目:Link Map Simplified
    本文介绍了一个使用Silverlight开发的可视化工具,主要用于展示和操作复杂的实体关系图(Graph)。该工具在犯罪调查系统中得到了广泛应用,帮助用户直观地获取和理解相关信息。 ... [详细]
  • 本文介绍了Android开发中Intent的基本概念及其在不同Activity之间的数据传递方式,详细展示了如何通过Intent实现Activity间的跳转和数据传输。 ... [详细]
  • 本文介绍了一种根据用户选择动态切换屏幕界面的方法,通过定义不同的选择块(Selection Block),实现灵活的用户交互体验。 ... [详细]
  • 在尝试用另一台电脑的MySQL文件替换本地D:\xampp\mysql目录后,MySQL服务无法启动。错误提示显示MySQL意外关闭,可能是由于端口冲突、依赖缺失、权限问题或崩溃等原因引起。 ... [详细]
  • 本文详细介绍了Ionic框架的使用方法及其与Angular的集成。Ionic框架是一个强大的前端开发工具,适用于构建跨平台的移动应用程序。文章将探讨如何引入必要的CSS和JavaScript文件,并解释bundle.js中包含的核心功能,如路由等。 ... [详细]
  • 本文介绍如何使用 Android 的 Canvas 和 View 组件创建一个简单的绘图板应用程序,支持触摸绘画和保存图片功能。 ... [详细]
  • 在本教程中,我们将深入探讨如何使用 Python 构建游戏的主程序模块。通过逐步实现各个关键组件,最终完成一个功能完善的游戏界面。 ... [详细]
  • 国际高保真音乐流媒体平台的崛起:亚马逊与谷歌的竞争策略
    近期,亚马逊和谷歌正积极筹备推出高保真音乐流媒体服务,预计在2019年底前上线。根据市场研究机构CIRP的数据,截至2018年12月,美国智能音箱的安装量已增至6600万台,较第三季度增长显著。这一趋势对Spotify等传统流媒体平台构成了新的挑战。 ... [详细]
  • 深入理解Vue.js:从入门到精通
    本文详细介绍了Vue.js的基础知识、安装方法、核心概念及实战案例,帮助开发者全面掌握这一流行的前端框架。 ... [详细]
  • Redux入门指南
    本文介绍Redux的基本概念和工作原理,帮助初学者理解如何使用Redux管理应用程序的状态。Redux是一个用于JavaScript应用的状态管理库,特别适用于React项目。 ... [详细]
  • js中恢复原始值的代码怎么写(js中恢复原始值的代码怎么写) ... [详细]
  • 在 Android 开发中,通过 Intent 启动 Activity 或 Service 时,可以使用 putExtra 方法传递数据。接收方可以通过 getIntent().getExtras() 获取这些数据。本文将介绍如何使用 RoboGuice 框架简化这一过程,特别是 @InjectExtra 注解的使用。 ... [详细]
  • 使用Powershell Studio快速构建GUI应用程序
    本文介绍了如何利用Powershell Studio创建功能强大的可视化界面。相较于传统的开发工具,Powershell Studio提供了更为简便和高效的开发体验,尤其适合需要快速构建图形用户界面(GUI)的场景。 ... [详细]
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社区 版权所有