
案例学习是个查漏补缺的好方法,不去尝试永远也无法发现问题。
无论是T自形、口字形、一字型还是Z字形的方块,都可以用四个基本元素组成,可以利用unity自带的正方形sprite充当基本元素。

如图左所示
再创建一个空的gameobject(图中命名为I)作为各元素的父物体存储脚本组件。

ValidMove()函数用于检测元素是否在所设的范围内,如果在范围内则返回true,否则返回false,我这里设置的界面范围是width*height=10*20(基本元素为1*1)。
至于下落,则最好设置一个public属性的变量下落时间间隔fallTime和一个标记时间的变量previousTime,则有当Time.time - previousTime > fallTime时方块下落一定距离。Time.time表示从游戏开始经过的时间,previousTime则表示上次标记的时间,初始化为0,即自游戏开始后每隔fallTime时间就会触发一次方块下落。

在旋转功能中首先需要声明一个public属性的rotatePoint作为可控的旋转中心点,这是RoatteAround()所需要的第一个参数,其所需要的第二个参数是new Vector(0,0,1)表示一个向量作为轴来使用,第三个参数则是绕轴旋转的角度。

ValidMove()函数使用foreach循环不断对子物体进行位置检测并返回相应的bool值。前面的Move()函数与Fall()函数中也是在按下KeyCode的if逻辑下添加了ValidMove检测,并利用相反的向量进行抵消,从而达到了阻止方块越界的效果。

grid数组的声明
数组在俄罗斯方块的制作中真的是大有所为,存储各个元素的位置、检测一行的方块等等o(*≧▽≦)ツ。

注意,这串代码表示在当方块下落到底时(AddToGrid()函数被引用与Fall()函数中)将当前各元素位置存储进数组grid[width , height]。

我们从第零行逐次向上遍历,每一行又从左往右遍历从而判定元素是否排满一行达到消除条件。如果达成条件则Destroy物件,同时将已占据的grid设置为null以便重复使用。
其次便是进行一行消除后其余行的下落,这里行的转换其实使用了内外两次for循环,让我想起线性代数的矩阵变换o(一︿一+)o。由于前面的Destroy物件仅删除了物体,没有将grid信息进行覆盖或删除,所以在转换过程中需要重置grid信息为null。
好啦,这样一个简单的俄罗斯方块就完成啦!o(^▽^)oo(^▽^)oo(^▽^)o