六邊形網(wǎng)格地形系統(tǒng)(上)

前言
今天給大家分享的是六邊形網(wǎng)格地形系統(tǒng)的原理和技術(shù)實現(xiàn)。大家如果聽過我們前面課程的話,會知道之前我還講過一個四邊形的網(wǎng)格地形系統(tǒng)。今天的六邊形網(wǎng)格地形系統(tǒng)屬于另外一種網(wǎng)格地形系統(tǒng),是很多策略或戰(zhàn)旗類游戲當(dāng)中非常常用的一種
版權(quán)聲明
本文為“優(yōu)夢創(chuàng)客”原創(chuàng)文章,您可以自由轉(zhuǎn)載,但必須加入完整的版權(quán)聲明
更多學(xué)習(xí)資源請加QQ:1517069595或WX:alice17173獲?。ㄆ髽I(yè)級性能優(yōu)化/熱更新/Shader特效/服務(wù)器/商業(yè)項目實戰(zhàn)/每周直播/一對一指導(dǎo))
點贊、關(guān)注、分享可免費獲得配套學(xué)習(xí)資源
給大家介紹一個非常經(jīng)典的例子。這個在你們心目當(dāng)中,六邊形地形系統(tǒng)一個經(jīng)典的游戲案例是什么呢?我相信很多同學(xué)都會認(rèn)同這個答案,就是《文明》系列
《文明》是一款什么游戲

4X,是指在策略游戲當(dāng)中的一種系統(tǒng)概念,得名自4個相同以ex為開頭的英語單詞
eXplore(探索):派出斥候橫跨游戲地圖以探索周邊的版圖
eXpand(拓張):建立新定居地或增加原定居地的影響力以擴(kuò)張領(lǐng)土
eXterminate(征服):攻擊并征服其他競爭對手
這個就是4X類型游戲的一個非常明顯的特征。4X策略游戲是目前SLG游戲里面一個重要的分支,究其原因不得不提到這個被稱為時光機(jī)器的游戲著作文明系列
文明系列誕生之初,游戲業(yè)還處于混沌初開的時候。文明在1991年時發(fā)行他的第一代。這個時候的游戲市場,當(dāng)談到回合制游戲,就會想到日式游戲和日本游戲公司。舉個例子來說,就像早期的日本國民RPG:勇者斗惡龍,后來的最終幻想,以及后來橫空出世的風(fēng)靡全球的寶可夢系列。這個時候的游戲玩家和廠商在腦子里面都會有一個定式,就是:回合制游戲的精髓就是RPG
4X策略游戲與RPG策略游戲分庭抗禮

1991年,文明世界誕生了。在文明世界里面有一個著名的口號叫做VENI VIDI VICI,即:“我來,我看見,我征服“。哪個玩家能夠拒絕在游戲世界里面成為凱撒大帝呢?因此,4X策略游戲開始逐漸的跟rpg策略游戲分庭抗禮
自文明系列誕生,收獲了一批忠實的粉絲,比如一位國外的玩家,他在玩文明時,因為一個殘局,他把一個存檔整整玩了十年。目標(biāo)就是為了在游戲當(dāng)中征服全世界!所以說4X類型的游戲,它的史實感是其他游戲所無法比擬的,這也是4X類型游戲它的最大的魅力所在
在很多的4X類型游戲的玩家口中,就會有這么一句話:天下財氣共十斗,文明獨占八斗,P社共和一斗,余者再分一斗
P社是策略游戲的主要開發(fā)商和發(fā)行商

只要提到4X類型游戲,那么除了文明以外,P社也是很重要的一個4X游戲的開發(fā)商和發(fā)行商。它旗下有很多款的策略游戲,并主要以策略游戲開發(fā)為主的,但是大部分都是歷史題材
群星

群星是P社旗下一款太空科幻策略游戲,可以在這個游戲里面探索巨大的星系,發(fā)起戰(zhàn)爭或者是通過外交行為來征服宇宙。這款游戲可以說是太空版的文明,這款游戲還可以支持steam創(chuàng)意工坊,大家可以找到其他玩家分享的各種mod
無盡帝國

