用unity编写游戏:初学者指南

在不断发展的独立游戏开发领域,Unity已经成为一种事实上的标准:它的低成本、易用性和广泛的功能集使它成为快速游戏开发的理想选择。...

This guide is available to download as a free PDF. Download this file now. Feel free to copy and share this with your friends and family.

互联网经济的一个令人惊讶的特点是独立电子游戏的兴起。曾经是千人、数百万美元的三甲工作室的专属领域,现在已经开发出许多工具集,将现代游戏开发资源带到个人或程序员和设计师的小型临时集合手中。我们之前讨论过最好的独立游戏,所以一定要查看这些游戏,以获得一些关于Unity等工具可以实现什么的灵感。

unity-feat

这些独立游戏开发团队表现出了灵活性和风险承受能力,在许多情况下,这使得他们能够比他们的大预算对手更快地推动游戏创新。近年来,有许多令人震惊的成功独立游戏首映,包括Minecraft、Limbo和Super Meat Boy,即使你不需要技能来**这样的游戏,你也可以使用Buildbox来**游戏。

在快速发展的独立游戏开发领域,Unity已经成为事实上的标准:它的低成本、易用性和广泛的功能集使它成为快速游戏开发的理想选择。统一是如此灵活,你甚至可以使自己的自定义游戏控制器与一点DIY的诀窍!

甚至像***(eveonline的开发者)这样的大型工作室也使用它来快速原型化游戏概念。Unity提供了一个“盒子里的游戏引擎”--一个物理和渲染引擎,带有几种脚本语言的挂钩,几乎可以适应任何类型的视频游戏。

虽然Unity确实提供了一个可视化的编辑器来操作游戏环境,但Unity并不是一个“零编程”的游戏创建者工具。它要求你通过编程来产生结果,但同时也给了你一个比任何“游戏**者”程序都要灵活和强大得多的工具。

团结不会为你做的工作,但它确实大大降低了进入的门槛。从头开始完全用C++和OpenGL,它可能需要几天的时间点,那里实际上有东西呈现在屏幕上。使用Unity,大约需要10秒钟。Unity以一种快速、直观的方式将游戏创建的基本元素交给新手程序员。

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

§1–统一版本

§2–安装Unity

§3–面向对象范例简介

§4–统一基础

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

§6–统一脚本

§7–示例:脚本编写Pong

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

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

§10闭幕词

1统一的版本

Unity有两种基本风格:专业版和免费版。有很多不同之处,但从广义上讲,pro版本支持许多视觉改进(如实时软阴影和后处理),以及大量相对次要的功能,这些功能对更复杂的游戏非常有帮助。

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

1.1定价

统一的自由版本当然是自由的。但是,有一些限制:免费版的Unity不能授权给任何年收入超过10万美元的公司。虽然这样的组织超出了本指南的范围,但如果您怀疑自己可能会成为这样的组织,那么使用spring的Pro版本可能是明智的。

Unity的专业版是每月75美元,永久许可证是1500美元,并且对你用它创建的游戏没有限制。我们将在本指南中使用30天的****期,以便您尽可能完整地了解可用功能。Studica还提供为期一年的学生执照,费用为129美元。

1.2特点

Unity的免费版本中缺少许多特性。但是,最重要的区别如下:Unity的免费版本缺少许多渲染选项,这些选项可以让游戏看起来更好、运行更快(LOD支持、屏幕空间后处理、高级着色器、实时软阴影和延迟渲染)。它还缺乏完整的mechanim动画系统和一些人工智能工具。

一般来说,对于复杂的、大规模的项目,或者图形性能很重要的项目,pro版本是值得的。我使用的是pro版本,因为我为Oculus Rift开发了虚拟现实游戏,并且屏幕空间的后期处理支持是正确与耳机交互所必需的。

2安装unity

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

下载后,运行它,然后按照安装程序的说明进行操作。安装完成后,将出现一个标题为“激活Unity许可证”的窗口。选中标有“激活Unity Pro 30天****版”的复选框,然后选择“确定”。

