使用Unity编程游戏:入门指南

互联网经济的一个令人惊讶的特征是独立视频游戏的兴起。曾经是拥有数千名员工,数百万美元的Triple-A工作室的专属领域,因此已经开发出了许多工具集,这些工具集将现代游戏开发资源带入了个人或小型的即席程序员和设计师集合中。我们之前已经讨论过最好的独立游戏,因此请确保您对这些灵感有所了解,以了解使用Unity等工具可以实现的目标。

这些独立游戏开发团队已经展示了敏捷性和风险-宽容度,在许多情况下,使他们能够比大型预算竞争对手更快地推动游戏创新。近年来,许多令人震惊的成功独立游戏已经亮相,包括Minecraft,Limbo和Super Meat Boy,即使您不需要技巧来制作此类游戏,也可以使用Buildbox进行游戏。

在独立游戏开发迅速发展的格局中,Unity已成为事实上的标准:它的低成本,易用性和广泛的功能集使其成为快速游戏开发的理想选择。 Unity非常灵活,甚至您只要一点点DIY就能使自己的自定义游戏控制器成为可能!

即使是CCP(Eve Online的开发者)之类的大型工作室也使用它来快速制作游戏原型。 Unity提供了一个“盒子里的游戏引擎" –一种物理和渲染引擎,带有用于多种脚本语言的钩子,几乎可以适应任何类型的视频游戏。

Unity确实提供了可视化编辑器来操纵游戏环境。 ,Unity不是“零编程"游戏创建者工具。它需要您编写程序才能产生结果,但还提供了比任何“游戏开发者"程序都可能更多的灵活和强大的工具。

Unity不会帮您完成工作,但确实可以大幅降低进入壁垒。从C ++和OpenGL完全从头开始,可能要花几天的时间才能达到在屏幕上实际呈现的东西。使用Unity,大约需要十秒钟。 Unity以一种快速,直观的方式将游戏创建的基本元素交给了新手程序员。

今天,我将指导您完成在Unity中制作游戏所需的所有知识。分为十个主要章节:

§1– Unity版本

§2–安装Unity

§3–面向对象的简介范例

§4–Unity基础

§5–示例:游戏的基本元素

§6–Unity中的脚本

§7–示例:Pong脚本

§8–探索文档/了解更多信息

§9–构建游戏/编译为独立应用程序

§ 10封笔记

1。 Unity的版本

Unity有两种基本版本:专业版和免费版。两者之间存在许多差异,但从广义上讲,专业版支持许多视觉改进(例如实时柔和阴影和后处理),以及大量相对较小的功能,这些功能对于更复杂的游戏非常有帮助

也就是说,对于您可能要构建的大多数相对简单的游戏,Unity的免费版本就足够了。对于感兴趣的人,我们将在下面详细细分主要差异。

Unity的免费版本当然是免费的。但是,有一些限制:免费版本的Unity无法授权给年收入超过 100,000美元的任何公司。尽管此类组织不在本指南的范围内,但如果您怀疑自己会成为这样的组织,则选择Pro版本是明智的选择。

Unity的Pro版本为 $ 75 strong>一个月,或者 1500美元(用于永久许可证),并且对使用该游戏制作的游戏无限制。我们还将在本指南中使用30天的免费试用期,以使您尽可能全面地了解可用功能。还可通过Studica以 $ 129 获得一年的学生许可证。

免费版本的Unity缺少许多功能。但是,最重要的区别如下:Unity的免费版本缺少许多渲染选项,这些选项可以使外观更好,运行速度更快(LOD支持,屏幕空间后处理,高级着色器,实时软阴影和延迟渲染)。它还缺少完整的机械动画系统和一些AI工具。

通常,对于复杂的大型项目或图形性能很重要的项目,专业版是值得的。我使用专业版,因为我为Oculus Rift开发了虚拟现实游戏,并且屏幕空间后处理支持对于正确与耳机交互是必需的。

