用Unity做半個2D戰棋小遊戲(三):新增對戰雙方

遊資網發表於2019-03-12
寫在最前

這次想要一個簡單且傳統的戰棋小遊戲,大概的玩法是:在2D世界裡建立一張由六邊形地塊組成的戰鬥地圖,敵我雙方依據體力在地圖上輪流行動並向對方發動攻擊,先消滅掉所有敵人的一方將獲得勝利。

預計將分為以下幾篇:

1、建立戰場

根據預定尺寸生成戰場地圖,並隨機一些障礙物。

2、新增戰場地圖功能

實現戰場格子點選反饋,地圖導航及範圍選定。

3、新增對戰雙方

向戰場中新增作戰單位,作戰單位按照一定規則輪流行動,可進行移動、攻擊等。

4、加入玩家控制

新增可以隨時顯示戰況的Hud、為作戰單位新增血條等。

5、新增常用的介面

建立介面管理器,加入一些常用的介面。

6、新增常用的戰場顯示

為戰鬥單位新增血條,加入傷害文字顯示。

7、擴充套件作戰單位

豐富作戰單位的型別,新增職業,並加入若干不同型別的技能。

8、擴充套件戰場地圖

豐富戰場地圖,加入地形及道具等元素。

9、規範戰鬥配置

可以通過規範化的資料結構配置戰場、職業、技能、道具等。

目標

向戰場中新增戰鬥單位,完成簡單的戰鬥迴圈,看起來的樣子是:

1、戰場中的對戰雙方輪流行動,可進行移動、攻擊;

2、攻擊將對敵人造成傷害;

3、沒有生命值的戰鬥單位會被從戰場中移除;

4、當一方被全部消滅時,戰鬥結束。

實現後的效果如下圖:

用Unity做半個2D戰棋小遊戲(三):新增對戰雙方


|準備工作

在開始之前,我們先做一些準備工作。

顯示格子座標

為格子新增Text Mesh Pro元件以顯示格子座標,方便除錯。

用Unity做半個2D戰棋小遊戲(三):新增對戰雙方

新增了座標顯示,除錯起來感覺方便多了呢


增加地圖功能:放置出生點

我不想看到戰鬥單位在剛進入戰場的時候是隨機擺放位置的,因此我需要為它們提供一些出生點。這樣當戰鬥單位初入戰場時,會向戰鬥地圖請求一個本方可用的出生點,如果請求成功則加入戰場,並設定在那個位置上;如果請求失敗則不會進入戰場,避免出現亂佔位置的情況。

用Unity做半個2D戰棋小遊戲(三):新增對戰雙方

想象中出生點的位置,最上、最下排奇數位置放置出生點


用Unity做半個2D戰棋小遊戲(三):新增對戰雙方

實際生成的情況(綠色為出生點)


增加地圖功能:尋找最近可用格子

指定一個起點和一個終點,返回一個環繞終點的距離起點最近、且可用的格子。這主要是為了戰鬥單位在確定攻擊目標後,需要選擇一個它身邊的格子作為移動的目標格子(目前假定所有戰鬥單位的攻擊半徑都為1)。

這裡選擇了一種比較偷懶的方法,就是將導航位置直接設定在目標單位的身上,如果導航成功,則將到達終點的前一個格子作為目標格子,這樣不僅確定了目標格子,同時還將導航路徑一併算出。

用Unity做半個2D戰棋小遊戲(三):新增對戰雙方

點選起點和終點進行測試(紅:起點,藍:終點,灰:障礙,青色:目標格子)


準備工作到此為止,下面開始加入戰鬥單位。

|新增戰鬥單位

因為是六邊形瓦片地圖組成的戰棋遊戲,因此我將戰鬥單位也表示成六邊形,目前來看兩者的Prefab並沒有什麼差別,通過設定Order值來確保戰鬥單位顯示在地圖格子的上方

用Unity做半個2D戰棋小遊戲(三):新增對戰雙方


為了更好的區分戰場雙方戰鬥單位的差異,我們給它們設定不同的顏色。

用Unity做半個2D戰棋小遊戲(三):新增對戰雙方


雖然從顯示方式來看,戰鬥單位與地圖格子並沒有什麼差別,可是如果從資料角度出發,兩者的差別可就大了。為了更好的介紹戰鬥單位,讓我們從上至下來梳理一下整個戰場與戰鬥系統吧。