無盡帝國它是一款幻想類的4X策略游戲,它是以一個神秘世界為舞臺主軸。歷史背景是,這顆星球逐漸的寒冷化,因而逐步面臨滅亡星球被各種派系所掌控。為了追求糧食產(chǎn)業(yè)科學(xué),魔術(shù)以及財富而掙扎無盡
無盡帝國具有獨特的一個戰(zhàn)斗系統(tǒng),你可以把游戲單位分配給軍隊,然后通過發(fā)出命令,讓軍隊沿著一個六邊形的游戲地圖來進(jìn)行移動。并且你也可以對他們發(fā)出各種各樣的戰(zhàn)斗指令
無盡帝國在去年的11月份也做了一個官方的中文更新,那么我們國內(nèi)的玩家也可以更好的去體驗到這款游戲
大型策略游戲為何多用六邊形地形系統(tǒng)

為何策略游戲多用六邊形地形系統(tǒng)?是因為文明系列的出現(xiàn),其他策略類游戲因此而跟風(fēng)?其實兩個最基本的原因:
方向選擇性更豐富。四邊形地形只有上下左右四個方向,而六邊形地形可以有六個方向
到每個方向的距離是相等的。四邊形地形,它可能會存在一個所謂的斜方向。比如一個四邊形的一個地形,它通常是一個九宮格的結(jié)構(gòu),那么到橫向的方向跟到斜向的方向,它行走的距離不一樣。而六邊形地形,它到每一個方向的距離是相等的
如何實現(xiàn)六邊形地形系統(tǒng)

Part 1:六邊形格子
Part 2:六邊形網(wǎng)格
Part 3:六邊形地形尋路
項目演示

這是一個項目演示,你可以在游戲當(dāng)中設(shè)置一些障礙,然后指定一個目標(biāo)點,那么這個游戲角色可以繞過這個障礙,去到達(dá)這個目標(biāo)點,這就是實現(xiàn)了六邊形地形系統(tǒng)的一個網(wǎng)格尋路
Part 1:六邊形格子

無論是做任何的地形系統(tǒng)或者寫任何的程序,首先都需要去定義好程序里面的數(shù)據(jù)結(jié)構(gòu)。就比如游戲里面的角色,我要定義好這個角色的數(shù)據(jù)結(jié)構(gòu)是什么樣的,它可能會包含這個角色的基本的姓名、ID號、所在門派、血值魔法值等
如何判定鼠標(biāo)是否位于六邊形格子內(nèi)

建立六邊形地形系統(tǒng),首先我們要知道這個地形系統(tǒng)里面的每一個格子是什么樣的。因此我們需要三個步驟,去實現(xiàn)這個目標(biāo)的判定:
Step 1:定義格子數(shù)據(jù)結(jié)構(gòu),并計算頂點位置
Step 2:判定鼠標(biāo)是否在六邊形包圍盒內(nèi)。六邊形包圍是六邊形的一個外框
Step 3:精確判定是否在六邊形四個角范圍內(nèi)

當(dāng)同時滿足在包圍盒內(nèi),又滿足在四個角的范圍內(nèi),那么就跟六邊形格子碰撞,若不在包圍盒范圍內(nèi),就不可能在這個四個角的這個范圍內(nèi),這樣就省略了第三步的判斷,可以提高六邊形判定的性能
Step 1:定義格子數(shù)據(jù)結(jié)構(gòu),并計算頂點位置

1.基本原理

我們通常把整個六邊形的寬和高定義為單位1大小。中心的點到左右邊界的距離等于半個包圍盒的大??;右上角upperRightCorner從中心點出發(fā)的高度quarterSize等于1/4包圍盒的大??;正上角upperCorner從中心點出發(fā)的高度等于1/2包圍盒的大??;其余點同理
2.定義六個頂點,并計算頂?shù)孜恢?/h1>
以正上角upperCorner為例,正上角實際上等同于中心點往上偏移,偏移的量是包圍盒大小的一半,等于半徑的大小,因此通過中心點坐標(biāo)加上往上偏移的量就能夠得到正上角坐標(biāo),偏移的量等于半徑大小的一倍。其他點坐標(biāo)的計算方式同理
注意,在unity當(dāng)中,地面是平躺在整個游戲世界里面的。對于unity而言,我們的頭頂方向代表y軸方向,而我們地面的橫方向代表它的x軸方向,縱方向代表它的z軸方向
3.補(bǔ)充所有頂點的位置