2。安装Unity

Unity易于安装。您可以从unity3d.com/get-unity/download下载可执行文件。

下载完成后,运行它,然后按照安装程序的说明进行操作。安装完成后,将出现一个标题为“激活您的Unity许可证"的窗口。选中标记为“激活Unity Pro的30天免费试用版"的框,然后单击“确定"。

恭喜!您现在有Unity Pro的30天试用期。试用版到期后,如果您不想购买专业版,则可以切换到免费版,并保留现有内容。

3。面向对象范例简介

在开始使用Unity之前,对基础知识有所了解很重要。 Unity支持 C# JavaScript 进行游戏编程;

首先,如果您以前从未编程过,请将本教程放在一边,并花几天时间研究Microsoft的C#语言入门,直到您对使用C#语言感到满意为止。用于简单任务的语言。

如果您想要与C#有所不同(但不一定要在Unity中使用的语言),请查看我们的六种最简单编程语言指南。初学者。

如果您以前使用命令式或面向对象的语言(例如C或Java)进行编程,请略过入门内容,并熟悉C#与过去使用的其他语言的不同之处。无论哪种方式,在您满意地解决C#的简单问题之前,都不要继续学习本教程(例如,如果我要您编写一个打印前100个质数的程序,那么您应该能够编写该程序而不必

。此处最重要的概念是面向对象的范例(简称为 OOP )。在面向对象的语言中,程序分为称为 Objects 的功能单元。每个对象都有其自己的私有变量和函数。特定于对象的功能称为方法

这里的想法是模块化:通过隔离每个对象,并通过其方法强制其他对象与其交互,可以减少可能的无意交互的数量-以及扩展的错误。您还可以创建无需修改即可在以后重用的对象。在Unity中,您将构建这些对象并将它们附加到游戏实体(它们将支配其行为)。

对象是从实例化的>:一个类只是一个文件,该文件列出了对象的定义。因此,如果您想要一个 Mook 对象来为游戏中的敌人处理AI,则可以编写一个“ Mook"类,然后将该文件附加到每个敌人实体上。当您运行游戏时,每个敌人都会装备一个“ Mook"对象的副本。

向对象添加新脚本的过程如下:

首先,< strong>选择对象,然后转到检查器。点击添加组件按钮。

转到新脚本,输入所需的名称,然后点击创建并添加

现在您有了一个新脚本,可以双击该脚本进行编辑!

一个类文件如下所示:

using UnityEngine;public class Mook : MonoBehaviour {    private float health;     void Start () {        health = 100;     }    void Update(){        if (health > 0) {            /* Search for player            if you encounter the player on the road, kill him            if you get shot, remove a random amount of health */        }    }}

