「Unity2D」使用Unity创建一个2D游戏系列-9
菜单选项 - 载入和重启游戏
本文由泰然教程组成员 betterdenger 翻译,原文请参阅「Menus - loading and restarting the game」
我们已经完成了我们游戏的第一个关卡,它具有基本的游戏性,一些声音,图像和粒子。
然后,当玩家死亡的时候,游戏会继续运行,不会重新开始。而且开始游戏得很突兀,直接就进入了游戏。很显然我们需要一些菜单按钮来控制游戏。
Damien: 我们直说: 菜单和GUI对游戏来说一点趣都没有。但是通常你还是得使用一套基础的GUI框架(或者直接不用)。这耽搁不少时间,效果仅仅是让玩家尽可能快的跳转。
Matthieu: 不像其他开发者,我不同意前面的观点。创造一个好的游戏GUI不是一个简单的任务,但是它却能带来回报,也会更有趣。当然,创建好的菜单要求好的工具和感性的设计(就像app的交互界面一样)。
但是一个好的菜单界面应该注意隐藏,甚至不应该在游戏中察觉它的存在。
不幸的是,除非你投入大量的时间或者使用第三方库,Unity没有一个真正强大的库来让你创建一个美妙的菜单。
我们本教程木有这个雄心壮志来创建一个复杂的GUI。本案例只使用内置工具套件,但是你会发现它们简直太有...局限性了。
我们先从基本的开始吧。
资源文件
背景
(右键保存图片)
Logo
(右键保存图片)
导入这些文件到工程里去。你可以在"Textures"目录的创建一个子目录"Menu",再把他们放进去。否则"background"这个文件名会覆盖之前那个文件。
至于按钮的话,我们就忍忍用Unity(丑爆了的)自带标准按钮吧。
标题画面
几乎所有的游戏都有一个标题画面。玩家将在这个界面登陆和开始游戏。
Damien: 有些标题画面是非常棒让人印象深刻的, 比如《洛克人》、《合金弹头》...等等(我超喜欢游戏标题画面)。
我们要弄的就没那么棒了,但是...简洁!
场景
首先创建一个新的scene:
- "File" -> "New scene"。
- 命名为"Menu"保存到"Scenes"文件夹。
提示: 你也可以直接按
cmd+N
(OS X)或者ctrl+N
(Windows) 快捷键来新建scene。
我们的标题画面由以下元素构成:
- 背景
- logo
- 显示按钮的脚本
对于背景:
- 创建一个新的Sprite
- 放到
(0, 0, 1)
- 设置尺寸大小为
(2, 2, 1)
对于logo:
- 创建一个新的Sprite
- 放到
(0, 2, 0)
- 设置尺寸大小为
(0.75, 0.75, 1)
这样的话,画面就变成这样了:
当然你可以加上你的名字,一些介绍,小玩笑或者动画。菜单是一块儿无主之地,你可以随便开垦。但是一定要记住,一个玩家只是想要尽快开始游戏。
载入脚本
现在我们通过脚本添加一个按钮来开始游戏。
在"Script"文件夹下面创建一个新的脚本"MenuScript",把它和一个新的空游戏对象相关联(叫... "Scripts"? 我随便说说。):
using UnityEngine;/// <summary>/// Title screen script/// </summary>public class MenuScript : MonoBehaviour{void OnGUI(){const int buttonWidth = 84;const int buttonHeight = 60;// Determine the button's place on screen// Center in X, 2/3 of the height in YRect buttonRect = new Rect(Screen.width / 2 - (buttonWidth / 2),(2 * Screen.height / 3) - (buttonHeight / 2),buttonWidth,buttonHeight);// Draw a button to start the gameif(GUI.Button(buttonRect,"Start!")){// On Click, load the first level.// "Stage1" is the name of the first scene we created.Application.LoadLevel("Stage1");}}}
关于语法:语法是对的,虽然是有一点诡异。
我们要绘制一个按钮,玩家一点它,"Stage1"就会被载入。
Note:
OnGUI
方法会在每一帧都被调用,所有代码都会被嵌入到显示一个GUI元素的代码里: 血条,菜单,界面等等。
GUI
对象允许你快速从代码里创建GUI组件。就像一个按钮拥有GUI.Button
方法。
现在允许游戏,看看我们的菜单:
点击开始...我去,崩溃了!
Level 'Stage1' (-1) couldn not be loaded because it has not been added to the build settings. To add a level to the build settings use the menu File->Build Settings...
好吧,错误提示已经告诉我们需要干些什么了。
添加scene到build
打开"File" -> "Build Settings":
现在把你想打包的所有scene都拖拽到包里。这里很简单就两个scene: "Menu" 和 "Stage1"。
重新允许,点击开始...OK!
提示: 这个
Application.LoadLevel()
方法的任务是清除当前scene,同时实例化新scene里的游戏对象。有时候,你可能需要把上一个scene的对象运用于下一个scene(比如,在两个场景过渡中音乐不中断)。Unity 提供了一个
DontDestroyOnLoad(aGameObject)
方法来处理这类事件。只需要在一个游戏对象上调用它,这个对象就不会在新场景过渡的时候被清除掉。实际上,它之后都不会被清理了。所以如果你想在之后的scene中移除它,你需要手动摧毁之。
死亡和重新开始
最后,我们要让玩家在死亡后能重新开始。如你所见,这涉及到很多(我们会在在接下来的章节里“简化”之)。
实际的过程是:
- 玩家被子弹击中。
HealthScript.OnCollisionEnter
被调用。- 玩家失去一点生命值。
- 如果玩家生命少于1点,"HealthScript"摧毁玩家对象。
我们会添加两个新的步骤:
PlayerScript.OnDestroy
被调用。- 一个"GameOverScript"被创建,然后被添加到scene里。
在"Scripts"文件夹里创建一个新的脚本"GameOverScript"。
只需这一点代码,会添加显示"Restart"按钮和"Back to Menu"按钮:
using UnityEngine;/// <summary>/// Start or quit the game/// </summary>public class GameOverScript : MonoBehaviour{void OnGUI(){const int buttonWidth = 120;const int buttonHeight = 60;if (GUI.Button(// Center in X, 1/3 of the height in Ynew Rect(Screen.width / 2 - (buttonWidth / 2),(1 * Screen.height / 3) - (buttonHeight / 2),buttonWidth,buttonHeight),"Retry!")){// Reload the levelApplication.LoadLevel("Stage1");}if (GUI.Button(// Center in X, 2/3 of the height in Ynew Rect(Screen.width / 2 - (buttonWidth / 2),(2 * Screen.height / 3) - (buttonHeight / 2),buttonWidth,buttonHeight),"Back to menu")){// Reload the levelApplication.LoadLevel("Menu");}}}
跟我们上一个脚本差不多,不过多了一个按钮而已。
在新脚本"PlayerScript"中, 我们必须在死亡的时候实例化这个新脚本:
void OnDestroy(){// Game Over.// Add the script to the parent because the current game// object is likely going to be destroyed immediately.transform.parent.gameObject.AddComponent<GameOverScript>();}
开始游戏然后去"找死":
你可以在scene里发现这个脚本:
当然,它可以做得更好,比如添加积分显示,动画显示等。
目前来说能运行就好! :)
"画面丑瞎我们的钛合金狗眼"
改改改,马上改!你先创建一个"GUI Skin":
- "Assets" -> "Create" -> "Gui Skin":
在"Inspector"里, 调整UI控制让我们画风美妙起来。不过首先要确认皮肤(skin)已经被放入"Resources"文件夹了。
注意: "Resources"文件夹在Unity里是比较特殊的存在。凡在这个文件夹下的都会被游戏打包,然后可以使用
Resources.Load()
方法载入。
继续,皮肤需要在你在脚本里设置后才会生效。
在我们之前的GUI脚本里,我们得通过使用GUI.skin = Resources.Load("GUISkin");
载入皮肤(一次就好,不需要每一帧都载入)。
这是"MenuScript"里的一个例子(注意Start()方法
):
using UnityEngine;/// <summary>/// Title screen script/// </summary>public class MenuScript : MonoBehaviour{private GUISkin skin;void Start(){// Load a skin for the buttonsskin = Resources.Load("GUISkin") as GUISkin;}void OnGUI(){const int buttonWidth = 128;const int buttonHeight = 60;// Set the skin to useGUI.skin = skin;// Draw a button to start the gameif (GUI.Button(// Center in X, 2/3 of the height in Ynew Rect(Screen.width / 2 - (buttonWidth / 2), (2 * Screen.height / 3) - (buttonHeight / 2), buttonWidth, buttonHeight),"START")){// On Click, load the first level.Application.LoadLevel("Stage1"); // "Stage1" is the scene name}}}
如你所见,仅仅是简单添加该死的按钮是多么的无趣。
注意: 如果你经济能够支持而且你需要添加一堆菜单和文本在你的游戏里。你可以考虑购买NGUI插件,真心物超所值。
下一步
我们刚学了如何给我们游戏添加必不可少的按钮。
回想一下,目前你都做了什么:
- 用三个背景层实现的视差滚动。
- 很多的粒子效果!
- 一个标题画面。
- 图像和声音。
- 一个shmup游戏,有一个玩家和多个敌人。
恭喜!但是遗憾的是,这只能在你电脑上运行。我们如果要卖这个游戏,需要分发安装包啊。
这就是我们最后一章要讨论的了——部署。
「Unity2D」使用Unity创建一个2D游戏系列-9相关推荐
- 「Unity2D」使用Unity创建一个2D游戏系列-1
「Unity2D」使用Unity创建一个2D游戏系列-1 安装unity并且创建你的第一个场景 在第一章,你将会学习到一些非常基本的内容:首先是unity的下载和安装,其次是准备创建我们游戏内的第一个 ...
- 「Unity2D」使用Unity创建一个2D游戏系列-8
现在我们通过使用粒子改进了游戏的视觉效果,接着我们会在工程里里添加一些音乐和声音.使用Unity我们可以很简单做到,但是这部分却对游戏非常重要重要. 你会学到在哪里去找游戏的声音和音乐,选取一些声音用 ...
- Unity学习笔记第二章:如何创建一个2D游戏
ps:发文章只是为了稳固自己的学习记录一下,如果有什么错误麻烦多指教 目前学习到了自己的第一个2D游戏,记录一下大概流程以及Sprite的操作 1:地形的创建设置以及Sprite的操作: 创建地形这块 ...
- ChatGPT 设计游戏剧情 | 基于 AI 5 天创建一个农场游戏,完结篇!
欢迎使用 AI 进行游戏开发! 在本系列中,我们将使用 AI 工具在 5 天内创建一个功能完备的农场游戏.到本系列结束时,您将了解到如何将多种 AI 工具整合到游戏开发流程中.本文将向您展示如何将 A ...
- 学习用C#在Unity中创建一个2D Metroidvania游戏
学习用C#在Unity中创建一个2D Metroidvania游戏 你会学到: 构建2D Unity游戏 用C#编程 玩家统计,水平提升,米尔和远程攻击 敌方人工智能系统 制定级别和级别选择 Lear ...
- 用Unity和Playmaker创建一个限时游戏 Creating a Time Limit game with Unity and Playmaker
本课程结束时,您将拥有在Unity中使用Playmaker创建游戏的工具 你会学到: playmaker状态的基础以及它们如何与动作一起工作. 安装悬停车,可以在竞技场内行驶. 不同力度的射击地雷驱动 ...
- unity创建一个6面体的3D模型,确保它每一个面都是不同的。能旋转每一个面唤醒不同的物品
文章目录 前言 unity创建一个6面体的3D模型,确保它每一个面都是不同的.能旋转每一个面唤醒不同的物品 一.物体每一面旋转停止呼出不同面板 二.使用步骤 1.控制旋转与唤醒 总结 前言 unity ...
- 基于unity创建一个简单的VR demo
创建一个VR项目 我们将使用Unity创建一个简单的VR项目demo,其效果是在VR头盔中观察一个立方体. Step 1 打开Unity,创建一个新的空项目. Step 2 在Unity的菜单中选择F ...
- 使用Unity创建塔防游戏(Part1)
How to Create a Tower Defense Game in Unity - Part1 原文作者:Barbara Reichart 文章原译:http://www.cnblogs.co ...
最新文章
- Linux学习-Xshell断开连接程序依然运行
- 节点插入--对比jQuery和JavaScript方法(一)
- python 信息加密
- Centos6.5搭建bugzilla
- java new collection_使用Java 8新增的Predicate操作Collection集合
- Autodesk招聘开发咨询顾问(北京或上海),需要内推的扔简历过来啊
- Python魔法方法(magic method)细解几个常用魔法方法(下)
- 使用C#实现Form窗体的淡入淡出效果
- python怎么部署到tomcat_使用python将war部署到tomcat
- Solaris Boot PROM 指令
- 想了解能源互联网?看这篇就够了
- 天地图矢量数据下载_关于离线地图数据的下载、更新以及删除的方法
- python表示倍数_python 求倍数
- 金蝶KIS旗舰版7.03 KIS旗舰版7.01 金蝶KIS专业版16.04 KIS专业版16.01 KIS商贸版9.04 KIS商贸版9.01 金蝶K3 15.1 云星空Cloud7.6企业版标准版
- 【硬见小百科】PCB多层板各层含义与设计原则
- XJTU 算法设计与问题求解作业题 第一周
- 富勒烯|Fullerene C60 富勒石 CAS:131159-39-2 |瑞禧
- Caché 时间函数
- 究竟怎样写代码才算是好代码
- bl wn810a linux驱动下载,bl wn810a驱动下载-BL-WN810A驱动 1.0 官方版 - 河东下载站
热门文章
- matlab学位论文绘图美化工具_推荐几个超级好用的工具,让你在论文中画出漂亮的插图...
- 英语中常见从句的简化
- 易语言取物理网卡MAC特征字
- 油烟净化器电场可以使用洗衣粉来清洗吗?
- Map阶段分析之Spill阶段
- 动态壁纸,视频特效- Android
- Netty-Socketio API
- 正则验证连续重复字符、连续递增递减数字
- java中转义字符的学习---(多看几遍就会了系列)
- 用python画股票分时图 github_GitHub - DogeWatch/stock: stock,股票系统。使用python进行开发。...