从方法中得到返回值
那么,现在是时候了解方法的一个强力特性了。这意味着向你前面学到的那样给方法传递参数,并从中获取返回值。之前你让AddTwoNumbers()所做的一切只是让两数相加然后输出在控制台中。
现在,为了代替直接显示出结果,你需要去改写AddTwoNumbers()
,并从调用方法的地方获取其返回值。
记住,当我告诉你去调用一个方法的时候,他只是去执行代码块中代码的一个替代品。就像是你把方法中的所有代码都搬过来一样。
下面的截图仍然非常简单,但是它展现了替代品的工作方式和返回值是如何工作的。
动手时间——从AddTwoNumbers中获取返回值
修改LearningScript去调用AddTwoNumbers()
两次,并获取一个结果。并且创建另一个方法去展示结果。
- 在Monodevelop中打开LearningScript并准备修改。
- 在第12行,声明一个变量来接收结果。
- 在第19-23行,重新定义
AddTwoNumbers()
并给他一个返回值。 - 在第25-28行,定义
DisplayResult()
方法。 - 保存文件
- 点击Play
发生了什么
就像你在下图中看到的一样,结果是14,然后你所需要学到的主要概念是:
- 当一个方法具有返回值的时候,他会像变量一样具有一个数据类型。
- 事实上,方法的返回值可以很容易的存储在变量中。
做以下几步来分析代码:
第10行的代码是这样的:
void Start()
Unity只会调用一次Start()
方法。第12行到第14行的代码描述是这样的:(注意:我只是为了截图方便所以把本应是一行的代码变成了三行。)
int answer = AddTwoNumbers(number1, number2) + AddTwoNumbers(number1, number3);
这几行代码就是为了把这几个数相加然后放到一个叫“answer”的变量里。
首先,他回去向19行方法AddTwoNumbers(number1, number2)
发起调用。
输入参数number1
和number2
会以2和3的形式传入第19行的方法中。第19行的方法描述如下:
int AddTwoNumbers(int firstNumber, int secondNumber);
整型数2和3会被分配给变量firstNumber
和secondNumber
。21行代码描述如下:
int result = firstNumber + secondNumber;
数字2和3会被相加并声明在变量内。22行代码描述如下:
return result;
保存在result内的整数5,会被返回到调用方法的12行。回到12行:
当你再看到AddTwoNumbers(number1, number2)
,现在已经被5所代替了。
现在,第12行会继续执行另一个调用AddTwoNumbers(number1, number3)
唯一的不同就是传入参数变了。
参数number1
和number3
将数字2和7传入了第19行的方法里。让我们再回到19行:
2和7被分配给了变量firstNumber
和secondNumber
。第21行的代码描述:
整数9,被返回到12行,调用方法的地方。让我们再一次回到12行:
当你再看到AddTwoNumbers(number1, number3)
,现在已经被9所代替了。
现在12行会继续执行。这里有一个加法符号,会将两个方法的返回值5和9相加在一起,所以现在变量answer内会保存一个值14。
Start()
方法会继续执行到16行。第16行代码如下:
DisplayResult(answer);
他会调用25行的DisplayResult()
方法。
他会接收一个参数。这个参数会使用存放着int
类型数据的answer变量。
参数answer传送整数14到25行的方法中。25行的代码:
void DisplayResult(int total)
整数14会被分配到变量total中。第27行代码如下:
Debug.Log("The grand total is: " + total);
这个输出到Console的数据带着从下一章内瞥到的一点东西。
一些包括存放在变量值在内的文本数据会被显示出来。
Unity的Console则会显示The grand total is: 14。
Start()
方法已经执行完毕。至此LearningScript中已经没有代码可以执行了,代码就结束了。
Have a go hero——将两个以上的数字加在一起
尝试修改12行的代码,再添加一个方法调用,将number2
和number3
加在一起。你将会获得额外的AddTwoNumbers()
结果。Console内的输出会是The grand total is: 24。
调用方法是一个逻辑的过程
就像你看到分析里的描述的那样,每次只会执行一步代码。然而,调用方法会让我们的执行顺序绕行。方法内的代码也会逐条执行直至结束。如果方法的返回类型是void,那么我们的执行顺序就又会回到我们调用方法的地方。如果方法具有一个返回值,那么这个值就会代替我们调用方法的地方,然后,代码会继续执行。
使用Unity中的Update和Start方法
每次当你创建Unity中的代码文件时,这两个框架代码就会生成,这当然是因为它们比较重要。这是最常使用的MonoBehaviour方法,看下面的截图。我喜欢叫他们Unity的魔术方法,因为如果你不去调用他们,Unity也会去调用他们。通常,需要保持至少一个MonoBehaviour方法来确保你的代码可以顺利执行。我说通常,因为你的方法可能只是会被别的代码文件里的方法调用。
我是怎么知道他们会被Unity调用并且是MonoBehaviour方法的呢?好的,代码参考是你的好伙伴
这只是Unity可调用的一部分方法。这只是代码参考中对MonoBehaviour的查询结果:
请看LearningScript的第四行:
public class LearningScript : MonoBehaviour
这行说明了LearningScript继承自MonoBehaviour。任何继承自MonoBehaviour的代码都会自动执行``Start()和Update()
,如果他们在你的代码里。所以,只要你愿意,你可以随时在你的类名后添加: MonoBehaviour
来创建一个继承自MonoBehaviour的类。
请注意冒号
Start方法只会执行一次
Unity只会调用一次这个方法。当游戏对象固定在了你的场景中时,Start()
就会被调用。这个方法主要被用在初始化,或加载你的成员变量。这些步骤都是为了使你的Update()
方法可以随时执行做准备。
你可能注意到了我用的所有例子都使用了LearningScript中的Start()
方法。这些例子并没有初始化任何代码,我只是利用了Start()
只会执行一次的特性让它来输出结果,因为只输出一次比较直观。
Update方法会被不断地执行
就像你在Scripting Reference中看到的一样,你可能会注意到,大部分代码都存在与Update()
中。当你的游戏运行的时候,这个场景可能会在一秒内变换多次。这就被叫做每秒帧数或者FPS。当每一帧被展示出来的时候,Update()
方法就会被Unity所调用。
当Update()
被每一帧调用的时候,他们会允许你的游戏来监听输入,比方鼠标点击或是键盘敲击,每一帧。用户的输入是我们要在下一章讲得话题。
小测验——了解方法的运行
- 方法的最低要素是什么?
- 方法名里的括号是做什么用的?
- void在定义方法的时候意味着什么?
- 在Unity中,
Update()
是如何被调用的?
总结
在本章中,我们学到了方法的定义是大括号中的代码段,不是以分号结尾。圆括号也是方法中的一部分。我们也学到了如何调用一个方法,如何使用返回值,以及当继承了MonoBehaviour时Unity是如何自动调用Start()
和Update()
方法的。
你现在学会了编写代码中两个重要的环节,变量和方法。从现在开始,你只需要学会或用它们。现在你已经了解了他们,是时候进入下一章来让你的代码做一下事了。