祝贺 你!你现在有一个30天的统一亲审判。试用期满后,如果您不想购买专业版,可以切换到免费版,保留现有内容。

三。面向对象范式简介

在开始使用Unity之前,重要的是我们要稍微复习一下基础知识。Unity支持C#和JavaScript进行游戏编程;我们将在本教程中使用C#。

首先,如果您以前从未编程过,请将本教程放在一边,花几天时间学习Microsoft的C语言入门,直到您觉得使用该语言完成简单任务很舒服为止。

如果您希望与C#有些不同(但不一定是一种可以在Unity中使用的语言),那么请参阅我们的指南,为初学者提供六种最简单的编程语言。

如果您以前使用命令式或面向对象语言(如C或Java)进行过编程,请浏览入门知识,熟悉C与过去使用的其他语言的区别。不管是哪种方式,在你觉得用C#解决简单的问题很舒服之前不要继续学习教程(例如,如果我让你写一个打印前100个素数的程序,你应该可以不用咨询Google就可以写这个程序)。

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

这里的想法是模块化:通过隔离每个对象,并通过其方法强制其他对象与之交互,您可以减少可能的无意交互的数量,并扩展为bug。您也可以创建对象,您可以在以后不进行修改的情况下重用。在统一中,您将构建这些对象并将它们附加到游戏实体(它们将管理其行为)。

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

将新脚本附加到对象如下所示:

007Ys3FFgy1h1oi25956sj31hc0u0dj1

首先,选择对象并转到检查器。单击“添加组件”按钮。

007Ys3FFgy1h1oi263wvwj31hc0u0diy

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

007Ys3FFgy1h1oi26zmj7j31hc0u077p

现在你有一个新的脚本,你可以编辑双击它!

类文件如下所示:

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:Mono行为:这条线声明类及其名称--Mook。
  • Private float health:它声明一个私有类变量(只能从类内部更改)。变量在Start中给定一个值。
  • Void Start():声明一个名为Start的方法。启动是一种特殊的方法,只在游戏启动时运行一次。
  • Void Update():Update是另一种特殊方法,它在每一帧上运行。你的大部分游戏逻辑都在这里。
  • //如果你在路上遇到玩家,杀了他:这一行是评论(任何以双斜杠开头的行都会被C#忽略)。注释是用来提醒自己特定代码的作用。在本例中,此注释用于替代一个更复杂的代码块,该代码块实际执行注释所描述的操作。

除了Start和Update之外,您还可以用几乎任何名称实例化自己的方法。但是,您创建的方法除非被调用,否则不会运行。让我们为一个名为addTwoNumbers的假设类声明一个方法,该类将两个数字相加:

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

这声明了一个public(可供其他对象访问)方法,该方法返回一个名为addTwoNumbers的float,该方法将两个float作为输入(称为a和b)。然后返回两个值之和作为输出。

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

float result = addTwoNumbers(1, 2);

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

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

同样,这只是创建我们类的一个实例,访问适当的方法并向它提供我们想要添加的数字,然后将结果存储在result中。很简单。

如果你的脚本附加到一个对象上,而这个对象有一些特殊的属性(比如粒子发射器),而这些属性在正常的游戏对象参数集下是无法访问的,那么你可以选择使用GetComponent方法将其视为一个不同类型的游戏实体。

其语法如下所示:

GetComponent<ParticleSystem>().Play();

如果你不熟悉这些内容,请回到C#入门。在我们继续的过程中,这会让你省去很多挫折。

4统一基础

在本节中,我们将学习Unity引擎的基本机制。Unity中的工作流是这样的:

  1. 创建一个实体来服务于游戏中的角色(空白的游戏对象可以用于抽象的逻辑任务)。
  2. 编写或查找一个类文件,并将其作为脚本添加到实体中(使用inspector视图中的addcomponent按钮)。
  3. 运行&gt;测试&gt;调试&gt;重复,直到它工作,然后继续游戏的下一个元素。

