深入了解方法(三)

从方法中得到返回值

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

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

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

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

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

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

  1. 在Monodevelop中打开LearningScript并准备修改。
  2. 在第12行,声明一个变量来接收结果。
  3. 在第19-23行,重新定义AddTwoNumbers()并给他一个返回值。
  4. 在第25-28行,定义DisplayResult()方法。
  5. 保存文件
  6. 点击Play
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的查询结果:

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()方法的。

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,012评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,628评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,653评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,485评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,574评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,590评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,596评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,340评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,794评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,102评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,276评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,940评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,583评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,201评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,441评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,173评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,136评论 2 352

推荐阅读更多精彩内容