遊戲項目復現直接使用的是B站的up主-次元生還者的戰旗欄目
連結如下
https://www.bilibili.com/video/BV1uZ4y1W7rv
以下復現總結也按照up主的視頻分欄介紹,即
棋盤
棋盤部分即利用sprite直接ctrl+D複製,然後按住ctrl鍵平移即可
棋盤分為Cell(背景部分)和Block(障礙部分)兩類,通過添加兩個Tag區分,同理為了能夠實現滑鼠選中的功能,兩者都需要加上碰撞體Box Collider 2D。
注意:通過工具欄的Edit->Grid and Snap Setting->Increment Snap的Move選項可以修改平移的距離,默認為0.25,這裡修改成1。
Cell和Block組成地圖時,每個位置即非Cell即Block,不能出現Block和Cell重疊的情況,否則選中的單元要看排列的圖層順序。
滑鼠選中Cell後在控制臺輸出位置信息的代碼如下,使用預製件prefabs形式組成地圖的形式個人一開始感覺不太方便,不如TileMap來得快,於是使用TileMap的形式重新搭建了一遍地圖,不過在點擊輸出每個格子的位置時需要做轉化。
void OnMouseDown() { Debug.Log("Pressed " + this.tag + " At Position: " + transform.position.x + "," + transform.position.y); }棋子
棋子開始加入遊戲主角,首先戰旗策略遊戲的角色基本功能是點擊選中,顯示移動範圍,攻擊範圍,移動,攻擊,死亡。
對於點擊選中功能在棋子製作過程中同樣需要添加2D碰撞體,加入Piece標籤做作區分,對應攻擊死亡功能加入血量、最大生命值,攻擊和護甲。
注意:角色的Z位置設置為-1,否則在Cell和Piece重疊時無法正確選中Piece。
顯示移動範圍和攻擊範圍則需要利用Cell單元格加入兩個不同顏色表示的sprite來實現。
顯示移動範圍前需要先設置一個遊戲管理類GameManager來管理所有的Cell單元,同時Piece是疊加在某個Cell上的,對應位置的Cell通過設置同樣的playerNumber值可以表示為對應Piece下的Cell單元,這裡可以通過射線檢測的方式實現,同理顯示攻擊範圍同時需要設置對應Cell上的Piece在範圍內時要為attackable,也可以利用射線來獲取Cell上的Piece。
public void SetStandCell(bool _stand) { RaycastHit2D[] hits = Physics2D.RaycastAll(transform.position, Vector2.zero); foreach (var hit in hits) { if (hit.collider.CompareTag("Cell")) { if (_stand == true) { hit.collider.GetComponent<Cell>().playerNumber = playerNumber; cell = hit.collider.gameObject; } else { hit.collider.GetComponent<Cell>().playerNumber = 0; } } } }移動功能則利用GameManager的selected和顯示移動範圍時對範圍內所有單元格的可移動選項moveable設置為true結合做一個簡單的坐標切換。
攻擊功能稍微複雜些,在選中Piece對敵方Piece攻擊時需要選中敵方Piece,這時GameManager的selected就切換成了敵方Piece,那麼攻擊動作就無效了,會變成自己打自己的動作。這裡在GameManager中引入一個MainPlayer的標號表示對應回合的玩家編號,即可操作玩家編號。
死亡功能即在攻擊後判斷對應Piece血量是否小於等於0,這裡視頻中製作了一個簡單的粒子效果表示死亡炸裂效果,同時銷毀物體。
回合制
回合制即在GameManager中再加入一個NextPlayer的編號即可,每個回合只允許MainPlayer的move和attack,同時切換時交換MainPlayer和NextPlayer的編號,重置所有棋子的狀態,即攻擊狀態和已移動和已攻擊的表示。
回合制中判定遊戲結束條件可以為一方的所有棋子都被消滅,即GameManager中添加pieceCount的int數組記錄每個編號的Piece的數量,在銷毀Piece前,減去對應PlayerNumber的Piece,同時判斷剩餘的數量,小於0即輸出遊戲結束,一方勝利。
用戶界面
這塊是做角色Piece的屬性顯示部分的UI的
素材下載網址:https://kenney.nl/
首先中間部分的Turn End按鈕對應上部分的回合切換,這裡加入了一個UIManager類管理UI部分,回合切換就是GameManager原本的功能,另起一個接口調用即可。
兩邊的顯示包括血量、攻擊、護甲和移動範圍,直接根據Piece編號對應顯示即可。
同時視頻部分還加入了一個開始界面,這部分主要就是加入了一個場景加載的過程,用到了UnityEngine.SceneManagement
場景的索引可以在File->Build Setting中看到
優化
優化部分主要是音效的添加和動畫,這部分不作總結。
尋路
一個洪水算法,一個A-star算法,分別用來代替顯示移動範圍以及顯示移動路徑,具體原理如以下偽代碼部分。