搜索Unity

Unity中的C#代码适合初学者

您要开始学习Unity中的代码,这样就可以开始制作第一款游戏,但您不知道该从哪里开始。我们经过深思熟虑,推荐以下Unity中脚本元素和一些学习材料的详细目录,您可以使用这些资料来完成更高级的游戏,例如"Space Shooter"。这应该包括以下几个方面:编码的基础知识,例如变量、函数和类,以及如何使用它们。

如果您是一位经验丰富的工程师,则应该从这里开始,但不适合新的Unity工程师.

Unity中的脚本是什么?

脚本告诉GameObjects如何表现;它是附加到GameObjects的脚本和组件;它们如何互相交互,从而构建游戏玩法。现在,在Unity中编写脚本与纯编程不同。如果您已经完成一部分纯编程,例如已创建一个正在运行的应用程序,则应该知道在Unity中不需要创建运行应用程序的代码,因为Unity会创建这些代码。相反,您只需要专注于脚本中的游戏玩法。

Unity在一个大循环中运行。它读取游戏场景中的所有数据。例如,它通过光照或网格进行读取,读取数据采取的行为,并且它会处理所有这些信息。

如果想想电视,例如在北美为29.5帧/秒,Unity需要做同样的事情。它需要相继依次运行单个离散帧。您可以使用在脚本中编写的指令指导Unity,并且Unity会尽可能快地逐帧执行。

实现高帧率意味着不仅游戏看起来将更加流畅,而且脚本执行也会更频繁,从而使得控件的响应更加快速。

在Unity中可以使用哪些语言?

必须将脚本附加到场景中的GameObject才能被Unity调用。脚本应该使用Unity可以理解的语言编写。并且,我们可以通过该语言与引擎进行沟通并提供指令。

Unity中使用的语言称为C#(发音为C-sharp)。Unity使用的所有语言都是面向对象的脚本语言。与任何语言一样,脚本语言具有语法或词性,并且主要部分称为变量、函数和类。

如果您使用的是Unity 2017.3及之前的版本,就会注意到它包含一个名为MonoDevelop的文本编辑器:它可以帮助我们完成代码,如果我们编写的代码有错,它会告诉我们,并且允许我们采用快捷方式。从2018.1版开始,您还可以使用Visual Studio for Unity Community,或其他文本编辑器,例如Visual Studio、记事本或Sublime文本。

以下是包含一些示例代码的脚本(基于Unity中适合完全初学者的代码的教程):

sample code unity

如您所见,有变量、函数和类。

这些功能有什么作用?

变量保存值并引用对象(可以将对象看作是“更大的”变量)。变量就像一个装有供我们使用的东西的盒子。变量以小写字母开头。

函数是比较和操作这些变量的代码的集合。函数以大写字母开头。我们在函数中组织代码,以便可以在程序的不同部分轻松地多次重复使用它们。

是一种构造代码以将变量和函数的集合包装在一起的方法,以创建用于定义对象的属性的模板。

脚本主要是用于比较这些对象及其当前状态和值。它基于确定结果或解决方案的逻辑。

变量

在Unity中,脚本首先在顶部布局所需的工具,这通常是通过声明变量来实现。您可以看到声明变量在这里前面带有可见性关键字“public”或"private",后跟类型和名称。

variables in unity

当我们声明您的变量时,可以使用几种可见性类型,但最重要的是两种:public和private。

如果在代码编辑器中使用上述文本创建脚本,然后返回Unity并将脚本分配给GameObject,则可以访问并查看在Inspector中声明为公共变量的光照变量,但看不到私有变量。这是因为定义为“私有”变量的内容只能在此特定类中的该特定脚本中访问。

如果将其定义为公共变量,则可以访问其他脚本和其他类,并且可以在Unity编辑器的Inspector中进行更改。因此,这意味着其他用户可以访问并更改其值。

由于各种原因,既可以选择私有变量,也可以选择公共变量。私有变量可以让代码变得更清晰,因为这些变量的值只能在该类中更改。这使得调试和维护代码变得更容易。

如果选择“公共”变量并且遇到问题,则需要查看整个代码库以便跟踪源代码,因为任何其他对象都可以访问该变量。但是,如果希望对象在它们本身之间进行通信,则需要将一些变量(或函数)变成公开变量(或函数)。

变量的另一个重要方面是类型。类型定义在内存中保存变量的值的类型,例如它可以是数字、文本或更复杂的类型,如下图所示:下图中的Transform、Light和Demo Script实际上是对Components的引用。Unity需要知道对象的类型,以便知道如何进行处理。

variables in unity inspector

关于变量的另一个重要方面是名称。需要注意的是,命名变量不能以数字开头,并且不能包含空格。因此,编写名称有一种固定的格式。在C#中,命名约定采用camelCase形式:以小写字母开头,后接以大写字母开头的单词(不带空格),例如"myLight"。

当Unity编译脚本时,它会使公共变量在编辑器中可见。请参见Inspector中的下图。

demo script unity inspector

函数

脚本可以通过使用函数操作变量。Unity中包含许多可以自动运行的函数。请参见下文:

functions in unity

Awake只能在实例化具有该组件的GameObject时调用一次。如果GameObject处于非活动状态,则在使其变为活动状态之前不会调用。但是,即使GameObject处于活动状态但未启用组件(其名称旁边带有小复选框),也会调用Awake。您可以使用Awake初始化需要为其分配值的所有变量。

Start — 与Awake类似,如果GameObject处于活动状态,则会调用Start,但前提是已启用该组件。有关与Awake的区别的更多详细信息,请观看视频.

Update在每帧执行时调用一次。这是您放置代码以定义连续运行的逻辑的位置,如动画、AI和游戏中必须不断更新的其他部分。

FixedUpdate是您在执行物理工作时调用。

如您所见,还有FixedUpdate和Update函数,在我们的脚本教程部分中,您可以了解如何使用Update和FixedUpdate函数实现每帧的更改,以及它们之间的区别.

LateUpdate是类似于Update的函数,但LateUpdate是在帧结束时调用。Unity将查看所有游戏对象,查找所有Update,然后调用LateUpdate。该函数适用于某些组件,如摄像机。假设您要在游戏中移动角色,然后该角色被另一个角色偶然碰到并最终位于不同的位置。如果我们在与移动角色的同时移动摄像机,则会出现抖动,并且摄像机也不会出现在所需的位置。因此,基本上,该函数是非常方便的第二个循环。

编写函数

编写函数时,请记住函数以开始时函数的返回类型开头,后跟函数的名称,然后是用括号括起来的参数(如果有)。函数名称以大写字母开头,函数主体用大括号括起来。以下是关于如何编写函数的示例:

writing functions unity

我们如何调用此函数?

function-in-unity

函数可以进行计算,然后返回一个值。您可以要求函数执行某些操作,处理信息,然后返回答案。如果使用"void"类型,则函数不返回任何值。

类是这些变量和函数的集合。例如,此脚本是一个类:

class example in Unity

请记住,类名称必须与C#脚本的文件名匹配才能生效。然后,要将其附加到GameObject,它必须从首次创建脚本时自动放置在此的另一个名为MonoBehaviour的类派生。类也可以是公共类或私有类。

在Unity中,如果创建自定义类,如下例所示,则必须要求它序列化。这意味着它将转换为Unity可以在Inspector中查看的简单数据。执行转换操作时,可以看到拥有的类将出现在Inspector中。

classes in unity example

变量、函数和类只是在Unity中开始编写代码的基础知识。请参阅学习部分,可以找到一系列有用的脚本教程,帮助您从头开始学习编程,然后继续为项目创建详细的代码。