六边形网格地形系统(中)

前言
今天给大家分享的是六边形网格地形系统的原理和技术实现。大家如果听过我们前面课程的话,会知道之前我还讲过一个四边形的网格地形系统。今天的六边形网格地形系统属于另外一种网格地形系统,是很多策略或战旗类游戏当中非常常用的一种
版权声明
本文为“优梦创客”原创文章,您可以自由转载,但必须加入完整的版权声明
更多学习资源请加QQ:1517069595或WX:alice17173获取(企业级性能优化/热更新/Shader特效/服务器/商业项目实战/每周直播/一对一指导)
点赞、关注、分享可免费获得配套学习资源
完整文章合集
六边形网格地形系统 02-六边形网格
六边形网格地形系统 03-六边形地形寻路
Part 2:六边形网格系统

第一个部分当中,我们已经掌握了六边形格子的一个构成,以及如何判定鼠标是否在六边形格子范围以内
在unity中,鼠标和触摸点击是统一处理的,判断当前鼠标是否在某一个流动性的格子范围内,是最基本的要求,但是,现在不仅仅要判断鼠标是否在一个六边形格子范围内,还需要判断鼠标是否在由许多六边形格子组成的系统中
要把六边形的格子组成一个格子系统。这个格子呢,不是像四边形的格子一样,平均的去排布的。而是六边形的蜂巢状,错开的。
怎么样去判断鼠标是否点击在网格的某一个格子里面,而不仅仅是判断在某个格子的内部还是外部?
要判断鼠标点在这么多格子的内部还是外部,并且要求性能要足够的高。如果用第一部分的内容判断在一个格子内外的方法,它的性能代价是很高的,特别是当地形格子数量比较大时,代价是很高的,如何解决这个问题呢,这就需要涉及到六边形网格系统的内容:
六边形网格系统的组成
如何判定鼠标选中了哪一格
Step 1:重构四边形网格系统

我们不需要从头起步去编写我们的六边形的网格系统
由于早期我已经给大家去讲过四边形的游戏的网格建造系统,我们只需要在这个四边形的网格建造系统上面去做一些改进,就可以把我们的四边形的网格系统改造成六边形的网格系统
代码实现
把每个格子的数据结构从叫做GridHexXZ,就是六边形的意思。那么这就是六边形格子的的数据结构
每个六边形格子跟四边形格子是一样的,它也是由这个x坐标和z坐标构成的。那么相应的,我们还需要写一个六边形格子的测试脚本,那么同样的我要在这个测试脚本里面,把四边形格子的这个命名改成六边形格子的


Step 2:调整格子间的偏移值

错误的绘制效果

由于使用的是四边形的系统,格子绘制的位置是不正确的,所以还需要修改函数的实现,把它实现成匹配六边形的网格系统
图解

代码实现

Step 3:让选择的格子高亮

如果我们用之前四边形的网格系统,把鼠标移到我们的六边形的格子网格系统上面,你就会发现鼠标点点在的位置和高亮的格子不匹配
六边形网格系统,它的格子不像四边形一样,每一格都是等宽等高的,它会有偏移。所以不能直接用四边形的网格系统,我们仍然是需要做一些修改
在之前的四边形地形中,我们是根据格子在三维空间的坐标位置去计算,那么现在的我们要根据三维空间的鼠标位置去计算它是哪个格子
首先需要打开六边形格子的预制体,然后将它命名为selected,当它被选中的时候,修改它的材质变为绿色的材质,默认是白色材质
如果没有选中,那么我们就会把这个没被选中对象取消勾选,让它保持是白色

代码实现

Step 4:让鼠标位置和选中的格子匹配

由于六边形网格在横向和纵向上都进行了偏移,因此无法像四边形网格一样简单的计算鼠标坐标(3D World)和格子坐标的对应关系
这也是网格系统的难点所在
原理图

代码实现

首先通过前面这段代码,取得鼠标的位置
x坐标和z坐标构成一个roughXZ的一个变量,然后再去判断当前是奇数行还是偶数


roughXZ是鼠标当前所在的那个格子,然后通过下面这段代码去遍历所有的周围的六个格子,取得周围六个格子在世界空间当中的一个中心点坐标
计算鼠标位置跟六个格子的中心点的距离。如果它的距离是小于当前我记录的,鼠标中心点靠某个格子的最小距离,那就说明我的格子是在六边形上面的
完整代码

写在最后
更多学习资源请加QQ:1517069595或WX:alice17173获取(企业级性能优化/热更新/Shader特效/服务器/商业项目实战/每周直播/一对一指导)
点赞、关注、分享可免费获得配套学习资源