2-1 计算相邻的地图单元的位置
上一章中我们完成了改变单个地图单元颜色的功能。但是通过观察可以发现,如果相邻的两个地图单元颜色不相同,他们之间的颜色过渡会显得非常的生硬。两者的对比效果如下图:
观察对比图可以发现,地图单元之间拥有颜色过渡后,视觉效果会更好一些。在接下来的部分,我们暂时将改变色时重新构建整个地图Mesh的问题放一边,重点放在视觉表现上面。
要想产生平滑的颜色过渡,我们首先需要知道每个地图单元与谁相邻,才可以得到相邻地图单元的颜色,进一步进行颜色的平滑过渡。在这里我们创建一个新的脚本,命名为HexDirection
,其中声明一个枚举,用来标识一个地图单元与其相邻的其他地图单元的方位。其分别为东北(NE)、东( E )、东南(SE)、西南(SW)、西(W)、西北(NW)。如下图所示:
1 | //表示相邻cell方位的枚举 |
关于枚举类型
MSDN连接
可以使用enum
关键字来定义枚举,是有名字的有序列表。这种类型的变量可以使用这些名称中的一个作为它的值,每个名称都对应一个数字,默认情况下从0开始。当你需要有限长度的可命名有序列表时,这些非常有用。
实际上枚举就是简单的整数。你可以对它们进行加、减操作,转换成整数再转回来。同样也可以转换成少数其他类型,但整数是其基本类型。
回到HexCell.cs脚本中,在开头部分添加一个数组,用来存储相邻地图单元的实例。这里将该数组设置为Private,并使用[SerializeField]
标记这个变量,使其能够在Inspector面板中显示出来。代码如下:
1 | public class HexCell : MonoBehaviour |
在这里,我们会保留相邻地图单元的引用,虽然可以通过坐标来直接获取相邻地图单元,但是在有引用关系的情况下会更加方便一些,而且保留引用关系在之后的一些操作中也很便利。
回到Unity中,选中Hex Cell的预置,我们可以看到neighbors变量已经显示在了Inspector面板上。因为每个地图单元最多可以有6个相邻地图单元。所以这里将neighbors数组的长度设置为6。效果如下:
接下来在HexCell.cs脚本中,创建一个公共方法,用来获取neighbors
数组中的内容。因为之前声明的HexDirection
枚举,其取值范围在0-5之间,同时neighbors
数组长度为6,所以这里不用检查数组下标是否越界。代码如下:
1 | public class HexCell : MonoBehaviour |
因为neighbors
数组为private,所以还需要一个将相邻地图单元实例赋值到数组中的一个方法。代码如下:
1 | public class HexCell : MonoBehaviour |
因为方位是相对的。例如一个地图单元A,其E方位的地图单元实例为B,那么也可以说A在B的W方位。如下图所示:
所以在获取自身相邻地图单元实例的时候,同时将自身加入其相邻单元格实例的neighbors
数组中。代码如下:
1 | public class HexCell : MonoBehaviour |
接下来,让我们到HexDirection.cs脚本中完成Oppositie()
方法。这个方法主要是将地图单元自身实例,添加到相邻地图单元neighbors
数组中的对应位置。代码如下:
1 | … |
什么是扩展方法?
MSDN连接
扩展方法是一个静态类中的静态方法,但使用起来像是某些类型的实例方法。这个类型可以是任何东西:自定义类、接口、结构体、原生数据结构或者是枚举。扩展方法的第一个参数之前必须有this关键字,它定义方法将操作的类型和实例的值。
这个特性允许我们在任何东西上添加方法,就像是静态方法的参数可以是任何类型。在有节制适量使用的情况下这个特性非常方便。但过度使用会造成代码结构的混乱。