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

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

4X,是指在策略游戏当中的一种系统概念,得名自4个相同以ex为开头的英语单词
eXplore(探索):派出斥候横跨游戏地图以探索周边的版图
eXpand(拓张):建立新定居地或增加原定居地的影响力以扩张领土
eXterminate(征服):攻击并征服其他竞争对手
这个就是4X类型游戏的一个非常明显的特征。4X策略游戏是目前SLG游戏里面一个重要的分支,究其原因不得不提到这个被称为时光机器的游戏著作文明系列
文明系列诞生之初,游戏业还处于混沌初开的时候。文明在1991年时发行他的第一代。这个时候的游戏市场,当谈到回合制游戏,就会想到日式游戏和日本游戏公司。举个例子来说,就像早期的日本国民RPG:勇者斗恶龙,后来的最终幻想,以及后来横空出世的风靡全球的宝可梦系列。这个时候的游戏玩家和厂商在脑子里面都会有一个定式,就是:回合制游戏的精髓就是RPG
4X策略游戏与RPG策略游戏分庭抗礼

1991年,文明世界诞生了。在文明世界里面有一个著名的口号叫做VENI VIDI VICI,即:“我来,我看见,我征服“。哪个玩家能够拒绝在游戏世界里面成为凯撒大帝呢?因此,4X策略游戏开始逐渐的跟rpg策略游戏分庭抗礼
自文明系列诞生,收获了一批忠实的粉丝,比如一位国外的玩家,他在玩文明时,因为一个残局,他把一个存档整整玩了十年。目标就是为了在游戏当中征服全世界!所以说4X类型的游戏,它的史实感是其他游戏所无法比拟的,这也是4X类型游戏它的最大的魅力所在
在很多的4X类型游戏的玩家口中,就会有这么一句话:天下财气共十斗,文明独占八斗,P社共和一斗,余者再分一斗
P社是策略游戏的主要开发商和发行商

只要提到4X类型游戏,那么除了文明以外,P社也是很重要的一个4X游戏的开发商和发行商。它旗下有很多款的策略游戏,并主要以策略游戏开发为主的,但是大部分都是历史题材
群星

群星是P社旗下一款太空科幻策略游戏,可以在这个游戏里面探索巨大的星系,发起战争或者是通过外交行为来征服宇宙。这款游戏可以说是太空版的文明,这款游戏还可以支持steam创意工坊,大家可以找到其他玩家分享的各种mod
无尽帝国

无尽帝国它是一款幻想类的4X策略游戏,它是以一个神秘世界为舞台主轴。历史背景是,这颗星球逐渐的寒冷化,因而逐步面临灭亡星球被各种派系所掌控。为了追求粮食产业科学,魔术以及财富而挣扎无尽
无尽帝国具有独特的一个战斗系统,你可以把游戏单位分配给军队,然后通过发出命令,让军队沿着一个六边形的游戏地图来进行移动。并且你也可以对他们发出各种各样的战斗指令
无尽帝国在去年的11月份也做了一个官方的中文更新,那么我们国内的玩家也可以更好的去体验到这款游戏
大型策略游戏为何多用六边形地形系统

为何策略游戏多用六边形地形系统?是因为文明系列的出现,其他策略类游戏因此而跟风?其实两个最基本的原因:
方向选择性更丰富。四边形地形只有上下左右四个方向,而六边形地形可以有六个方向
到每个方向的距离是相等的。四边形地形,它可能会存在一个所谓的斜方向。比如一个四边形的一个地形,它通常是一个九宫格的结构,那么到横向的方向跟到斜向的方向,它行走的距离不一样。而六边形地形,它到每一个方向的距离是相等的
如何实现六边形地形系统

Part 1:六边形格子
Part 2:六边形网格
Part 3:六边形地形寻路
项目演示

这是一个项目演示,你可以在游戏当中设置一些障碍,然后指定一个目标点,那么这个游戏角色可以绕过这个障碍,去到达这个目标点,这就是实现了六边形地形系统的一个网格寻路
Part 1:六边形格子

无论是做任何的地形系统或者写任何的程序,首先都需要去定义好程序里面的数据结构。就比如游戏里面的角色,我要定义好这个角色的数据结构是什么样的,它可能会包含这个角色的基本的姓名、ID号、所在门派、血值魔法值等
如何判定鼠标是否位于六边形格子内

