从零点五开始用Unity做半个2D战棋小游戏(二)
好久不見。
這是第18篇與游戲開發有關的文章。
| 寫在最前
這次想要一個簡單且傳統的戰棋小游戲,大概的玩法是:在2D世界里創建一張由六邊形地塊組成的戰斗地圖,敵我雙方依據體力在地圖上輪流行動并向對方發動攻擊,先消滅掉所有敵人的一方將獲得勝利。
預計將分為以下幾篇(調整后):
1、創建戰場 (已完成)
根據預定尺寸生成戰場地圖,并隨機一些障礙物。
2、添加戰場地圖功能
實現戰場格子點擊反饋,地圖導航及范圍選定。
3、添加對戰雙方
向戰場中添加作戰單位,作戰單位按照一定規則輪流行動,可進行移動、攻擊等。
4、添加戰場UI
添加可以隨時顯示戰況的Hud、為作戰單位添加血條等。
5、擴展作戰單位
豐富作戰單位的類型,添加職業,并加入若干不同類型的技能。
6、擴展戰場地圖
豐富戰場地圖,加入地形及道具等元素。
7、規范戰斗配置
可以通過規范化的數據結構配置戰場、職業、技能、道具等。
本次的主題是:添加戰場地圖功能。
| 目標
實現一些后面所需的操作地圖的基礎功能,如:
1、點擊戰場后高亮顯示被點中的格子;
2、點擊兩個位置實現從A到B的導航并在地圖上顯示路徑;
3、設定一個移動半徑,點中格子后顯示出可移動范圍。
實現后的效果如下圖:
點擊格子變紅
紅色向藍色導航(黃色為路徑,青色為探索過但沒有采用的格子)
半徑為2個單位的可移動范圍
| 點擊格子變紅
我采用的方法是:
1、獲取屏幕點擊位置的世界坐標,并將其轉換到格子的Root節點下;
2、用這個坐標推斷出點擊格子所在的行、列范圍;
3、遍歷這些推測格子的中心,找到距離最近的格子,即為點中的格子。
點擊屏幕后推斷的九個格子
| 調整地圖瓦片渲染器的位置
為了方便計算格子的位置,這里調整了瓦片渲染器的位置,保證它在地塊對象的中心,這樣在設置、獲取、計算坐標時,少一步轉換的操作,也更容易被理解。
調整后地塊對象坐標歸零時正好顯示為瓦片的中心
| 導航
這里采用的導航是A星算法,網上的介紹很多,就不再贅述了。在這只對六邊形地圖上兩格之間最短移動距離的計算做個簡單說明。
六邊形格子的路程計算
與四邊形地圖差別不大,六邊形地圖也可理解為先做行移動,再做列移動。但它的差異是:在做行移動的同時,其列也可以在一定范圍發生變化,因為它可以斜著走。
單元格坐標在僅計算行移動量的同時,列可移動范圍是一個三角形。
起始點所在奇、偶行的差別,對覆蓋三角形區域的計算是有影響的。
注:黑字表示格子的列,紅字表示當前格子與出發格子的列差值。
綜上,六邊形地圖下兩格子之間的最近路程可以理解為:從起始位置先縱向移動,如果移動到與目標同行,但是目標格子又不在可到達格子范圍內的話,再橫向移動若干單位即可,如圖:
需要注意的是,奇數、偶數行與首行是否“縮進”了半個格子有關。
| 調整數據結構
導航功能交給一個新的工具類:地圖導航器來完成,但是原來地圖中格子信息是直接保存在戰斗數據對象中,現在我將地圖數據從戰斗數據中拆分出來,便于導航器集中處理數據。
舊 戰斗數據的結構
新 戰斗數據結構
調用接口
| 根據半徑顯示可移動范圍
預設半徑顯示可移動范圍,也可轉換為二手手游賬號買賣平臺在進行行偏移的同時,求列覆蓋的最小和最大值。
如在計算移動半徑為2的覆蓋區域時,假設從中心點開始,推算下方的區域,本質上是:
1、行移動量為0時,覆蓋縱坐標偏移[-2~2]的區域。
2、行移動量為1時,覆蓋縱坐標偏移[-1,0] + [-1, 1]的區域,其中[-1, 2]為行移動量為1的格子覆蓋區間,[-1, 1]為再橫向移動一單位時的偏移增量。
3、行移動量為2時,覆蓋縱坐標偏移[-1, 1]的區域。
在計算偏移區域時,使用了上述提到的計算兩格子之間距離的方法。
| 寫在最后
至此,添加戰場地圖的基本功能篇就介紹到這里,詳細代碼可以移步Github下載。
感謝您能讀到這里。
愿不忘初心。
下回見。
總結
以上是生活随笔為你收集整理的从零点五开始用Unity做半个2D战棋小游戏(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从零点五开始用Unity做半个2D战棋小
- 下一篇: 从零点五开始用Unity做半个2D战棋小