让我们分解一下:

  • 使用UnityEngine:此行告诉C#我们要使用Unity的库,该库允许我们连接到Unity游戏引擎。
  • 公共类Mook:MonoBehaviour:此行声明了该类及其名称- Mook
  • 私有浮动健康状况:这将声明一个私有类变量(只能在该类内部进行更改)。在 Start 中为变量赋值。
  • 无效的Start():这将声明一个名为 Start 的方法。开始是一种特殊的方法,在游戏最初启动时只能运行一次。
  • 无效的Update():更新是另一种特殊的方法,它在每一帧上运行。您的大多数游戏逻辑都会在此处。
  • //如果您在路上遇到玩家,请杀死他:这行是注释(任何以双斜杠开头的行)被C#忽略)​​。注释用于提醒自己代码的某些特定功能。在这种情况下,该注释将用于代表实际执行该注释所描述的更复杂的代码块。
  • 附带开始 Update ,您几乎可以使用任何名称实例化自己的方法。但是,除非调用它们,否则您创建的方法将不会运行。让我们为名为 addTwoNumbers 的假设类声明一个方法,该方法将两个数字加在一起:

    public float addTwoNumbers(float a, float b) {    return a+b;}

    此方法声明一个公共(可用于其他对象)返回一个浮点数的方法,称为 > addTwoNumbers ,它将两个浮点数作为输入(称为 a b )。然后,它返回两个值的和作为其输出。

    从同一类内部(例如,从 Update 内部)调用此方法,如下所示:

    float result = addTwoNumbers(1, 2);

    从另一个类调用该方法类似:

    addTwoNumbers instance;float result = instance.addTwoNumbers(1, 2);

    再次,这只是创建我们的类的一个实例,访问适当的方法并为其提供要添加的数字,然后存储结果结果中。很简单。

    如果您的脚本被附加到具有特殊属性(例如粒子发射器)的对象,而该对象无法通过正常的GameObject参数集进行访问,则可以选择将其视为不同的对象使用 GetComponent 方法来创建一种游戏实体。

    其语法如下:

    GetComponent<ParticleSystem>().Play();

    如果您不熟悉其中的任何一种,请转到返回并通过C#入门。在进行过程中,它将为您节省很多挫败感。

    4。 Unity基础知识

    在本节中,我们将通过Unity引擎的基本原理进行工作。 Unity中的工作流程如下:

  • 创建实体以在游戏中扮演角色(空白 GameObjects 可用于抽象逻辑任务)。
  • 编写或查找类文件,然后将其作为脚本添加到实体中(使用 inspector 视图中的 Add Component 按钮。
  • 运行>测试>调试>重复,直到它起作用并转到游戏的下一个元素。
  • Unity带有许多基本的视图标签,可以按照用户喜好以各种方式进行布局。主要的五种是:

  • 游戏:显示正在运行的游戏实例,您可以与之交互并进行测试。
  • 场景:提供了游戏世界的静态,可编辑版本
  • 检查器::您可以通过在编辑器选项卡中选择单个实体来修改游戏世界中的单个实体。
  • 项目::您可以浏览项目的文件,并将模型,材质和其他资源拖到编辑器选项卡中,以将其放置在游戏世界中。
  • 层次结构:此选项卡显示世界上所有对象,允许您通过单击并拖动来查找场景中的远处对象和父实体。
  • 请参见下图,了解所有这些东西的位置:

    网格是 3D几何在Unity中的表示方式。您可以使用Unity内置的原始对象(立方体,球体,圆柱体等),也可以从Blender之类的建模包中导入自己的3D模型。 Unity支持多种3D格式,包括 .fbx .3ds

    操纵网格的基本工具是缩放,旋转和缩放。界面左上角的翻译按钮。这些按钮将控制图标添加到编辑器视图中的模型,然后可用于在空间中对它们进行操作。要更改对象的纹理或物理特性,请选择它们并使用 inspector 视图分析材料刚体元素。 GUI文本和 GUI Texture 游戏对象在编辑器中显示>

    传统GUI精灵和文本。但是,处理UI元素的更健壮和现实的方法是使用 3D文本 Quad GameObjects(具有透明纹理和未点亮的透明着色器)将HUD元素放置到

    层次结构视图中,可以将这些游戏元素拖动到主摄像机上以使其成为子级,以确保它们随摄像机移动和旋转。

    GUI元素(文本和纹理)的大小和比例可以使用检查器选项卡中的相关字段进行调整。

    材料是纹理和着色器的组合,可以直接拖动从“项目"选项卡添加到游戏对象。 Unity Pro附带了许多着色器,您可以使用检查器选项卡针对应用到它们的对象来调整附加到它们的纹理。

    要导入纹理,请将其转换为< strong> .jpg , .png .bmp ,并将其拖到Unity项目目录下的 assets 文件夹中(默认情况下显示在我的文档中)。几秒钟后,加载栏将出现在编辑器中。完成后,您可以在项目标签下找到作为纹理的图像。

    灯光是 GameObjects ,它们将辐射度投射到世界。如果您的场景中没有灯光,则所有多边形都以相同的亮度级别绘制,从而给世界带来平坦,褪色的外观。

    灯光可以进行定位,旋转和具有多个内部特征,您可以自定义。 强度滑块控制灯光的亮度,范围控制灯光的褪色速度。

    场景视图中的准则向您显示最大照明范围。同时使用这两种设置以达到所需的效果。您还可以调整灯光的颜色,在灯光指向的表面上显示的图案( cookie ,以及直接看灯光时屏幕上会出现哪种耀斑。可以使用cookie。来伪造更逼真的光图案,创建戏剧性的假阴影并模拟投影仪。

    三种主要的光是 spot point 和< 。

    点光源在3D空间中具有一定的位置,并且只能在一个方向上以可变角度的圆锥形投射光。这对于手电筒非常有用,探照灯,通常可以为您提供更精确的照明控制。聚光灯可以投射阴影。

    点光源在3D空间中具有一定位置,并且可以均匀投射所有光线点光源不会投射阴影。

    方向光最后用于模拟阳光:它们将光投射的方向好像是无限远走开。定向光会影响场景中的每个对象,并且会产生阴影。

    粒子系统是一个 GameObject ,可生成并控制数百或数千个粒子同时。粒子是在3D空间中显示的经过优化的小型2D对象。粒子系统使用简化的渲染和物理原理,但是可以实时显示数千个实体而不会出现卡顿现象,使它们成为烟,火,雨,火花,魔术效果等的理想选择。

    有很多您可以调整以实现这些效果的参数,并且可以通过在组件编辑器>选择粒子系统下选择一个粒子系统来生成它们来访问它们>打开检查器标签。您可以更改每个粒子的大小,速度,方向,旋转,颜色和纹理,并将大多数参数设置为随时间变化。

    碰撞下属性,如果启用它并将模拟空间设置为 world ,您将获得将与世界上的对象碰撞的粒子,该粒子可用于许多现实的粒子效果,包括雨,移动水和火花。

    5。示例:游戏的基本元素

    在本教程中,我们将制作一个简单的Pong游戏-在之前的DIY中我们已经介绍了几次:

  • Arduino经典Pong
  • Arduino OLED Pong
  • 在本节中,我们将详细介绍核心元素-脚本教程将在稍后发布。

    首先,让我们将Pong的游戏分解为基本组成部分。首先,我们需要两个桨和一个球。球从屏幕外飞出,因此我们需要一种机制来将其重置。我们还希望文本显示当前得分,并且,为了向您展示Unity的所有核心元素,我们希望在击球时出现奇妙的粒子效果。整个游戏将需要被极大地照亮。

    可以分解为一个球对象(一个球体),一个生成器,两个桨状道具附有粒子发射器 3D文本实体聚光灯。在本教程中,我们将使用默认的物理材料弹跳,并且将弹跳组合设置为。这是设置的样子,共有10个屏幕截图:

    首先,为桨创建一个 cube prop

    适当缩放, >将其复制,并在球的桨叶之间放置一个球体

    然后,创建一个 3DText对象 scale position 正确,更改 font size 属性以获得较少的像素化图像。

    下一步,创建两个< strong>粒子系统,选择所需的特征,然后将其附加到桨上。

    下一步,您要定位并旋转相机它正确地构图了场景。选择摄像机后,您可以在右下角看到摄像机视图的小预览。

    在完成此操作之前,我们需要创建两个额外的立方体作为保险杠,以防止滚珠跳出游戏区域。我们可以通过取消选中检查器选项卡中的网格渲染器来使其不可见。

    如果您点击播放,现在可以看到我们的游戏布局。他们什么都不会做,但是我们会解决的!

    现在我们已经有了设置,我们将讨论编写这些元素以编写游戏所涉及的内容

    6。 Unity中的脚本

    一旦您将脚本附加到对象上,就可以通过在检查器中双击该脚本来对其进行修改。这将打开MonoDevelop,这是Unity的默认开发环境。本质上,Monodevelop是一种文本编辑器,具有专门针对编程进行优化的功能。

    关键字和注释以蓝色绿色突出显示,数字值和字符串以红色出现。如果您使用过Eclipse或其他IDE,则MonoDevelop非常相似。您可以从编辑器内部构建脚本,以检查语法错误,如下所示:

    通常,要使脚本与Unity交互,您需要引用包含脚本的对象所拥有的元素(选择相关对象后,您可以在检查器选项卡下看到这些元素的列表)。然后,您可以为每个元素调用方法或设置变量以实施所需的更改。

    如果希望对象上的脚本影响其他对象的属性,则可以创建一个空的<脚本中的strong> GameObject 变量,然后使用检查器将其分配给场景中的另一个对象。

    一个对象可能具有的元素列表为如下所示(从上例中的一个桨的检查器视图中获取):

  • 变换
  • 多维数据集(网格过滤器)
  • Box Collider
  • 网格渲染器
  • 可以从脚本内部影响对象的每个方面。接下来,我们将确切地了解。

    Unity中GameObject的转换函数控制该对象的物理参数:其比例,其位置及其方向。您可以从如下脚本中访问它们:

    transform.position = newPositionVector3;transform.rotation = newRotationQuaternion;transform.localScale = newScaleVector3;

    在以上示例中,命名变量具有名称中指定的类型。这里有一些关键的细节:位置和比例尺都存储为 Vector3s 。您可以访问每个组件的 X Y Z 组件(例如, transform.position.y 可以让您知道物体在零平面上方的距离。

    但是,为了避免万向架锁定,旋转将作为四元数(四分量矢量)进行处理。由于手动操作四元数是不直观的,因此可以使用 Quaternion.Euler 方法,使用欧拉角来操纵旋转,如下所示:

    transform.rotation = Quaternion.Euler(pitch, yaw, roll);

    如果希望从一个位置平稳地移动对象到另一个,您会发现对四元数和vector3有用的 Slerp 方法。 Slerp接受三个参数-当前状态,最终状态和更改速度,并以给定速度在它们之间平滑地内插。语法如下所示:

    transform.position = Vector3.Slerp(startPositionVector3, newDestinationVector3, 1);

    Unity中的渲染器功能使您可以控制在屏幕上渲染道具表面的方式。您可以重新分配纹理,更改颜色以及更改对象的着色器和可见性。语法如下所示:

    renderer.enabled = false; renderer.material.color = new Color(0, 255, 0); renderer.material.mainTexture = myTexture; renderer.material.shader = newShader;

    其中大多数功能都非常清晰。第一个示例使所讨论的对象不可见:这是在许多情况下的有用技巧。第二个示例为该对象分配新的 RGB颜色(即绿色)。第三个将主漫反射纹理分配给新的Texture变量。最后一个示例将对象材质的着色器更改为新定义的着色器变量。

    Unity带有集成的物理引擎,所有物理沙箱游戏都使用此引擎。这使您可以分配对象的物理属性,并为您处理其模拟的详细信息。通常,与其尝试使用教科书和转换系统来实现自己的物理学,不如在最大可能范围内使用Unity的物理学引擎来简化和增强功能。

    所有物理学道具都需要对撞机。但是,实际的仿真本身由刚体处理,可以在 inspector 视图中添加。刚体可以是运动学非运动学

    运动物理道具与周围的非运动物理道具发生碰撞(并影响),但自身不会受到碰撞的影响。静态运动学道具是众所周知的不可移动的物体,而运动学运动的物件则是众所周知的不可阻挡的力量(记录下来,当它们碰撞时,它们只是彼此通过)。

    除此之外,您还可以调整角度拖动物体(旋转物体需要消耗多少能量),改变其质量,确定物体是否受重力影响并对其施加力。

    示例:

    rigidbody.angularDrag = 0.1f;rigidbody.mass = 100;rigidbody.isKinematic = false;rigidbody.useGravity = true;rigidbody.AddForce(transform.forward * 100);

    这些都是不言而喻的。这里唯一需要注意的是 transform.forward 的使用。 Vector3的所有三个组件( .forward .up .right )都与它们相关联,可以访问并随它们一起旋转( 前进是编辑器中蓝色箭头的方向)。 transform.forward 关键字只是大小为1的当前对象的前向矢量。可以将其乘以浮点数以对对象产生更大的作用力。您还可以引用 transform.up transform.right ,并取反它们以获得相反的结果。

    通常,在制作游戏时,就像碰撞一样,不仅会导致物理模拟,还会导致代码中的某些状态改变。为此,您需要一种冲突检测方法

    在Unity中检测冲突需要做一些准备工作。首先,碰撞中的至少一个物体需要附有非运动刚体。两个对象都必须具有正确的对撞机,并将其设置为非触发。这两个对象的总速度必须足够低,以至于它们实际上会发生碰撞,而不是简单地相互跳过。

    如果您已处理完所有这些操作,则可以通过放置一个特殊的对象来检查碰撞脚本中的碰撞检测方法,该脚本附加到您要检查碰撞的对象。该方法将如下所示:

    void OnCollisionEnter(Collision other) {    //do things here}

    该方法将在另一个对象触摸您的对象的第一帧期间自动运行。碰撞实体 other 是对您击中的对象的引用。例如,您可以引用其游戏对象刚体变换特性以各种方式对其进行操作。虽然 OnCollisionEnter 可能是您将要使用的最常用功能,但是您也可以使用 OnCollisionExit OnCollisionStay (否则语法和用法相同) ,分别在您停止与对象碰撞的第一帧和与物体碰撞的每一帧时激活。

    有时,执行称为的操作也很有用光线投射。在光线投射中,从某个起点沿着某个矢量沿着世界投射无限细的线(光线),当碰到某些东西时,将返回第一次碰撞的位置和其他细节。光线投射的代码如下所示:

    RaycastHit hit;if (Physics.Raycast(transform.position, -Vector3.up, out hit)) {    float distanceToGround = hit.distance;}

    这会沿-Vector3.up(向下)从当前对象的位置投射光线,并链接变量 hit 碰撞到的第一个对象。光线撞击到某物后,您可以访问 hit.distance 来确定它有多远,或访问 hit.GameObject 来操纵所命中的对象。

    这样的射线广播可用于射击者确定枪所指向的位置,或在照相机注视它们时选择对象,或用于某些样式的移动机制。

    保持这一重要因素请注意,当您以这种方式操作对象时,与 framerate 有关。无论您多么仔细地进行优化,帧速率始终会变化,并且您不希望游戏速度相应地变化。如果其他人在比您开发的计算机上运行游戏的速度更快的游戏,则您不希望游戏以两倍的速度运行。

    更正此问题的方法是将乘以使用渲染最后一帧所花费的时间。这是通过使用 Time.deltaTime 完成的。这可以有效地将您将每帧递增的任何变量的速度从每帧更改更改为每秒更改,并且您可能应该将此更改更改为您要更改的任何值

    现在我们已经介绍了如何创建,渲染和控制对象,下面我们来谈谈计算机游戏可以提供的另一种含义:声音。 Unity支持两种声音: 2D 3D 声音。 3D声音会根据距离改变其音量,并随着它们相对于摄像机的移动而失真; 2D声音不适合。

    2D声音适合配音和背景音乐使用,而3D声音适用于世界上由事件产生的声音。为了更改声音是否为3D,请在项目视图中将其选中,切换到 inspector 视图并从下拉菜单中选择适当的选项,然后按重新导入按钮。

    要真正播放声音,您需要将音频源附加到道具(您想要(如果是3D声音,则声音源自)。然后,您需要打开 audioclip 字段并选择您的声音文件。

    标签: