深入了解方法(三)

从方法中得到返回值

那么,现在是时候了解方法的一个强力特性了。这意味着向你前面学到的那样给方法传递参数,并从中获取返回值。之前你让AddTwoNumbers()所做的一切只是让两数相加然后输出在控制台中。

现在,为了代替直接显示出结果,你需要去改写AddTwoNumbers(),并从调用方法的地方获取其返回值。

记住,当我告诉你去调用一个方法的时候,他只是去执行代码块中代码的一个替代品。就像是你把方法中的所有代码都搬过来一样。

下面的截图仍然非常简单,但是它展现了替代品的工作方式和返回值是如何工作的。

动手时间——从AddTwoNumbers中获取返回值

修改LearningScript去调用AddTwoNumbers()两次,并获取一个结果。并且创建另一个方法去展示结果。

  1. 在Monodevelop中打开LearningScript并准备修改。
  2. 在第12行,声明一个变量来接收结果。
  3. 在第19-23行,重新定义AddTwoNumbers()并给他一个返回值。
  4. 在第25-28行,定义DisplayResult()方法。
  5. 保存文件
  6. 点击Play
深入了解方法(三)_第1张图片
LearningScript

发生了什么

就像你在下图中看到的一样,结果是14,然后你所需要学到的主要概念是:

  • 当一个方法具有返回值的时候,他会像变量一样具有一个数据类型。
  • 事实上,方法的返回值可以很容易的存储在变量中。
Console

做以下几步来分析代码:

  • 第10行的代码是这样的:
    void Start()
    Unity只会调用一次Start()方法。

  • 第12行到第14行的代码描述是这样的:(注意:我只是为了截图方便所以把本应是一行的代码变成了三行。)
    int answer = AddTwoNumbers(number1, number2) + AddTwoNumbers(number1, number3);
    这几行代码就是为了把这几个数相加然后放到一个叫“answer”的变量里。
    首先,他回去向19行方法AddTwoNumbers(number1, number2)发起调用。
    输入参数number1number2会以2和3的形式传入第19行的方法中。

  • 第19行的方法描述如下:
    int AddTwoNumbers(int firstNumber, int secondNumber);
    整型数2和3会被分配给变量firstNumbersecondNumber

  • 21行代码描述如下:
    int result = firstNumber + secondNumber;
    数字2和3会被相加并声明在变量内。

  • 22行代码描述如下:
    return result;
    保存在result内的整数5,会被返回到调用方法的12行。

  • 回到12行:
    当你再看到AddTwoNumbers(number1, number2),现在已经被5所代替了。
    现在,第12行会继续执行另一个调用AddTwoNumbers(number1, number3)
    唯一的不同就是传入参数变了。
    参数number1number3将数字2和7传入了第19行的方法里。

  • 让我们再回到19行:
    2和7被分配给了变量firstNumbersecondNumber

  • 第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行的代码,再添加一个方法调用,将number2number3加在一起。你将会获得额外的AddTwoNumbers()结果。Console内的输出会是The grand total is: 24

调用方法是一个逻辑的过程

就像你看到分析里的描述的那样,每次只会执行一步代码。然而,调用方法会让我们的执行顺序绕行。方法内的代码也会逐条执行直至结束。如果方法的返回类型是void,那么我们的执行顺序就又会回到我们调用方法的地方。如果方法具有一个返回值,那么这个值就会代替我们调用方法的地方,然后,代码会继续执行。

使用Unity中的Update和Start方法

每次当你创建Unity中的代码文件时,这两个框架代码就会生成,这当然是因为它们比较重要。这是最常使用的MonoBehaviour方法,看下面的截图。我喜欢叫他们Unity的魔术方法,因为如果你不去调用他们,Unity也会去调用他们。通常,需要保持至少一个MonoBehaviour方法来确保你的代码可以顺利执行。我说通常,因为你的方法可能只是会被别的代码文件里的方法调用。

我是怎么知道他们会被Unity调用并且是MonoBehaviour方法的呢?好的,代码参考是你的好伙伴

这只是Unity可调用的一部分方法。这只是代码参考中对MonoBehaviour的查询结果:

深入了解方法(三)_第2张图片
MonoBehaviour.png

请看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()被每一帧调用的时候,他们会允许你的游戏来监听输入,比方鼠标点击或是键盘敲击,每一帧。用户的输入是我们要在下一章讲得话题。

小测验——了解方法的运行

  1. 方法的最低要素是什么?
  2. 方法名里的括号是做什么用的?
  3. void在定义方法的时候意味着什么?
  4. 在Unity中,Update()是如何被调用的?

总结

在本章中,我们学到了方法的定义是大括号中的代码段,不是以分号结尾。圆括号也是方法中的一部分。我们也学到了如何调用一个方法,如何使用返回值,以及当继承了MonoBehaviour时Unity是如何自动调用Start()Update()方法的。

你现在学会了编写代码中两个重要的环节,变量和方法。从现在开始,你只需要学会或用它们。现在你已经了解了他们,是时候进入下一章来让你的代码做一下事了。

你可能感兴趣的:(深入了解方法(三))