Unity提供了许多基本视图选项卡,可以根据用户的喜好以各种方式进行布局。五大要素是:

  1. 游戏:显示可与之交互和测试的游戏的运行实例。
  2. 场景:提供游戏世界的静态、可编辑版本。
  3. 检查器:允许您通过在编辑器选项卡中选择来修改游戏世界中的单个实体。
  4. 项目:允许您浏览项目的文件,并将模型、材质和其他资源拖到编辑器选项卡中,以将它们放置在游戏世界中。
  5. 层次:此选项卡显示世界上的所有对象,允许您在场景中查找远处的对象,并通过单击和拖动将实体彼此关联。

所有这些东西的位置见下图:

007Ys3FFgy1h1oi27qrr1j31hc0u0go9

4.1统一实体

4.1.1网格

网格是三维几何体统一表示的方式。您可以使用Unity的内置基本体对象(立方体、球体、圆柱体等),也可以从Blender或Maya等建模软件包中导入自己的3D模型。Unity支持多种3D格式,包括.fbx和.3ds。

操纵网格的基本工具是界面左上角的缩放、旋转和平移按钮。这些按钮将控制图标添加到编辑器视图中的模型中,然后可以使用编辑器视图在空间中操纵它们。若要更改对象的纹理或物理特性,请选择它们并使用“检查器”视图分析材质和刚体元素。

4.1.2 gui元素

传统的GUI精灵和文本可以在编辑器中使用GUI文本和GUI纹理游戏对象来显示。但是,处理UI元素的一种更健壮、更真实的方法是使用3D文本和Quad GameObjects(具有透明纹理和无光透明着色器)将HUD元素作为实体放置到游戏世界中。

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

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

4.1.3材料

材质是纹理和着色器的组合,可以从“项目”选项卡直接拖动到游戏对象上。Unity Pro附带了大量明暗器,您可以使用应用这些明暗器的对象的“检查器”选项卡调整附加到明暗器的纹理。

若要导入纹理,请将其转换为.jpg、.png或.bmp,然后将其拖动到Unity项目目录下的assets文件夹中(默认情况下,该文件夹显示在“我的文档”中)。几秒钟后,一个加载条将出现在编辑器中。完成后,您可以在“项目”选项卡下找到作为纹理的图像。

4.1.5灯光

灯光是一种游戏物体,它将光线投射到世界上。如果场景中没有灯光,则将以相同的亮度级别绘制所有多边形,从而使世界看起来平坦、褪色。

可以对灯光进行定位、旋转,并且可以自定义多个内部特征。“强度”滑块控制灯光的亮度,范围控制灯光淡出的速度。

场景视图中的指导线显示照明的最大范围。使用这两种设置可以达到所需的效果。您还可以调整灯光的颜色、灯光所指向的表面上显示的图案(cookie),以及当您直视灯光时屏幕上显示的光斑类型。cookie可以用来伪造更真实的光照模式,创建戏剧性的假阴影,并模拟投影仪。

三种主要的光是聚光灯、点光源和定向光源。

聚光灯在三维空间中有一个位置,在一个可变角度的圆锥体中只向一个方向投射灯光。这些是好的手电筒,探照灯,一般来说,给你更精确的控制照明。聚光灯可以投射阴影。

点光源在三维空间中有一个位置,并在所有方向上均匀地投射灯光。点光源不投射阴影。

最后,平行光被用来模拟阳光:它们将光线投射到一个方向上,就像从无限远的地方射出一样。平行光影响场景中的每个对象,并且可以产生阴影。

4.1.6粒子系统

粒子系统是一个游戏对象,可以同时生成和控制数百或数千个粒子。粒子是在三维空间中显示的小而优化的二维对象。粒子系统使用简化的渲染和物理,但可以实时显示数千个实体而不结巴,使它们成为烟、火、雨、火花、魔术效果等的理想选择。