|戰場與戰鬥資訊

一個戰場就是一場完整的戰鬥。每一個戰場目前都包含三大部分:戰場地圖、對戰雙方以及戰鬥過程

戰場地圖

地圖在之前的文章中已經做了說明,這裡不再贅述。

對戰雙方對戰雙方的單位是戰鬥組,這裡用戰鬥組編號區分各組,而不是僅用兩個列舉來簡單表示,是考慮到有很多組同時存在且同時對戰的情況。

真正發生戰鬥的被稱為戰鬥單位,每個戰鬥組由若干戰鬥單位組成。戰鬥資料、戰鬥組與戰鬥單位之間的關係如下圖。

用Unity做半個2D戰棋小遊戲(三):新增對戰雙方

戰鬥過程


戰鬥打響時,從兩個戰鬥組進入戰場,到雙方輪流移動、攻擊,最終分出勝負,發生的一切事情,都是戰鬥過程,這個後面會詳細說明。

|戰鬥的流程

戰鬥流程包含了戰鬥的核心邏輯,是戰鬥能正常進行且完成的規則,我們用下圖來描述一場戰鬥的基本流程。

用Unity做半個2D戰棋小遊戲(三):新增對戰雙方


|將資料與顯示分離

這裡還是採用了將資料顯示分離的處理方法,先看一張資料處理的流程圖吧。

用Unity做半個2D戰棋小遊戲(三):新增對戰雙方


圖中很關鍵的一個內容是戰鬥過程資料,上面提及它其實是包含了自戰鬥單位進入戰場,到戰鬥最終完結之間的所有過程資料。

其實,當開始一場自動戰鬥時,戰鬥計算器會瞬時計算完整場戰鬥的過程及結果,但這些結果只是資料,並沒有呈現給玩家。

當我們需要把這場戰鬥呈現出來時,把這份資料傳遞給一個對應的顯示(播放)器即可。就好像後端前端的分工一樣,一個負責產生資料,一個負責將資料呈現


用Unity做半個2D戰棋小遊戲(三):新增對戰雙方

資料與對應的顯示器



用Unity做半個2D戰棋小遊戲(三):新增對戰雙方

戰鬥資料的顯示器



用Unity做半個2D戰棋小遊戲(三):新增對戰雙方

地圖格子顯示器



用Unity做半個2D戰棋小遊戲(三):新增對戰雙方

戰鬥單位顯示器


|順序分步呈現資料

我這裡使用協同函式(Coroutine)的巢狀來分步呈現戰鬥過程。

用Unity做半個2D戰棋小遊戲(三):新增對戰雙方


戰場顯示器開啟逐步呈現戰鬥過程(戰鬥單位的行動)

用Unity做半個2D戰棋小遊戲(三):新增對戰雙方


戰鬥單位顯示器根據自己的動作資料呈現具體動作,如:

用Unity做半個2D戰棋小遊戲(三):新增對戰雙方


進入戰場

用Unity做半個2D戰棋小遊戲(三):新增對戰雙方


選擇目標並移動(青色框:發動攻擊方,黃色框:攻擊方的目標)

用Unity做半個2D戰棋小遊戲(三):新增對戰雙方


選擇目標並攻擊(青色框:發動攻擊方,黃色框:被攻擊方)

|分離的意義

走吧,走吧,人總要學著自己長大。

人是這樣,資料也是。

其實直接使用一個繼承與MonoBehaviour的指令碼,把各種需要的資料都裝在裡面,直接掛在Prefab上,然後用一個控制器一邊算一邊呈現給玩家,實現起來非常容易。

但是,考慮到後臺可能有多場戰鬥同時在進行;且後期可以在短時間內進行多場戰鬥、收集資料來做戰鬥數值平衡。將資料分離,讓資料可以自行計算,就變得十分重要了。

用Unity做半個2D戰棋小遊戲(三):新增對戰雙方

20x20地圖下,10 vs 10的千場戰鬥結果計算,可以在很短的時間內完成


|寫在最後

至此,新增對戰雙方篇就介紹到這裡,詳細程式碼可以移步Github下載。

感謝您能讀到這裡。

願不忘初心。

下回見。


作者:/zt枸杞憂天
來源:騰訊遊戲學院
原地址:http://gad.qq.com/article/detail/288913

相關文章