Unity开启篇(四) —— 一款简单射击游戏示例 (二)

版本记录

版本号 时间
V1.0 2018.12.10 星期一

前言

Unity是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。Unity类似于Director,Blender game engine, Virtools 或 Torque Game Builder等利用交互的图型化开发环境为首要方式的软件。其编辑器运行在Windows 和Mac OS X下,可发布游戏至WindowsMacWiiiPhoneWebGL(需要HTML5)、Windows phone 8和Android平台。也可以利用Unity web player插件发布网页游戏,支持Mac和Windows的网页浏览。它的网页播放器也被Mac 所支持。网页游戏 坦克英雄和手机游戏王者荣耀都是基于它的开发。
下面我们就一起开启Unity之旅。感兴趣的看下面几篇文章。
1. Unity开启篇(一) —— Unity界面及创建第一个简单的游戏 (一)
2. Unity开启篇(二) —— Unity界面及创建第一个简单的游戏 (二)
3. Unity开启篇(三) —— 一款简单射击游戏示例 (一)

开始

首先看下写作环境

C# 7.2, Unity 2018.1, Unity

在我们的Unity教程系列的第二部分中,您将学习如何使用C#从头开始制作Unity中的第一个游戏:一个名为Bobblehead Wars的双棒射击游戏!

在这个系列的第一个教程中,我们制作了勇敢的英雄,但是还没有碰到过外星敌人。

在本教程中,您将实现他的梦想。 但是,首先,您必须了解一个关键概念:GameObjects

注意:本教程项目将继续前一个教程停止的地方。 如果您没有跟进,可以参考上面一篇文章。


Introducing GameObjects - 引入GameObjects

在Unity中,游戏场景包(game scenes)含具有您永远不会猜到的名称的对象:GameObjects

你的玩家有游戏对象,外星人,屏幕上的子弹,实际的等级几何 - 基本上都是游戏本身GameObjects

就像项目浏览器包含所有资源一样,层次结构包含场景中的GameObjects列表。

要看到这一点,你需要让你的项目打开,如果它还没有打开,现在就打开。

注意:Unity打开项目文件的方式有点奇怪。您可以导航文件系统并查找场景文件。双击场景,然后Unity将打开统一欢迎。在该屏幕中,您可以选择要打开的项目。

或者,如果您启动Unity或单击File \ Open Project,您将看到项目列表。选择所需的项目,Unity将负责其余的工作。

如果未列出您的项目,请单击Open按钮以显示系统对话框。尝试导航到Unity项目的顶级目录,然后单击Select Folder,而不是搜索特定文件。引擎将检测文件夹中的Unity项目并将其打开。

当您打开较旧的Unity项目时,您可能会收到Unity的警告,该项目是使用较旧版本的Unity创建的。所有这些意味着Unity可能会重新导入您的所有资产。也就是说,它将为您的所有资产创建新的元数据。毋庸置疑,对于大型游戏而言,这种重新导入可能需要很长时间。此外,由于Unity正在更新您的项目,您应该始终先备份。

项目打开后,请查看您的层次结构并计算GameObjects

你的第一个想法可能是三个因为你在前一个教程中添加了三个GameObjectsspace marine body and space marine head

但是,还有另外两个游戏对象:Main CameraDirectional Light。 还记得Unity默认创建它们的方式吗? 是的,这些也是GameObjects

然而,还有更多的游戏对象。 您会注意到导入的GameObjects左侧有显示三角形。

按住PC上的Alt按钮或Mac上的Option,单击每个显示三角形。

如您所见,您有很多GameObjects

要记住的三个要点:

  • GameObjects can contain other GameObjects - GameObjects可以包含其他GameObjects。 在基础级别,这种有用的行为允许组织和父化彼此相关的GameObject。 更重要的是,对父级游戏对象的更改可能会影响他们的子游戏对象 - 更多的是在这一瞬间。
  • Models are converted into GameObjects - 模型转换为GameObjects。 Unity为您的模型的各个部分创建GameObjects,您可以像任何其他GameObject一样进行更改。
  • Everything contained in the Hierarchy is a GameObject - 层次结构中包含的所有内容都是GameObject。 甚至像相机和灯光这样的东西都是GameObjects。 如果它在Hierarchy中,那么它是一个受你命令约束的GameObject。

我们的英雄非常无聊,你需要让他移动,但首先,你需要重新定位你的游戏对象。

1. Moving GameObjects - 移动GameObjects

在开始之前,通过单击显示三角形来折叠所有GameObject树。

在层次结构中选择BobbleArena并花点时间观察Inspector,它提供有关所选GameObject的信息。

GameObjects包含许多组件,您可以将其视为小功能单元。 所有GameObject都包含一个组件:Transform组件。

