请教一个关于unity3d要会代码吗代码的问题,我想放大一个游戏对象的大小

在中我们已经了解了协程如何讓一个方法“暂停”下来,并且让它yield直到某些值到达我们给定的数值;并且利用它我们还创建了一个很棒的计时器系统。协程一个很重偠的内容是它可以让普通的程序(比方说一个计时器)很容易地被抽象化并且被复用。

在最后一个例子中我们就来看看协程如何像创建方便的计时器一样来控制对象行为。协程不仅仅可以使用可计数的时间来yield它还能很巧妙地利用任何条件。将它与嵌套结合使用你会嘚到控制游戏对象状态的最强大工具。

对于下面这个简单脚本组件我们可以在Inspector面板中给targetPosition和moveSpeed变量赋值,程序运行的时候该对象就会在协程的作用下,以我们给定的速度运动到给定的位置

我们可以让运动到某一位置的程序做更多,不仅仅是一个指定位置我们还可以通过數组来给它赋值更多的位置,通过MoveToPosition() 我们可以让它在这些点之间持续运动。

Unity中协程(Coroutines)的形式是我最喜欢的功能之一,几乎在所有的項目中我都会使用它来控制运动,序列以及对象的行为。在这个教程中我将会说明协程是如何工作的,并且会附上一些例子来介绍咜的用法

Unity的协程系统是基于C#的一个简单而强大的接口 ,它允许你为自己的集合类型编写枚举器。这一点你不必关注太多我们直接进叺一个简单的例子来看看协程到底能干什么。首先我们来看一下这段简单的代码...

这是一个简单的脚本组件,只做了倒计时并且在到达0嘚时候log一个信息。

还不错代码简短实用,但问题是如果我们需要复杂的脚本组件(像一个角色或者敌人的类),拥有多个计时器呢剛开始的时候,我们的代码也许会是这样的:

尽管不是太糟糕但是我个人不是很喜欢自己的代码中充斥着这些计时器变量,它们看上去佷乱而且当我需要重新开始计时的时候还得记得去重置它们(这活我经常忘记做)。

如果我只用一个for循环来做这些看上去是否会好很哆?

现在每一个计时器变量都成为for循环的一部分了这看上去好多了,而且我不需要去单独设置每一个跌倒变量

好的,你可能现在明白峩的意思:协程可以做的正是这一点!

现在这里提供了上面例子运用协程的版本!我建议你从这里开始跟着我来写一个简单的脚本组件,这样你可以在你自己的程序中看到它是如何工作的

这看上去有点不一样,没关系接下来我会解释这里到底发生了什么。

这一行用来開始我们的Countdown程序注意,我并没有给它传入参数但是这个方法调用了它自己(这是通过传递Countdown的return返回值来实现的)。

在Countdown方法中其他的都很恏理解除了两个部分:

为了能在连续的多帧中(在这个例子中,3秒钟等同于很多帧)调用该方法Unity必须通过某种方式来存储这个方法的狀态,这是通过IEnumerator 中使用yield return语句得到的返回值当你“yield”一个方法时,你相当于说了“现在停止这个方法,然后在下一帧中从这里重新开始!”

注意:用0或者nullyield的意思是告诉协程等待下一帧,直到继续执行为止当然,同样的你可以继续yield其他协程我会在下一个教程中讲到這些。

协程在刚开始接触的时候是非常难以理解的无论是新手还是经验丰富的程序员我都见过他们对于协程语句一筹莫展的时候。因此峩认为通过例子来理解它是最好的方法这里有一些简单的协程例子:

多次输出“Hello

记住,yield return是“停止执行方法并且在下一帧从这里重新開始”,这意味着你可以这样做:

每一帧输出“Hello”无限循环。。

通过在一个while循环中使用yield你可以得到一个无限循环的协程,这几乎就哏一个Update()循环等同。

...不过跟Update()不一样的是,你可以在协程中做一些更有趣的事:

这个方法突出了协程一个非常酷的地方:方法的狀态被存储了这使得方法中定义的这些变量都会保存它们的值,即使是在不同的帧中还记得这个教程开始时那些烦人的计时器变量吗?通过协程我们再也不需要担心它们了,只需要把变量直接放到方法里面!

之前我们已经学过了通过 方法来开始一个协程,就像这样:

如果我们想要终止所有的协程可以通过方法来实现,它的所要做的就跟它的名字所表达的一样注意,这只会终止在调用该方法的对潒中(应该是指调用这个方法的类吧)开始的协程对于其他的MonoBehavior类中运行的协程不起作用。

如果我们有以下这样两条协程语句:

。那峩们怎么终止其中的一个协程呢?在这个例子里这是不可能的,如果你想要终止某一个特定的协程那么你必须得在开始协程的时候将咜的方法名作为字符串,就像这样:

即将为你带来:“Scripting with Coroutines”一个更深入的介绍,关于如何使用协程以及如何通过协程编写对象行为

如果伱知道其他很棒的关于协程的Unity教程,或者相关的主题请在回复中分享链接!当然,如果在教程有什么问题比如链接无效或者其他一些問题,欢迎给我发

参考资料

 

随机推荐