总览
随着RogueLike游戏的火爆,基于像素和砖块(Tile)的游戏类型也再次兴起,而Unity也推出了他们官方的Tile工具——TileMap,但是TileMap默认的Tile是方形的,如果有些开发者(比如我)不想做类似于《节奏地牢》的方形砖块,而想做类似于《文明》或是《为了国王》的六边形地块,用Unity自带的TileMap该如何实现呢?
而Unity虽然足够强大,为我们准备好了六边形Tile的接口,但依然有很多需要注意的地方,想要将默认为方形的TileMap转化为六边形的TileMap,在目前最新的Unity版本(2018.3Beta)下,我们往往需要做以下修改:
- 将Grid中的Tile类型修改
- 根据需要修改Grid中Tile的大小
- 修改TileMap锚点的偏移量
1.更改Grid中的Tile类型
可能很多用过TileMap的同学都知道,当我们在一个场景中create一个TileMap节点出来的时候,Unity会自动帮我们生成一个Grid父节点和一个Tilemap子节点。
我个人的理解是外层的Grid主要是用于设置Tilemap的整个网格的相关属性,而内层的Tilemap主要是设置Tilemap在渲染时的相关属性,是和每个tile块息息相关的设置,而我们现在要调节的是网格单元的形状,那自然是要修改Grid的属性。而修改的内容也很简单,将Cell Layout这个下拉菜单改为Hexagon(六边形)就可以了。
在做完这一步修改后,你会发现Scene视图下的Tilemap网格已经变成了六边形的。
2.更改Grid中Tile的大小
但是如果你觉得这样就大功告成了,那你就错了,你会发现,把美工同学准备的正六边形的图片放进去之后,图片明显比网格单元在纵向上要长!这是为什么呢,原因是正六边形的格子长宽比不是像矩形格子那样显而易见,比如正方形就是1:1,而我们修改了Cell Layout之后,Unity并不会自动帮我们修改这个长宽比,所以我们需要简单的计算一下此时我们需要的长宽比是多少,比如正六边形如下图所示
所以在经过简单的四舍五入之后,我们把Grid中Tile的大小调成1:1.15就可以得到正六边形的格子了。
3.修改TileMap锚点的偏移量
实际上,这时候你如果去拿对应位置的单元格的位置,你会发现,拿到的数据不对,这是其实是因为Unity的Tilemap在转成六边形后因为未知原因需要将Tilemap中的Tile Anchor即锚点改成0,但是并不晓得什么原理,改成这样就对了
六边形模式下,每个砖块与相邻砖块的关系
在矩形模式下,想要确定一个砖块的相邻砖块是非常简单的,比如要找出与砖块(1, 1)相邻的8个砖块,我相信没有人不会,那就是(0, 0)、(0, 1)、(0, 2)、(1, 0)、(1, 2)、(2, 0)、(2, 1)、(2, 2)。
而如果说是六边形情况下的相邻砖块,因为底层也是用的矩阵存储的,但是相邻砖块却只有6个了,这让初次接触的读者可能有点摸不着头脑,所以这6个应该是哪6个呢,让我们来试一试不就好了!
让我们在基础的生成砖块的代码的基础上,在Update函数中加入如下代码:
```
if(Input.GetMouseButtonUp (0)){
Vector3 mousePositionInWorld = Camera.main.ScreenToWorldPoint(Input.mousePosition);
Debug.Log(tilemap.WorldToCell(mousePositionInWorld));
}
```
这样,如果读者已经按笔者之前说的三点调节好了Tilemap的属性的话,在点击界面的时候,在Unity的Console窗口中就会打印出我们当前点击的砖块在Tilemap中的坐标了,而从(1, 1)位置的格子左边那个格开始,顺时针点一圈,得到的打印结果是
让我们把它转化成矩阵的布局就是
所以我们只要把这6个偏移量设置为方向偏移,就可以在矩阵数据中正确取到六边形模式下的相邻格啦!!!然后很多小朋友就这么自信的去做了,结果发现得到的效果并不对,比如在实现用键盘控制角色的行走时,经常跳格!(比如笔者我)实际上是因为,这种六边形模式下的相邻格判断,实际上是分奇偶行的,而上面的这六个偏移,只适合y的坐标是奇数的情况下,比如(1, 1),而偶数的情况下,用相同的方法我们可以得到如下偏移量。
结语
好啦!!这样我们就可以在六边形的模式下完成所有在矩形模式下的工作啦!!
我是“玉轮爱玩”,这是我的第一篇技术分享博客,希望大家喜欢,有任何不足也非常希望大家可以告诉我!!
另外其实我也是个B站的知名啊噗主,搜“玉轮爱玩”就可以找到我的独立游戏开发日志啦!!
最后再宣一下群,欢迎大家加入我的小家庭——六点的影子(573228201)!!
暂无关于此日志的评论。