可以调整许多参数以实现这些效果,并且可以通过在“组件编辑器”(component editor)&gt;“选择粒子系统”(selecting the particle system)&gt;“打开检查器”(inspector)选项卡下生成粒子系统来访问这些参数。您可以更改每个粒子的大小、速度、方向、旋转、颜色和纹理,并设置其中大多数参数以随时间而更改。

在“碰撞”(collision)属性下,如果启用该属性并将“模拟空间”(simulation space)设定为“世界”(world),则将获得与世界中的对象碰撞的粒子,这些粒子可用于许多真实的粒子效果,包括雨、移动的水和火花。

5示例:游戏的基本元素

在本教程中,我们将**一个简单的乒乓球游戏——我们之前在DIY中已经讨论过几次了:

  • Arduino经典乒乓球
  • Arduino OLED庞

在本节中,我们将讨论如何安排核心元素——脚本教程将在后面介绍。

首先,让我们把乒乓球游戏分解成它的基本组成部分。首先,我们需要两个桨和一个球。球飞离屏幕,所以我们需要一个机制来重置它。我们还希望文本显示当前的分数,并且,为了向您显示统一的所有核心元素,我们希望在您击球时使用奇特的粒子效果。整个游戏将需要戏剧性地点燃。

它分解为一个球对象(一个球体)、一个产卵器、两个带有粒子发射器的桨道具、一个三维文本实体和一个聚光灯。在本教程中,我们将使用默认的physic材质bounce,并将bounce combine设置为乘法。以下是10个屏幕截图中的设置:

007Ys3FFgy1h1oi28g1snj31hc0u0wgo

007Ys3FFgy1h1oi299mgpj31hc0u0772

首先,创建一个立方体桨道具。

007Ys3FFgy1h1oi2a3buyj31hc0u0776

适当地缩放它,复制它,并在球的桨之间放置一个球体。

007Ys3FFgy1h1oi2axenlj31hc0u076r

然后,创建一个3DText对象,并对其进行缩放和正确定位,更改“字体大小”属性以获得像素较少的图像。

007Ys3FFgy1h1oi2bpj2mj31hc0u041g

接下来,创建两个粒子系统,拾取所需的特征,并将它们附加到桨上。

007Ys3FFgy1h1oi2clrajj31hc0u0adi

007Ys3FFgy1h1p5qc1a2rj31hc0u0n03

接下来,您将要定位并旋转摄影机,以便它正确地设置场景的帧。选择相机时,您可以在右下角看到相机视图的小预览。

007Ys3FFgy1h1oi2e6h0vj31hc0u0who

在我们完成之前,我们需要创建两个额外的立方体作为缓冲器,以防止球反弹出游戏区域。我们可以通过取消选中“检查器”选项卡中的“网格渲染器”使它们不可见。

007Ys3FFgy1h1oi2f1lr6j31hc0u0mza

007Ys3FFgy1h1oi2ftfupj31hc0u0jue

如果你点击play,你现在可以看到我们游戏的基本元素。他们什么也不会做,但我们会做到的!

007Ys3FFgy1h1oi2gh5c2j31hc0u0dha

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

6统一脚本

将脚本附加到对象后,可以通过在检查器中双击它来修改它。这将打开MonoDevelop,这是Unity的默认开发环境。从本质上讲,Monodevelop是一个文本编辑器,它具有专门针对编程优化的特性。

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

007Ys3FFgy1h1oi2he5efj31hc0u078y

一般来说,要使脚本与Unity交互,需要引用包含脚本的对象所拥有的元素(选中相关对象时,可以在inspector选项卡下看到这些元素的列表)。然后可以为每个元素调用方法或设置变量,以执行所需的更改。

如果希望对象上的脚本影响其他对象的属性,可以在脚本中创建一个空的GameObject变量,并使用检查器将其指定给场景中的另一个对象。

