在前一章,你学习到了变量作用域——变量的存在和允许调用范围。这个作用域会被一对儿尖括号包裹住。这个尖括号的作用是将你的一段代码a block of executable code包裹起来使其变成一个代码段。在第二章的时候,你看到了方法就是一个代码段并且可以只通过方法名就可以调用。现在是时候来认清代码段和其中的变量的重要性了。实际上方法就是一段用尖括号包裹起来的代码段。
在本章节,我们将会了解方法的几个特征
- 用尖括号来结束方法
- 在代码中使用方法
- 正确地命名方法
- 调用方法
- 在方法中产生返回值
- 使用Unity中的
Update()
和Start()
方法
变量是C#中最主要的一块基石,方法其次,那么就让我们来了解方法。
使用尖括号来结束一个方法
在第三章的开始,你了解到了C#语句和使用分号来结束C#语句。那么方法会有一下不同的要求。
一个方法会像代码段一样被一对儿尖括号包裹。所以,不要使用分号来结束方法。
如果你偶然地使用了分号来结尾,Monodevelop会很乐意为你指出这个错误,告诉你不应该使用分号来作为方法的结尾。
在代码中使用方法
在代码中使用方法有两个原因:
- 为你的游戏对象提供行为。
- 使你的代码可以复用。
所有代码文件中的可执行代码均是方法。
方法的第一个工作目标就是来协同类中的成员变量。成员变量会存储组件所必须的数据来为游戏对象提供行为。所有你写代码的原因就是为了让你的游戏对象可以做一些有趣的事情。我们在方法中写的代码就是要让这些行为变成现实。
正确命名方法
永远为你的方法起一个有意义的名字。就像我解释变量那样,如果你不这么做,不出六个月……呃……你懂得。
为了让你方法可以使游戏对象变得有用,你需要给你的方法命名,就想告诉它“行动”一样。比如,跳过栅栏或者爬墙。当你看到方法名的时候你就会知道它将要干什么。
不要起太简略的名字,假设你起了一个叫Wiggle的名字。当然你现在知道Wiggle是什么意思(摇),但是六个月后你可能就会想“摇?摇什么?摇个J……”,命名只会消耗你一丁点的时间把它写的更加明了比如WiggleMyButt。那么,当你再看到这个方法的时候,你就会立马知道它的作用了。
用大写字母来为方法命名
为什么要这么做?我们需要用这个方式来将变量和类与方法区分。并且,微软也建议用大写字母来作为方法名的开头。如果其他的人来读你的代码时,他们可能会想到看到大写字母开头的方法名。
用多个单词来为方法命名
让我们再用一次这个例子
void AddTwoNumbers () { // Code goes here }
你可以看到,方法名是由三个单词组成的。当你开始写方法名的第一个单词时,你需要将它的首字母大写,后面的单词也一样。比如,PascalCasing。
圆括号是方法名的一部分
方法名经常会以圆括号作为结尾。他并不只是为了告诉你这是一个方法,它也会在你需要向方法内储存数据的时候起到关键的作用。
正确地定义一个方法
就像变量一样,我们需要在使用之前先让Unity了解到这个方法。
这取决于你在跟谁对话,有些人会说声明一个方法,另一些人会说定义一个方法。哪个是正确的呢?在C#中,这没有什么不同,挑一个让你容易理解的说法就好。我更喜欢说我定义一个方法,这样可以和我在语句中声明一个简单变量区分开。
定义方法所需要的必要元素
在你定义方法时候,你至少要遵循以下几点:
- 信息或数据的类别,方法会在你调用的时候将他们返回回来。
- 一个由圆括号结尾的方法名。
- 一对儿像下面一样的尖括号:
returnDataType NameOfTheMethod ( ) { }
让我们再回到LearningScript中,或者一些Unity中原生的代码文件,Start()
方法就拥有这些基本元素:
void Start () { }
那么我们得到了这些:
- 第一个要素是 信息或数据的类别,方法会在你调用的时候将他们返回回来。这个方法不会返回任何值,所以为了代替你需要生命的数据类型,这里使用了
void
。这就会告诉Unity这里不会返回任何值。 - 第二个要素就是方法的名称
Start()
。 - 最后一个要素就是尖括号,他会将方法内的行为包裹起来。
这个例子展现了方法所需要的最低要素。然而就像你看到的那样,方法中没有任何的代码,但是它仍然是一个方法。当然如果你不想使用Unity为你生成的这些基本方法,你可以删除他们。当你写完代码的时候,你也会将不会用到的代码删除掉,这是很常见的。
那么,当我们使用最低限度要素来定义方法时,Unity会这么解析:
- 没有public修饰符的时候,就意味着默认是
private
。所以,这个方法不会被其他的代码文件调用。 - 代码段中没有代码,意味着这个方法不会做任何事,如果我们愿意完全可以把它删掉。
了解圆括号——为什么他们要在那里?
首先一点,它们会让我们更加清晰地知道那是一个方法,但是为什么他是方法名的一部分呢?
我们已经知道,方法是一个可以复用的代码段。这就是我们需要定义方法的一个原因,不需要再一遍一遍地写相同的代码。回想第二章中的AddTwoNumbers()
方法。它是我们来解释方法调用的最简单的例子。所以,是时候来了解圆括号的作用了。
动手时间——在圆括号内书写代码
我们需要去修改LearningScript并向AddTwoNumbers()
方法内传入信息,以使得它更加有用。
为什么我们要向方法内传递信息呢?
代码可能需要重复地做相加操作,但很可能不会每次都使用相同的一对儿数字。我们也许有100多种需要相加的数字。这意味着我们需要让方法知道在我们调用它时我们需要相加的数字。
使用上图之前,先做以下几步:
- 在Monodevelop中打开LearningScript准备编辑。
- 在6、7、8行声明整型变量。
- 在22-26行之间,定义具有参数的
AddTwoNumbers()
方法。 - 在12、13、14行调用
AddTwoNumbers()
方法。 - 保存
- 点击Play
发生了什么?
在代码执行的时候,AddTwoNumbers()
方法被执行了三次。方法中的代码段将他们相加并输出在了Unity的Console中(观察下图中的黄箭头)。
这些圆括号就像个小房间。当我们调用AddTwoNumbers()
,一对儿数字就会进入这个小房间。当代码段执行的时候,他们就会将小房间内的这对儿数字取出来并且在24行使用它们。
具体声明方法的参数
当你去字典里查参数的意思时,你估计又要头疼了。这其实只是意味着方法需要使用你给它的一些信息来执行,所以你需要具体说明这些参数的数据类型。就是这样了,很简单。
在前面那个截图中,22行红箭头标注出了两个变量firstNumber
和secondNumber
。数据类型是int
,或者说integer
。那么再看一下红箭头标注的三个变量,number1
、number2
、number3
,他们也是int
类型。当我们向方法提供数字的时候,他们的类型也必须是int
,就像我们声明的那样。
所以让我们再回到字典。你可能会看到条件这个词。这也就是你声明参数类型的时候所做的一样,方法必须使用这个类型的参数,也就是你给它加了一些限制条件。
好的,所以你为方法添加了一些参数,限制条件,数据类型,但是参数究竟是什么?好吧,第一个参数是firstNumber
,那么它会做什么?他会存储我们将要在24行使用的数据。我们叫这些存储数据的东西什么呢?就是变量。变量无处不在
记住,变量名只是他所存储的数据的替代品
就像你在22行看到的那样,两数相加了。
方法可以含有多少个参数?
你可以尽可能地向方法提供参数。不过无论是在我们写方法,或者使用其他的方法时,我们只需要向他提供能保证它运行的参数就好了。