Transform组件包含GameObject的位置,旋转和缩放。 使用inspector,您可以将这些设置为特定数字,而不必依赖于您的眼睛。 将鼠标悬停在轴名称上时,您会看到指针旁边出现箭头。

按鼠标左键并向左或向右拖动鼠标以调整这些数字。 这个技巧是一种通过小增量调整值的简单方法。

选择BobbleArena后,将Position设置为(-6.624,13.622,6.35)。 当我开发这个游戏时,arena最终处于这个位置。 你也可以把它放在游戏世界游戏的中心。 将Scale设置为(2.0,2.0,2.0)。 这为玩家提供了进入arena的更多空间。

如果缩小Scene view,您可能会注意到太空飞船悬浮在空隙中;他很可能会质疑他对重力的假设。 你可以移动他的头部然后移动他的身体,但是如果你将他的身体部位组合成一个GameObject,那会更容易。

在“层次结构”中,单击Create按钮,然后选择Create Empty

一个empty是一个GameObject,它只包含所有GameObjects所拥有的一个必需组件 - Transform组件,如前所述。

注意:您还可以通过单击GameObject \ Create Empty来创建一个空的GameObject。这适用于其他东西,如组件。没有preferred的做事方式 - 选择最适合您工作流程的方法。

2. Parenting the Space Marine

在层次结构中,您将看到创建性地命名的新GameObjectGameObject。单击GameObject并将其命名为SpaceMarine

您可以在GameObjects的名称中插入空格,例如Space Marine。但是,为了保持一致性,您将在本教程中使用camel大小写来表示名称。

BobbleMarine-BodyBobbleMarine-Head拖入SpaceMarine GameObject

当您使用GameObjects时,会发生一些事情。特别是,即使GameObjects不移动,子项的位置值也会改变。发生此修改是因为GameObject位置始终相对于父GameObject。

在层次结构中选择SpaceMarine。 转到Scene view,然后按F将焦点对准它。arena阻挡你的观点。

谢天谢地,你不需要快速获取Dumbledore。 你可以让它消失! 在Hierarchy中选择BobbleArena,在Inspector中,取消选中GameObject名称左侧的框。 这将使arena消失。

你现在应该只看到英雄。 选择SpaceMarine GameObject。 在检查器中,将鼠标悬停在X position label上,直到看到滑块箭头。 按住鼠标左键并向左或向右移动鼠标。 注意所有GameObjects如何相对于父级移动。

如你所见,父级确实有其优势。

当您将GameObject放在另一个中时,子GameObject的位置不会改变。不同之处在于GameObject现在相对于父级定位。也就是说,将子GameObject设置为(0,0,0)会将子移动到父级的中心而不是游戏世界的中心。

你现在要做这个来组装你的飞船。

选择BobbleMarine-Body,然后在Inspector中将Position设置为(0,0,0)。选择BobbleMarine-Head并在Inspector中将Position设置为(-1.38,6.16,1.05)

恭喜!你的英雄组装好了。

3. Positioning the Marine

现在是时候把太空船放在他正确的起始位置了。选择BobbleArena,然后在Inspector中,选中名称旁边的框以重新启用它。

选择SpaceMarine,在Inspector中,将其位置设置为(-4.9,12.54,5.87)。另外,将旋转设置为(0,0,0)。你的飞船应该直接在舱口上方。如果不是这种情况,那么随意调整值,直到这种情况。

一旦英雄到位,在场景视图中按F键,这样你就可以看到他了。

现在英雄应该准确地定位在电梯上。


Creating a Prefab

这个游戏具有令人毛骨悚然的怪虫,像英雄一样,它们由许多部分组成。 需要一些装配。

在“层次结构”中,单击Create按钮,然后从下拉菜单中选择Create Empty。 单击GameObject将其命名为Alien

在层次结构中选择Alien,然后在Inspector中将位置设置为:(2.9,13.6,8.41)

从项目浏览器中,将BobbleEnemy-BodyModels文件夹拖到Alien GameObject中。

BobbleEnemy-Body Position设置为(0,0,0)。 现在外星人和英雄应该在竞技场中并排。

由于外星人没有头脑,令人毛骨悚然,英雄需要更多射击,而不是那个细长的小框架。 从项目浏览器中,将BobbleEnemy-Head拖入Alien GameObject。 将Position设置为(0.26,1.74,0.31),将Rotation设置为(-89.96,0,0)Scale设置为(100,100,100)

那是一个凶猛的小虫子。 他们聚在一起很好,你可以把他们误认为下一个超级明星打击犯罪组合。

此时,你有一个用于英雄的父游戏对象和另一个用于外星人的游戏对象。 对于英雄来说,这很有效,因为你只需要一个。 对于外星人来说,你需要很多 - 所以,这么多。

