欢迎光临散文网 会员登陆 & 注册

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

2022-12-14 15:36 作者:独立游戏人-老雷  | 我要投稿

前言

今天给大家分享的是六边形网格地形系统的原理和技术实现。大家如果听过我们前面课程的话,会知道之前我还讲过一个四边形的网格地形系统。今天的六边形网格地形系统属于另外一种网格地形系统,是很多策略或战旗类游戏当中非常常用的一种

版权声明

  • 本文为“优梦创客”原创文章,您可以自由转载,但必须加入完整的版权声明

  • 更多学习资源请加QQ:1517069595或WX:alice17173获取(企业级性能优化/热更新/Shader特效/服务器/商业项目实战/每周直播/一对一指导)

  • 点赞、关注、分享可免费获得配套学习资源

  • 点击观看完整视频


完整文章合集


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特效/服务器/商业项目实战/每周直播/一对一指导)

  • 点赞、关注、分享可免费获得配套学习资源

六边形网格地形系统(中)的评论 (共 条)

分享到微博请遵守国家法律