用Unity做半個2D戰棋小遊戲(三):新增對戰雙方
這次想要一個簡單且傳統的戰棋小遊戲,大概的玩法是:在2D世界裡建立一張由六邊形地塊組成的戰鬥地圖,敵我雙方依據體力在地圖上輪流行動並向對方發動攻擊,先消滅掉所有敵人的一方將獲得勝利。
預計將分為以下幾篇:
1、建立戰場
根據預定尺寸生成戰場地圖,並隨機一些障礙物。
2、新增戰場地圖功能
實現戰場格子點選反饋,地圖導航及範圍選定。
3、新增對戰雙方
向戰場中新增作戰單位,作戰單位按照一定規則輪流行動,可進行移動、攻擊等。
4、加入玩家控制
新增可以隨時顯示戰況的Hud、為作戰單位新增血條等。
5、新增常用的介面
建立介面管理器,加入一些常用的介面。
6、新增常用的戰場顯示
為戰鬥單位新增血條,加入傷害文字顯示。
7、擴充套件作戰單位
豐富作戰單位的型別,新增職業,並加入若干不同型別的技能。
8、擴充套件戰場地圖
豐富戰場地圖,加入地形及道具等元素。
9、規範戰鬥配置
可以通過規範化的資料結構配置戰場、職業、技能、道具等。
目標
向戰場中新增戰鬥單位,完成簡單的戰鬥迴圈,看起來的樣子是:
1、戰場中的對戰雙方輪流行動,可進行移動、攻擊;
2、攻擊將對敵人造成傷害;
3、沒有生命值的戰鬥單位會被從戰場中移除;
4、當一方被全部消滅時,戰鬥結束。
實現後的效果如下圖:
|準備工作
在開始之前,我們先做一些準備工作。
顯示格子座標
為格子新增Text Mesh Pro元件以顯示格子座標,方便除錯。
新增了座標顯示,除錯起來感覺方便多了呢
增加地圖功能:放置出生點
我不想看到戰鬥單位在剛進入戰場的時候是隨機擺放位置的,因此我需要為它們提供一些出生點。這樣當戰鬥單位初入戰場時,會向戰鬥地圖請求一個本方可用的出生點,如果請求成功則加入戰場,並設定在那個位置上;如果請求失敗則不會進入戰場,避免出現亂佔位置的情況。
想象中出生點的位置,最上、最下排奇數位置放置出生點
實際生成的情況(綠色為出生點)
增加地圖功能:尋找最近可用格子
指定一個起點和一個終點,返回一個環繞終點的距離起點最近、且可用的格子。這主要是為了戰鬥單位在確定攻擊目標後,需要選擇一個它身邊的格子作為移動的目標格子(目前假定所有戰鬥單位的攻擊半徑都為1)。
這裡選擇了一種比較偷懶的方法,就是將導航位置直接設定在目標單位的身上,如果導航成功,則將到達終點的前一個格子作為目標格子,這樣不僅確定了目標格子,同時還將導航路徑一併算出。
點選起點和終點進行測試(紅:起點,藍:終點,灰:障礙,青色:目標格子)
準備工作到此為止,下面開始加入戰鬥單位。
|新增戰鬥單位
因為是六邊形瓦片地圖組成的戰棋遊戲,因此我將戰鬥單位也表示成六邊形,目前來看兩者的Prefab並沒有什麼差別,通過設定Order值來確保戰鬥單位顯示在地圖格子的上方。
為了更好的區分戰場雙方戰鬥單位的差異,我們給它們設定不同的顏色。
雖然從顯示方式來看,戰鬥單位與地圖格子並沒有什麼差別,可是如果從資料角度出發,兩者的差別可就大了。為了更好的介紹戰鬥單位,讓我們從上至下來梳理一下整個戰場與戰鬥系統吧。
|戰場與戰鬥資訊
一個戰場就是一場完整的戰鬥。每一個戰場目前都包含三大部分:戰場地圖、對戰雙方以及戰鬥過程。
戰場地圖
地圖在之前的文章中已經做了說明,這裡不再贅述。
對戰雙方對戰雙方的單位是戰鬥組,這裡用戰鬥組編號區分各組,而不是僅用兩個列舉來簡單表示,是考慮到有很多組同時存在且同時對戰的情況。
真正發生戰鬥的被稱為戰鬥單位,每個戰鬥組由若干戰鬥單位組成。戰鬥資料、戰鬥組與戰鬥單位之間的關係如下圖。
戰鬥過程
戰鬥打響時,從兩個戰鬥組進入戰場,到雙方輪流移動、攻擊,最終分出勝負,發生的一切事情,都是戰鬥過程,這個後面會詳細說明。
|戰鬥的流程
戰鬥流程包含了戰鬥的核心邏輯,是戰鬥能正常進行且完成的規則,我們用下圖來描述一場戰鬥的基本流程。
|將資料與顯示分離
這裡還是採用了將資料與顯示分離的處理方法,先看一張資料處理的流程圖吧。
圖中很關鍵的一個內容是戰鬥過程資料,上面提及它其實是包含了自戰鬥單位進入戰場,到戰鬥最終完結之間的所有過程資料。
其實,當開始一場自動戰鬥時,戰鬥計算器會瞬時計算完整場戰鬥的過程及結果,但這些結果只是資料,並沒有呈現給玩家。
當我們需要把這場戰鬥呈現出來時,把這份資料傳遞給一個對應的顯示(播放)器即可。就好像後端和前端的分工一樣,一個負責產生資料,一個負責將資料呈現。
資料與對應的顯示器
戰鬥資料的顯示器
地圖格子顯示器
戰鬥單位顯示器
|順序分步呈現資料
我這裡使用協同函式(Coroutine)的巢狀來分步呈現戰鬥過程。
戰場顯示器開啟逐步呈現戰鬥過程(戰鬥單位的行動)
戰鬥單位顯示器根據自己的動作資料呈現具體動作,如:
進入戰場
選擇目標並移動(青色框:發動攻擊方,黃色框:攻擊方的目標)
選擇目標並攻擊(青色框:發動攻擊方,黃色框:被攻擊方)
|分離的意義
走吧,走吧,人總要學著自己長大。
人是這樣,資料也是。
其實直接使用一個繼承與MonoBehaviour的指令碼,把各種需要的資料都裝在裡面,直接掛在Prefab上,然後用一個控制器一邊算一邊呈現給玩家,實現起來非常容易。
但是,考慮到後臺可能有多場戰鬥同時在進行;且後期可以在短時間內進行多場戰鬥、收集資料來做戰鬥數值平衡。將資料分離,讓資料可以自行計算,就變得十分重要了。
20x20地圖下,10 vs 10的千場戰鬥結果計算,可以在很短的時間內完成
|寫在最後
至此,新增對戰雙方篇就介紹到這裡,詳細程式碼可以移步Github下載。
感謝您能讀到這裡。
願不忘初心。
下回見。
作者:/zt枸杞憂天
來源:騰訊遊戲學院
原地址:http://gad.qq.com/article/detail/288913
相關文章
- 用Unity做半個2D戰棋小遊戲(五):新增常用的介面Unity遊戲
- 用Unity做半個2D戰棋小遊戲(四):加入玩家控制Unity遊戲
- 從零點五開始用Unity做半個2D戰棋小遊戲(一)Unity遊戲
- 【Unity3D開發小遊戲】《戰棋小遊戲》Unity開發教程Unity3D遊戲
- 邊學邊做的第一個Unity小遊戲Unity遊戲
- 用Unity做個遊戲(二) – 事件系統Unity遊戲事件
- 用Unity做個遊戲(二) - 事件系統Unity遊戲事件
- unity 開發2D坦克大戰教程 系列二Unity
- 從零開始做一個SLG遊戲(三):用unity繪製圖形遊戲Unity
- XNA開發一個2D的小遊戲遊戲
- Unity3D 2D實戰遊戲開發Unity3D遊戲開發
- 用Unity做個遊戲(九) - 服務端架構Unity遊戲服務端架構
- 用 Java 做個“你畫手機猜”的小遊戲Java遊戲
- Unity 2D遊戲製作Unity遊戲
- 【Unity】(2D)物體拖拽Unity
- 一個把方陣做對稱變換的程式
- 用Unity做個遊戲(五) – 編輯器擴充套件Unity遊戲套件
- 用kotlin來實現一個打方塊的小遊戲Kotlin遊戲
- 51微控制器系列(三)51 微控制器遊戲設計 —— 雙人對戰小遊戲(石頭剪刀布)遊戲設計
- Unity資源Assetmport New Asset對話方塊Unity
- 用Unity做個遊戲(十) - 完結篇,內容補全Unity遊戲
- Qt 對話方塊新增工具欄QT
- [Unity3D] 2D畫素遊戲(一) Hello Unity!Unity3D遊戲
- 給應用程式新增“日積月累”對話方塊 (轉)
- 沒錯,用三方 Github 做授權登入就是這麼簡單!(OAuth2.0實戰)GithubOAuth
- 沒錯,用三方 GitHub 做授權登入就是這麼簡單!(OAuth2.0 實戰)GithubOAuth
- 《Unity 2D與3D手機遊戲開發實戰》簡介Unity3D遊戲開發
- 用Swoole來寫個聯機對戰遊戲呀!(三)完善遊戲功能遊戲
- 全雙工與半雙工技術解析及其應用場景
- 將雙11新增IT成本降低一半 阿里是咋做的?阿里
- 騰訊云為小遊戲開發者升級工具箱 小遊戲聯機對戰引擎免費用遊戲開發
- Unity中國開發者數已達350萬,新增發行業務聚焦中小遊戲Unity行業遊戲
- 用Unity做個遊戲(一) - 建立專案時需要注意的點Unity遊戲
- Python練習01-對戰小遊戲Python遊戲
- 用Python做一個三階拼圖。Python
- [ 邏輯鍛鍊] 用 JavaScript 做一個小遊戲 ——2048 (初級版)JavaScript遊戲
- [ 邏輯鍛鍊] 用 JavaScript 做一個小遊戲 ——2048 (詳解版)JavaScript遊戲
- 2遊+機戰戰棋遊戲有沒有搞頭,看看《鋼嵐》做的如何?遊戲