你可以复制并粘贴外星人来制作克隆,但他们都是个体。 如果您需要更改外星人的行为,则必须更改每个实例。

对于这种情况,最好使用prefab,这是一个主副本,可用于制作任意数量的单个副本。 预制件是您的朋友,因为当您更改有关它们的任何内容时,您可以将其应用于其他实例。

制作预制件很简单。 选择Alien GameObject并将其拖动到项目浏览器中的Prefabs文件夹中。

一些事情发生了变化。 Prefabs文件夹中有一个新条目,旁边有一个图标。 您还会注意到层次结构中GameObject的名称现在为蓝色。 您还会注意到该文件夹中已有预制件。 这些是您使用其余资产导入的预制件。

注意:您不必将模型拖动到该特定文件夹中以创建预制件 - 所需要的只是将GameObject拖动到项目浏览器中的任何文件夹中。 有一个Prefabs文件夹只是很好的习惯。

蓝色表示GameObject已经从预制件或模型实例化,例如BobbleArena。 在层次结构中选择Alien GameObject,然后查看Inspector。 你会注意到一些额外的按钮。

以下是这些新按钮的细分:

  • Select - 选择将在项目浏览器中选择预制件。 当您有大量文件并希望轻松访问预制件以进行更改时,这非常有用。
  • Revert - 还原将撤消您对实例所做的更改。 例如,你可能会玩大小或颜色,但最终会有一些可怕的东西,就像一只恶毒的粉红色蜘蛛。 您可以单击Revert按钮以恢复健全性。
  • Apply - 应用会将您对该实例所做的任何更改应用于其预制件。 该预制件的所有实例也将更新。

创建预制实例非常简单。 在项目浏览器中选择Alien预制件,然后在场景视图(Scene view)中将其拖到另一个Alien旁边。

您还可以将实例拖到层次结构中。如您所见,创建更多外星人就像从项目浏览器中拖动Alien预制件一样简单。但你还不需要大批外星人,所以从层次结构中删除所有外星人。您可以通过在层次结构中选择GameObject并按键盘上的Delete(Mac上的Command-Delete)来删除GameObject,也可以右键单击它并选择Delete。

1. Fixing the Models

接下来的待办事项是修复一些模型。在这种情况下,Unity导入了模型但丢失了对纹理的引用。您可以通过向材质添加纹理来解决此问题。

在Unity中,材质是附加有程序的纹理,称为着色器。您可以编写自己的着色器,这超出了本教程的范围。着色器确定纹理的外观。例如,您可以编写着色器以使石材纹理看起来粗糙或金属质感看起来有光泽。值得庆幸的是,Unity带有自己的着色器为您做到这一点。

在项目浏览器的Models文件夹中,将BobbleArena-Column拖到Scene view视图中。你会发现一种沉闷的白色材料。

如果源包中的材质名称或纹理名称发生更改,Unity将失去与该材质的连接。 它试图通过为您创建一个新材料但没有附加纹理来解决这个问题。

要解决此问题,您必须为材质指定新纹理。 在Project Browser中,选择Models子文件夹,然后展开BobbleArena-Column以查看所有子对象。

接下来,在Project Browser中选择Cube_001,然后在Inspector中,单击Main_Material着色器的显示三角形。

你会发现有很多选择! 这些选项配置此材质的外观。

例如,Metallic滑块确定材料的类金属质量。 高金属值意味着纹理将像金属一样反射光。 您会注意到大多数属性左侧有一个灰色框。 这些盒子用于纹理。

在这种情况下,您想要的只是模型上的图像。 在Project Browser中,选择Textures文件夹。 单击并将Bobble Wars Marine texture拖动到着色器属性中的Albedo属性框中。

Albedo属性用于纹理,但您也可以在其中放置颜色。 完成此操作后,您的列现在将具有纹理。

竞技场也遭遇了纹理问题。

在Hierarchy中,展开BobbleArena,然后展开Floor。 选择Floor_Piece

Inspector中,您会注意到地板上贴有两种材料。 BobbleArena-Main_Texture材质没有分配纹理。 您可以判断,因为材质预览全部为白色。

就像您对该列所做的那样,在项目浏览器中选择Textures文件夹。 单击并将Bobble Wars Marine纹理拖动到着色器属性中的Albedo属性框中。

你的楼层现在将获得边界。 多么时尚!

您还会注意到,不仅是一个,而且所有地板部分都获得了边界。这是因为它们都使用相同的材​​料。

2. Adding Obstacles

现在您已经修复了模型,现在是时候在竞技场中添加一堆列了。您将总共生成七列,并且您将使用prefabs执行此任务。

