版本记录
版本号 | 时间 |
---|---|
V1.0 | 2018.12.10 星期一 |
前言
Unity是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。Unity类似于Director,Blender game engine, Virtools 或 Torque Game Builder等利用交互的图型化开发环境为首要方式的软件。其编辑器运行在Windows 和Mac OS X下,可发布游戏至Windows、Mac、Wii、iPhone、WebGL(需要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
。
你的第一个想法可能是三个因为你在前一个教程中添加了三个GameObjects
:space marine body and space marine head
。
但是,还有另外两个游戏对象:Main Camera
和Directional 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
在层次结构中,您将看到创建性地命名的新GameObject
:GameObject
。单击GameObject并将其命名为SpaceMarine
。
您可以在GameObjects
的名称中插入空格,例如Space Marine
。但是,为了保持一致性,您将在本教程中使用camel
大小写来表示名称。
将BobbleMarine-Body
和BobbleMarine-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-Body
从Models
文件夹拖到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)
,让您的太空飞船随意射击!
后记
本篇主要讲述了一款简单射击游戏示例,感兴趣的给个赞或者关注~~~