以正上角upperCorner為例,正上角實際上等同于中心點往上偏移,偏移的量是包圍盒大小的一半,等于半徑的大小,因此通過中心點坐標(biāo)加上往上偏移的量就能夠得到正上角坐標(biāo),偏移的量等于半徑大小的一倍。其他點坐標(biāo)的計算方式同理
注意,在unity當(dāng)中,地面是平躺在整個游戲世界里面的。對于unity而言,我們的頭頂方向代表y軸方向,而我們地面的橫方向代表它的x軸方向,縱方向代表它的z軸方向

4.測試輸出結(jié)果

Step 2:判定鼠標(biāo)是否在六邊形包圍盒內(nèi)

1.原理圖

我們的總體目標(biāo)是要判斷任何一個點是不是在六邊形的格子范圍內(nèi),因此首先第一步,先判斷任一點是不是在六邊形的外接包圍盒的范圍內(nèi)。通過簡單的方法去篩選掉那些根本就不在包圍盒范圍的點,這樣可以提高我們的判定效率
2.判斷是否在左右水平邊界內(nèi):

判斷鼠標(biāo)位置的X坐標(biāo),如果它小于六邊形右上角坐標(biāo)的X值又大于六邊形左上角坐標(biāo)的X值,那就說明這個點是在六邊形的外接四邊形的縱向范圍內(nèi),即X范圍內(nèi),因此可以將鼠標(biāo)渲染為綠色
除了要判斷鼠標(biāo)點是否在x值最小值和x值最大值范圍內(nèi),還要判斷鼠標(biāo)點是否在縱向方向的最小范圍和最大范圍以內(nèi)
2.1.補(bǔ)充代碼

訓(xùn)練營
由于代碼太多屏幕裝不下就不附上了,大家如果需要的話呢,可以參考我們的這個六邊形地形系統(tǒng)的訓(xùn)練營
那么我們的訓(xùn)練,老師會營通過三天的代碼實戰(zhàn),帶大家一步一步的去完成這個代碼的編寫,讓大家能看到每一步的具體的過程
在訓(xùn)練營當(dāng)中,我會給大家去做一個相關(guān)的六邊形地形系統(tǒng)的詳解,內(nèi)容是非常深入淺出的,包括后面一個具體的代碼實現(xiàn)。大家需要的話呢,可以加文末的Alice老師來了解我們的這個六邊形地形系統(tǒng)的訓(xùn)練營課程
Step 3:精確判定是否在六邊形四個角范圍內(nèi)

3.1 原理圖

因為左下角右下角判定方式都是基本上差不多的,所以以右上角為例,首先取得右上角這個點的一個坐標(biāo)和正上角的坐標(biāo),兩個點的坐標(biāo)相減得到藍(lán)色向量
我們需要有一條垂直于藍(lán)色向量的向量,因此將藍(lán)色向量逆時針偏轉(zhuǎn)90°得到綠色向量,在unity中需要調(diào)用ApplyRotationToVectorXZ這個方法實現(xiàn)對藍(lán)色向量的偏轉(zhuǎn)
假設(shè)鼠標(biāo)點在x位置,用鼠標(biāo)點位置減去右上角的位置得到紫色向量,只要判定紫色向量跟綠色向量,它們之間的夾角如果小于正負(fù)90度,那么它就是在右上角的這條線范圍以內(nèi)
我們可以通過點乘運算,算出來綠色向量,跟紫色向量,它們之間的夾角夾角是否小于正負(fù)90度,因為如果小于正負(fù)90度的話。那么它們的點乘值就是大于零的
3.2 代碼實現(xiàn)

我們還需要完成其他角的判斷,但是由于各個角的計算原理相同就不加贅述。當(dāng)你完成所有這些判定的時候,你就能夠精確的判定鼠標(biāo)是不是在六邊形的精選范圍以內(nèi)
寫在最后
更多學(xué)習(xí)資源請加QQ:1517069595或WX:alice17173獲取(企業(yè)級性能優(yōu)化/熱更新/Shader特效/服務(wù)器/商業(yè)項目實戰(zhàn)/每周直播/一對一指導(dǎo))
點贊、關(guān)注、分享可免費獲得配套學(xué)習(xí)資源