接上篇【Unity】瞎做个宝石迷阵吧!(1)——构建场景
我们在成功生成盘面后,来试试看让砖块交换吧。
首先我们在Bricks里加入这样几个变量
我们要利用这几个变量来控制砖块的交换,先来做砖块的动画效果。在Bricks的Update里将代码改成这个样子,我们所需object在每帧要做出的变换我们都要写在Update里,这里插入说一下Update系列函数。Update是每帧调用一次,FixedUpdate是每固定间隔时间调用一次(用于物理演算),LateUpdate是在每帧中接近最后的时候才进行调用。这里的_end变量是下次要用到的表示砖块消除用的变量,先声明着就好。
在Update里,Mathf.Lerp可以按比率平滑变化一个数,Vector3.MoveTowards可以平滑改变物体的坐标达到目的地,transform.Rotate可以让物体按设定的速率来旋转。
接着,我们要写几个函数方便其他类对这个类里的函数进行调用。在刚才上面我们写了 private Scene controller; 这一句,通过这句声明,我们就可以调用到特定的Scene类的公共函数了。
我们先在Bricks里面加入这样的代码。
这里的StartCoroutine中文名叫协程,是一种可以由时间,帧数等变量控制执行时间的子程序,常常用来做一些需要由计时来执行的操作。可以简单理解为自带一个计时器的函数。用好协程对Unity非常重要。这个协程我们待会会详细见到。这两个函数主要是控制砖块进入“被选择”状态。在被选择时,砖块会开始旋转表示,并发送自己的信息给我们的controller。当然,有被选择状态就也要有取消选择旋转的办法。我们再在Bricks加入以下两个小函数来停止旋转就好。
这里的control变量是用来控制整个Bricks运行的,也是常用的变量。
紧接着我们来看看这几个函数在Scene中的实现。先加入这两个变量到Scene中,在声明一个Boom函数。
这里和下面我们看到的IEnumerator便是协程函数的类型符。如下面的Choose函数,协程函数的必要返回值为 yield return new **** 。通过返回一个可表示时间的数值(waituntil也是一种)可以让这个函数运行到yield时,等待那个时间,然后再继续执行,从这一个协程看起来,有一点像我们C 中的System.Sleep()函数,都是等待的作用。协程非常有用,还是有必要详细看看的。
这个Choose函数我写的比较乱,不要在意。理论上,这些东西写完后再去运行游戏,应该可以看到我们可以让砖块相互交换了。然后下期(做个好梦)里再来说宝石的消除问题。
关于协程的一些东西:
- yield return null可以让协程只等待一帧
- StartCoroutine函数是立刻返回的,但是yield可以延迟结果。直到协同程序执行完毕。(官方解释)
- StartCoroutine中可以再嵌套一个yield return StartCoroutine,第一个StartCoroutine会等到第二个StartCoroutine中所有代码结束后再继续执行,这也是一种用法
- 协程也可以理解为一个小小的Update,在协程中也可以用Time.deltaTime,善用协程可以让程序的Update函数变得更简洁易懂(我这篇文章几乎都是范例hhh
- 下面简单给出Unity的简要生命周期顺序,熟记顺序才能解决一些莫名奇妙的bug哈哈哈