对象可能具有的元素列表如下(取自上例中我们的一个桨的inspector视图):

  1. 变换
  2. 立方体(网状过滤器)
  3. 盒子碰撞器
  4. 网格渲染器

对象的每个方面都可以从脚本中受到影响。下一步,我们来看看到底怎么做。

6.1转换

Unity中游戏对象的变换函数控制该对象的物理参数:其比例、位置和方向。您可以从以下脚本中访问它们:

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

在上面的例子中,命名变量是在名称中指定的类型。这里有一些关键的细节:如您所料,位置和比例存储为矢量3。您可以访问每个矢量的X、Y和Z分量(例如,变换位置.y给出对象在零平面以上的距离)。

但是,为了避免万向节锁定,旋转被处理为四元数(四个分量向量)。因为手动操作四元数是非直观的,所以可以使用四元数。欧拉方法如下:

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

如果您希望将对象从一个地方平滑地移动到另一个地方,您会发现四元数和向量的Slerp方法很有用。Slerp接受三个参数——当前状态、最终状态和变化速度,并以给定的速度在它们之间进行平滑插值。语法如下所示:

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

6.2渲染器

Unity中的渲染器函数允许您控制在屏幕上渲染道具表面的方式。可以重新指定纹理、更改颜色以及更改对象的明暗器和可见性。语法如下所示:

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

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

6.3物理

Unity附带了一个集成的物理引擎——物理沙盒游戏都使用这个引擎。这允许您指定对象的物理特性,并让您处理其模拟的详细信息。总的来说,与其尝试使用教科书和转换系统来实现自己的物理,不如尽可能地使用Unity的物理引擎更简单、更健壮。

所有的物理道具都需要对撞机。但是,实际的模拟本身是由一个刚体来处理的,这个刚体可以添加到inspector视图中。刚体可以是运动学的,也可以是非运动学的。

运动学物理道具与其周围的非运动学物理道具碰撞(并产生效果),但不受碰撞本身的影响。静态运动道具是众所周知的不可移动的物体,而移动的运动物体是众所周知的不可阻挡的力量(记录在案,当它们碰撞时,它们只是相互穿过)。

除此之外,您还可以调整对象的角阻力(旋转它所需的能量),更改其质量,指示它是否受重力影响,并对其应用力。

示例:

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

这些都是不言自明的。这里唯一要注意的是向前转换. Vector3都有三个组件(.forward、.up和.right)与之关联,可以访问它们并随它们一起旋转(forward是编辑器中蓝色箭头的方向)。这个向前转换关键字只是当前对象的前向向量,大小为1。它可以乘以一个浮点数在物体上产生更多的力。你也可以参考转换向上以及转换。右,并否定它们得到相反的结果。

6.4碰撞

通常,在构建游戏时,您希望冲突导致代码中的状态发生一些变化,而不仅仅是物理模拟。为此,需要一种碰撞检测方法。

需要做一定的准备工作来检测统一体中的碰撞。首先,碰撞中至少有一个物体需要附加一个非运动学刚体。两个对象都必须有正确的碰撞器,设置为非触发器。两个物体的总速度必须足够低,以使它们真正碰撞,而不是简单地跳过另一个物体。

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

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

此方法将在另一个对象与您的对象接触的第一帧期间自动运行。碰撞实体other是对所击中对象的引用。例如,您可以引用它的游戏对象、刚体和变换特征以各种方式操纵它。虽然OnCollisionEnter可能是您将要使用的最常见的函数,但是您也可以使用oncollisionxit和OnCollisionStay(使用其他相同的语法和用法),它们分别在您停止与对象碰撞的第一帧和与对象碰撞的每一帧期间激活。

有时,进行所谓的光线投射也很有用。在光线投射中,一条无限细的线(光线)从某个原点沿着某个向量投射到世界上,当它击中某个物体时,第一次碰撞的位置和其他细节就会返回。光线投射的代码如下所示:

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

