菜单选项 - 载入和重启游戏

本文由泰然教程组成员 betterdenger 翻译,原文请参阅「Menus - loading and restarting the game」

我们已经完成了我们游戏的第一个关卡,它具有基本的游戏性,一些声音,图像和粒子。

然后,当玩家死亡的时候,游戏会继续运行,不会重新开始。而且开始游戏得很突兀,直接就进入了游戏。很显然我们需要一些菜单按钮来控制游戏。

Damien: 我们直说: 菜单和GUI对游戏来说一点趣都没有。但是通常你还是得使用一套基础的GUI框架(或者直接不用)。这耽搁不少时间,效果仅仅是让玩家尽可能快的跳转。

Matthieu: 不像其他开发者,我不同意前面的观点。创造一个好的游戏GUI不是一个简单的任务,但是它却能带来回报,也会更有趣。当然,创建好的菜单要求好的工具和感性的设计(就像app的交互界面一样)。

但是一个好的菜单界面应该注意隐藏,甚至不应该在游戏中察觉它的存在。

不幸的是,除非你投入大量的时间或者使用第三方库,Unity没有一个真正强大的库来让你创建一个美妙的菜单。

我们本教程木有这个雄心壮志来创建一个复杂的GUI。本案例只使用内置工具套件,但是你会发现它们简直太有...局限性了。

我们先从基本的开始吧。

资源文件

背景

(右键保存图片)

Logo

(右键保存图片)

导入这些文件到工程里去。你可以在"Textures"目录的创建一个子目录"Menu",再把他们放进去。否则"background"这个文件名会覆盖之前那个文件。

至于按钮的话,我们就忍忍用Unity(丑爆了的)自带标准按钮吧。

标题画面

几乎所有的游戏都有一个标题画面。玩家将在这个界面登陆和开始游戏。

Damien: 有些标题画面是非常棒让人印象深刻的, 比如《洛克人》、《合金弹头》...等等(我超喜欢游戏标题画面)。

我们要弄的就没那么棒了,但是...简洁!

场景

首先创建一个新的scene:

  1. "File" -> "New scene"。
  2. 命名为"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中移除它,你需要手动摧毁之。

死亡和重新开始

最后,我们要让玩家在死亡后能重新开始。如你所见,这涉及到很多(我们会在在接下来的章节里“简化”之)。

实际的过程是:

  1. 玩家被子弹击中。
  2. HealthScript.OnCollisionEnter被调用。
  3. 玩家失去一点生命值。
  4. 如果玩家生命少于1点,"HealthScript"摧毁玩家对象。