建立六边形地形系统,首先我们要知道这个地形系统里面的每一个格子是什么样的。因此我们需要三个步骤,去实现这个目标的判定:
Step 1:定义格子数据结构,并计算顶点位置
Step 2:判定鼠标是否在六边形包围盒内。六边形包围是六边形的一个外框
Step 3:精确判定是否在六边形四个角范围内

当同时满足在包围盒内,又满足在四个角的范围内,那么就跟六边形格子碰撞,若不在包围盒范围内,就不可能在这个四个角的这个范围内,这样就省略了第三步的判断,可以提高六边形判定的性能
Step 1:定义格子数据结构,并计算顶点位置

1.基本原理

我们通常把整个六边形的宽和高定义为单位1大小。中心的点到左右边界的距离等于半个包围盒的大小;右上角upperRightCorner从中心点出发的高度quarterSize等于1/4包围盒的大小;正上角upperCorner从中心点出发的高度等于1/2包围盒的大小;其余点同理
2.定义六个顶点,并计算顶底位置

以正上角upperCorner为例,正上角实际上等同于中心点往上偏移,偏移的量是包围盒大小的一半,等于半径的大小,因此通过中心点坐标加上往上偏移的量就能够得到正上角坐标,偏移的量等于半径大小的一倍。其他点坐标的计算方式同理
注意,在unity当中,地面是平躺在整个游戏世界里面的。对于unity而言,我们的头顶方向代表y轴方向,而我们地面的横方向代表它的x轴方向,纵方向代表它的z轴方向
3.补充所有顶点的位置

4.测试输出结果

Step 2:判定鼠标是否在六边形包围盒内

1.原理图

我们的总体目标是要判断任何一个点是不是在六边形的格子范围内,因此首先第一步,先判断任一点是不是在六边形的外接包围盒的范围内。通过简单的方法去筛选掉那些根本就不在包围盒范围的点,这样可以提高我们的判定效率
2.判断是否在左右水平边界内:

判断鼠标位置的X坐标,如果它小于六边形右上角坐标的X值又大于六边形左上角坐标的X值,那就说明这个点是在六边形的外接四边形的纵向范围内,即X范围内,因此可以将鼠标渲染为绿色
除了要判断鼠标点是否在x值最小值和x值最大值范围内,还要判断鼠标点是否在纵向方向的最小范围和最大范围以内
2.1.补充代码

训练营
由于代码太多屏幕装不下就不附上了,大家如果需要的话呢,可以参考我们的这个六边形地形系统的训练营
那么我们的训练,老师会营通过三天的代码实战,带大家一步一步的去完成这个代码的编写,让大家能看到每一步的具体的过程
在训练营当中,我会给大家去做一个相关的六边形地形系统的详解,内容是非常深入浅出的,包括后面一个具体的代码实现。大家需要的话呢,可以加文末的Alice老师来了解我们的这个六边形地形系统的训练营课程
Step 3:精确判定是否在六边形四个角范围内

3.1 原理图

因为左下角右下角判定方式都是基本上差不多的,所以以右上角为例,首先取得右上角这个点的一个坐标和正上角的坐标,两个点的坐标相减得到蓝色向量
我们需要有一条垂直于蓝色向量的向量,因此将蓝色向量逆时针偏转90°得到绿色向量,在unity中需要调用ApplyRotationToVectorXZ这个方法实现对蓝色向量的偏转
假设鼠标点在x位置,用鼠标点位置减去右上角的位置得到紫色向量,只要判定紫色向量跟绿色向量,它们之间的夹角如果小于正负90度,那么它就是在右上角的这条线范围以内
我们可以通过点乘运算,算出来绿色向量,跟紫色向量,它们之间的夹角夹角是否小于正负90度,因为如果小于正负90度的话。那么它们的点乘值就是大于零的
3.2 代码实现

我们还需要完成其他角的判断,但是由于各个角的计算原理相同就不加赘述。当你完成所有这些判定的时候,你就能够精确的判定鼠标是不是在六边形的精选范围以内
写在最后
更多学习资源请加QQ:1517069595或WX:alice17173获取(企业级性能优化/热更新/Shader特效/服务器/商业项目实战/每周直播/一对一指导)
点赞、关注、分享可免费获得配套学习资源