这将从当前对象的位置沿-Vector3.up(笔直向下)投射光线,并将变量hit链接到与其碰撞的第一个对象。一旦你的射线击中了什么东西,你就可以进入命中距离去确定它有多远,或者命中游戏对象操纵你击中的物体。

像这样的光线投射可以被射手用来确定枪指向的是什么,或者在相机注视对象时选择对象,或者用于某些类型的运动。

6.5时间校正

以这种方式操纵对象时要记住的一个重要因素是帧速率。无论你如何小心地优化,帧速率总是会变化的,你不希望你的游戏速度也会相应地变化。如果其他人在比你开发的更快的计算机上运行你的游戏,你不希望游戏以双倍的速度运行。

纠正这种情况的方法是将使用的值乘以渲染最后一帧所用的时间。这是通过使用时间.deltaTime. 这有效地改变了每帧递增的任何变量的速度,从“每帧更改”到“每秒钟更改”,您可能应该对每帧递增或递减的任何值进行更改。

6.6音频源和监听器

既然我们已经讨论了如何创建、渲染和控制对象,那么让我们来谈谈计算机游戏可以提供的另一种意义:即声音。Unity支持两种声音:2D和3D声音。3D声音会根据距离的不同而改变音量,当它们相对于相机移动时会失真;2D声音则不会。

2D声音适用于画外音和背景音乐,3D声音适用于世界上发生的事件产生的声音。要更改声音是否为3D,请在项目视图中选择它,切换到inspector视图并从下拉菜单中选择相应的选项,然后按“重新导入”按钮。

为了实际播放声音,您需要将音频源附加到道具(在3D声音的情况下,您希望声音源自的道具)。然后您需要打开audioclip字段并选择您的声音文件。

你可以用myAudioSource。暂停()和我的音频源。播放()来控制这些声音文件。您可以在audiosource的inspector选项卡下调整声音的衰减行为、音量和多普勒频移。

6.7输入

一个不接受用户任何输入的游戏并不是什么游戏。有很多不同类型的输入可以读入,几乎所有的输入都可以通过input和KeyCode对象访问。下面是一些示例输入语句(每帧计算一个值)。

Vector3 mousePos = Input.mousePosition;bool isLeftClicking = Input.GetMouseButton(0);bool isPressingSpace = Input.GetKey(KeyCode.Space);

这些行的功能基本上是不言自明的。使用这三种输入参考,您可以重建大多数现代3D电脑游戏的控制方案。

6.8调试脚本

假设脚本不起作用。正如那位好医生所说,你可能会遇到麻烦。如果你的C#有明显的语法错误,当你点击play时,游戏通常会拒绝运行,如果你在编辑器中构建脚本,会提供一些相当有用的错误消息。见下表:

007Ys3FFgy1h1oi2ibx9lj31hc0u079r

这些bug通常不是最难修复的。更麻烦的是一些微妙的语义错误,在这些错误中,您成功地编写了一个充满有效C#的文件,而不是一个您所认为的那样的文件。如果你有这些错误中的一个,并且你很难追踪到它,有一些事情你可以尝试改善这种情况。

首先是暂停游戏的执行,并检查控制台。通过单击编辑器中上部的暂停图标,然后从窗口菜单底部选择c***ole(或按Ctrl&gt;Shift&gt;C),可以暂停游戏。即使没有错误,警告仍然有助于提供一些可能出错的线索。

如果这不起作用,您还可以尝试通过打印内部变量的状态来验证程序是否正在执行您认为它正在执行的操作,从而了解脚本的状态。你可以用调试日志(String)当程序执行到达某一行时,将字符串的内容打印到控制台。一般来说,如果你从你认为应该发生的事情到应该发生的事情进行逆向工作,最终你会达到一个点,你的调试打印没有做你期望他们做的事情。这就是你的错误所在。

7示例:脚本编写pong