我们会添加两个新的步骤:

  1. PlayerScript.OnDestroy被调用。
  2. 一个"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相关推荐

  1. 「Unity2D」使用Unity创建一个2D游戏系列-1

    「Unity2D」使用Unity创建一个2D游戏系列-1 安装unity并且创建你的第一个场景 在第一章,你将会学习到一些非常基本的内容:首先是unity的下载和安装,其次是准备创建我们游戏内的第一个 ...

  2. 「Unity2D」使用Unity创建一个2D游戏系列-8

    现在我们通过使用粒子改进了游戏的视觉效果,接着我们会在工程里里添加一些音乐和声音.使用Unity我们可以很简单做到,但是这部分却对游戏非常重要重要. 你会学到在哪里去找游戏的声音和音乐,选取一些声音用 ...

  3. Unity学习笔记第二章:如何创建一个2D游戏

    ps:发文章只是为了稳固自己的学习记录一下,如果有什么错误麻烦多指教 目前学习到了自己的第一个2D游戏,记录一下大概流程以及Sprite的操作 1:地形的创建设置以及Sprite的操作: 创建地形这块 ...

  4. ChatGPT 设计游戏剧情 | 基于 AI 5 天创建一个农场游戏,完结篇!

    欢迎使用 AI 进行游戏开发! 在本系列中,我们将使用 AI 工具在 5 天内创建一个功能完备的农场游戏.到本系列结束时,您将了解到如何将多种 AI 工具整合到游戏开发流程中.本文将向您展示如何将 A ...

  5. 学习用C#在Unity中创建一个2D Metroidvania游戏

    学习用C#在Unity中创建一个2D Metroidvania游戏 你会学到: 构建2D Unity游戏 用C#编程 玩家统计,水平提升,米尔和远程攻击 敌方人工智能系统 制定级别和级别选择 Lear ...

  6. 用Unity和Playmaker创建一个限时游戏 Creating a Time Limit game with Unity and Playmaker

    本课程结束时,您将拥有在Unity中使用Playmaker创建游戏的工具 你会学到: playmaker状态的基础以及它们如何与动作一起工作. 安装悬停车,可以在竞技场内行驶. 不同力度的射击地雷驱动 ...

  7. unity创建一个6面体的3D模型,确保它每一个面都是不同的。能旋转每一个面唤醒不同的物品

    文章目录 前言 unity创建一个6面体的3D模型,确保它每一个面都是不同的.能旋转每一个面唤醒不同的物品 一.物体每一面旋转停止呼出不同面板 二.使用步骤 1.控制旋转与唤醒 总结 前言 unity ...

  8. 基于unity创建一个简单的VR demo

    创建一个VR项目 我们将使用Unity创建一个简单的VR项目demo,其效果是在VR头盔中观察一个立方体. Step 1 打开Unity,创建一个新的空项目. Step 2 在Unity的菜单中选择F ...

  9. 使用Unity创建塔防游戏(Part1)

    How to Create a Tower Defense Game in Unity - Part1 原文作者:Barbara Reichart 文章原译:http://www.cnblogs.co ...

最新文章

  1. Linux学习-Xshell断开连接程序依然运行
  2. 节点插入--对比jQuery和JavaScript方法(一)
  3. python 信息加密
  4. Centos6.5搭建bugzilla
  5. java new collection_使用Java 8新增的Predicate操作Collection集合
  6. Autodesk招聘开发咨询顾问(北京或上海),需要内推的扔简历过来啊
  7. Python魔法方法(magic method)细解几个常用魔法方法(下)
  8. 使用C#实现Form窗体的淡入淡出效果
  9. python怎么部署到tomcat_使用python将war部署到tomcat
  10. Solaris Boot PROM 指令
  11. 想了解能源互联网?看这篇就够了
  12. 天地图矢量数据下载_关于离线地图数据的下载、更新以及删除的方法
  13. python表示倍数_python 求倍数
  14. 金蝶KIS旗舰版7.03 KIS旗舰版7.01 金蝶KIS专业版16.04 KIS专业版16.01 KIS商贸版9.04 KIS商贸版9.01 金蝶K3 15.1 云星空Cloud7.6企业版标准版
  15. 【硬见小百科】PCB多层板各层含义与设计原则
  16. XJTU 算法设计与问题求解作业题 第一周
  17. 富勒烯|Fullerene C60 富勒石 CAS:131159-39-2 |瑞禧
  18. Caché 时间函数
  19. 究竟怎样写代码才算是好代码
  20. bl wn810a linux驱动下载,bl wn810a驱动下载-BL-WN810A驱动 1.0 官方版 - 河东下载站

热门文章

  1. matlab学位论文绘图美化工具_推荐几个超级好用的工具,让你在论文中画出漂亮的插图...
  2. 英语中常见从句的简化
  3. 易语言取物理网卡MAC特征字
  4. 油烟净化器电场可以使用洗衣粉来清洗吗?
  5. Map阶段分析之Spill阶段
  6. 动态壁纸,视频特效- Android
  7. Netty-Socketio API
  8. 正则验证连续重复字符、连续递增递减数字
  9. java中转义字符的学习---(多看几遍就会了系列)
  10. 用python画股票分时图 github_GitHub - DogeWatch/stock: stock,股票系统。使用python进行开发。...