注意:每当看起来你应该复制一个GameObject时,请使用prefab - 这是另一种最佳实践。一些Unity开发人员坚持使用prefab来处理所有事情,甚至是独特的对象。

我们的想法是,创建一个预制件并制作副本要比将一组现有的游戏对象转换为预制实例要容易得多。前一种方法需要最少的工作,而后一种方法要求您在保留每个实例的任何唯一更改的同时将共性提取到预制件中。这导致了很多工作。

在Hierarchy中,将BobbleArena-Column拖到Prefabs文件夹中,将其转换为预制件。

在Hierarchy视图中仍然选择了BobbleArena-Column实例后,转到Inspector并将position设置为(1.66,12.83,-54.48)。将scale设置为(3.5,3.5,3.5)。您确实希望所有预制件具有相同的比例,因此请单击Apply按钮。

现在是时候制作其余的专栏了。

在场景视图中一次拖动一个列从一个项目到另一个项目可能有点单调乏味,特别是当有多个实例时。 通过在层次结构中选择一个并在PC上按Ctrl-D或在Mac上按Command-D复制列。

创建总共六个重复项并给它们以下位置:

  • Column 1: (44.69, 12.83, –28.25)
  • Column 2: (42.10, 12.83, 30.14)
  • Column 3: (–8.29, 12.83, 63.04)
  • Column 4: (80.40, 12.83, –13.65)
  • Column 5: (–91.79, 12.83, –13.65)
  • Column 6: (–48.69, 12.83, 33.74)

你现在应该在竞技场中有七列。

竞技场看起来不错,但层次结构有点混乱。 单击Create button并选择Create Empty以对其进行整理。 将GameObject重命名为Columns并将每列拖动到其中。

您会注意到列具有相似的名称,并附加了唯一的数字。 由于它们基本上是一个实体,因此共享一个名称就没问题了。 按住Shift键并选择层次结构中的所有列。 在Inspector中,将名称更改为Column

注意:正如您所看到的,可以一次更改一堆GameObjects的公共属性。


Creating Spawn Points

嗜血的外星人有什么好处,除非他们大量生成?在本节中,您将设置生成点以产生敌人。

到目前为止,您已经使用希望玩家看到的GameObjects来组装游戏。当涉及到产卵点时,你不希望任何人看到它们。然而,重要的是你知道他们在哪里。

您可以创建一个3D立方体并将其放置在场景中以表示生成点,然后在游戏开始时将其删除,但这是一种笨重的方法。 Unity提供了一种称为labels的简单机制,它们是在Scene view中可见的游戏对象,但在游戏过程中是不可见的。要查看它们的运行情况,您将创建一组不同的生成点,类似于您创建列的方式。

单击Hierarchy中的Create按钮,然后选择Create Empty。将它命名为Spawn并将位置设置为(-5.44,13.69,90.30)

Inspector中,单击复选标记旁边的彩色多维数据集。将出现具有所有不同标签样式的弹出按钮。点击蓝色胶囊(blue capsule)

看看你的场景视图;你会看到它已经被注释成产卵点了。

您可能无法在场景中看到label。 如果是这种情况,则需要增加label的大小。 为此,请单击场景视图中的Gizmos按钮,然后将3D图标滑块拖动到最右侧。 这将增加label的大小,以便您在缩小时可以看到它们。

您需要再创建10个生成点。 通过执行以下操作使放置更容易:

  • 1) 在Scene view中,单击场景Gizmo的中心立方体以将“场景”视图切换为“等轴测(Isometric)”模式。
  • 2) 单击绿色的y轴箭头,以便向下看场景。

现在继续复制和重新定位10个更多的生成点。

不要担心,如果你没有让它们完全相同 - 游戏设计更像是一门艺术,而不是一门科学!

完成后,单击Hierarchy中的Create按钮,选择Create Empty并将其命名为SpawnPoints。 将所有生成点拖入其中。 批量重命名它们就像你对Spawn的列一样。

恭喜! 您的游戏现已正确设置。 一定要保存!

在这一点上,你有你的英雄,他的敌人,外星人和他们将战斗到死亡的竞技场。 你甚至为小虫子创造了产卵点。 在您开始设置时,您了解到:

  • GameObjects以及在使用Unity时它们为什么如此重要的原因。
  • Prefabs用于何时创建单个GameObject的多个实例。
  • Labels标签可以帮助您在不干扰游戏的情况下对游戏开发进行标注。

你的游戏中仍然没有动作,但那没关系。 你已经准备好学习如何给你的游戏带来生命的气息并将其带走(通过太空船的大机枪)。

在本教程的下一部分中,您将为此游戏添加一些操作,学习如何使用组件(Components),让您的太空飞船随意射击!

后记

本篇主要讲述了一款简单射击游戏示例,感兴趣的给个赞或者关注~~~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容