为了打造乒乓球,让我们把游戏分解成它的核心元素:我们需要一个能在球拍之间以更快的速度来回弹跳的球,我们需要一个记分板,它能知道球何时通过球拍,我们需要一个机制,当球通过球拍时,它能重新启动。好的第一步是将非运动学刚体添加到球上,将两个运动学刚体添加到桨上,禁用所有刚体的重力,并从标准资源(bounce with bounce combine set to multiply)中指定适当的物理材质。

下面,您可以查看带有解释性注释的球的脚本。球需要完成一些基本的目标:它应该以一种复杂的模式反弹,始终保持两轴的运动,并且应该以一种富有挑战性但并非不可能的速度在水平方向加速。

BallHandler.cs公司

接下来,我们需要脚本我们的桨,你可以看到下面。拨杆需要上下移动以响应按键(但不能超出特定范围)。它还需要在与物体碰撞时触发粒子系统。

桨叶处理器.cs

下一步,我们需要敌人的人工智能:一种能使敌人的桨以固定速度向球移动的东西。为此,我们将使用Vector3.Slerp以获得最大的简单性。我们也希望我们在自己的桨上看到同样的粒子行为。

灌肠剂

最后,我们需要一个脚本来更新记分板,并在球出界时重置它。

记分板更新程序.cs

有了这些脚本和参考填写,当我们运行我们的乒乓球游戏,我们体验游戏!

007Ys3FFgy1h1oi2iyejwj31hc0u0t9v

你可以下载我的乒乓球演示,如果你想看到我在行动中概述的一切。它运行在Windows、Mac和Linux系统上。

8浏览文档/了解更多

Unity是一个复杂的引擎,它的特性远远超出了这种风格的指南所能涵盖的范围,而这还不包括internet上可用的大量(免费和商业)Unity扩展。本指南将为您开发游戏提供一个坚实的起点,但自我教育在任何努力中都是一项重要技能,在这里更是如此。

这里的一个关键资源是统一脚本引用。ScriptReference是一个可搜索的数据库,可供C#和Javascript使用,其中包含每个Unity命令和特性的列表,以及它们的功能描述和简短的语法示例。

如果您对Unity的编辑器和界面有问题,或者只是喜欢视频教程,那么有一长串高质量的Unity视频教程可用。CatlikeCode还提供了更广泛(但不太广泛)的Unity文本教程。

最后,如果您有超出文档或教程范围的问题,可以在答案.Unity3d网站。请记住答案是由志愿者提供的,所以请尊重他们的时间,首先搜索数据库,以确保您的问题尚未得到回答。

9构建游戏/编译到独立应用程序

当你建立了一些你引以为豪的东西(或者你已经完成了克隆我们略显躲闪的Pong示例的练习),是时候把你的游戏从编辑器中移开,变成你可以发布在互联网上,强迫你的朋友和家人玩的东西了。为此,您需要构建一个独立的应用程序。好消息是,在团结中,这非常,非常容易。然而,有一些潜在的呃逆,你要小心。

对于初学者,要知道您只能构建一个无错误的项目。为此,请确保在构建时打开控制台:在编辑器中,游戏将忽略一些错误条件,但仍将中止尝试的构建。这只会将错误消息转储到控制台,屏幕上没有可见的结果,如果忘记检查,这可能会令人沮丧。不过,一旦游戏编译没有错误,就可以在“文件”菜单下选择“构建设置”,或按Ctrl&gt;Shift键

>B.这将打开一个简单的对话框,允许您为多个平台构建游戏。

007Ys3FFgy1h1oi2jmtrdj31hc0u076l

从那里开始的过程是不言自明的:选择你的选项,点击build;游戏将提示你安装到一个目录,并将可执行文件和数据目录都放在那里。这两个文件可以压缩在一起并分发(只需确保您没有为Unity演示中构建的游戏收费,因为这违反了服务条款)。

10闭幕词

与任何游戏开发工具一样,Unity成功的关键是迭代开发。你必须以可管理的增量进行构建——无论如何,要有雄心壮志,但要把雄心壮志分成小块,并把这些小块安排好,这样,即使你没有达到最终的雄心壮志,你至少也会得到一个连贯的产品。

首先要了解最关键的要素:在头脑中要有一个想法,那就是你最简单可行的产品,你可能创造的最简单、最简单的东西,并且仍然觉得你取得了一些有价值的东西。在开始更大的雄心壮志之前,先做一个最低可行的项目。

本教程为您提供了一个强大的起点,但学习统一的最佳方法是构建一个游戏。开始建立一个游戏,填补你的知识空白,当他们出现的时候,知识的逐渐流动会侵蚀掉你不知道的东西。

如果您已经阅读了所有这些内容,并且对Unity所需的编码有点不知所措,请务必查看如何使用Unity learn学习游戏开发,并阅读我们关于如何在没有任何编程的情况下**视频游戏的指南。

Unity是一个强大的工具,稍加探索,您就可以用它更快地构建令人印象深刻的项目。让我们知道您在下面的评论中构建了什么--我们很乐意看到!

  • 发表于 2021-03-13 11:55
  • 阅读 ( 234 )
  • 分类:编程

你可能感兴趣的文章

寻找最好的编程语言?从这里开始!

...会的编程,而且Web开发社区非常庞大,因此我们认为它是初学者的一个好选择。 ...

  • 发布于 2021-03-12 12:24
  • 阅读 ( 297 )

ubuntu:初学者指南

...的各个方面是一个好主意,但是对于希望获得技术支持的初学者来说,Launchpad Answers是一个很好的起点。 ...

  • 发布于 2021-03-12 17:29
  • 阅读 ( 297 )

用unity编写游戏:初学者指南

...可以在Unity中使用的语言),那么请参阅我们的指南,为初学者提供六种最简单的编程语言。 ...

  • 发布于 2021-03-13 11:55
  • 阅读 ( 234 )

10个涉及编程或脚本的有益爱好

... 准备好潜水了吗?看看这些初学者项目的Arduino新手。 ...

  • 发布于 2021-03-14 18:18
  • 阅读 ( 265 )

如何用arduino和unity制作自定义游戏控制器

... 这些东西中的大多数都可以在Arduino初学者工具包中获得。如果你没有初学者工具包,请查看我们的指南,为你选择最好的。 ...

  • 发布于 2021-03-17 05:47
  • 阅读 ( 585 )

9个最好的代码游戏,以建立你的编程技能

...法来磨练你的编程能力?我们有一个很棒的学习C编程的初学者项目。您还可以通过收听这些面向程序员和开发人员的播客进一步受益。 ...

  • 发布于 2021-03-17 21:19
  • 阅读 ( 440 )

适合初学者的11个最佳树莓圆周率项目

... 这些Raspberry Pi初学者项目是对Pi的硬件和软件功能的一个很好的介绍。从其中一个开始,你马上就可以开始跑步了! ...

  • 发布于 2021-03-19 13:42
  • 阅读 ( 268 )

统一学习是掌握游戏开发最简单的方法

学习游戏的发展是一个漫长的过程。对于初学者来说,必须学习编程、资产操作和一个全新的编辑器的结合是压倒性的。 ...

  • 发布于 2021-03-19 21:05
  • 阅读 ( 252 )

7统一游戏开发语言学习:哪种最好?

...易于学习。Unity只是学习C#的众多好理由之一,如果你是初学者,你甚至会发现它更容易理解。开发游戏使学习更有条理,以项目为基础的目标使学生对新科目有更深入的了解。 ...

  • 发布于 2021-03-21 18:18
  • 阅读 ( 253 )

学习c#编程的7个实际原因

...言对新手来说更友好。C#编程是面向对象的,有些人认为初学者更容易理解。 ...

  • 发布于 2021-03-21 18:41
  • 阅读 ( 376 )