上一篇我們已經透過繼承使用UNET的CALSS來實作區網交換資訊,以達到聊天對話的功能,接下來就來加入一個簡單的井字遊戲,並且利用先前的對話框來拋出一些系統資訊吧。
場景準備
首先,要產生一個九宮格給我們使用,這部分的製作概念是每個格子我們當作是按紐,按下去就執行畫記。所以在外觀上欲呈現如下圖。
UI的結構部分接續上篇多建立一個GamePanel並放入9個按鈕,編號名稱命名為0~9這後續程式部分會使用到,按鈕的文字顯示用不到可以取消。
在GamePanel上掛載GridLayoutGroup元件,以面板1080高的情況去設記排版數據(Cell Size 300*300)和對齊方式,讓格子順利排列如上。
註:此處可以關閉Image的顯示,需要背景則開啟。
SCRIPT程式
創建一隻程式UNETGame,並將它附加於GamePanel上,寫下要匯入的程式庫和列舉宣告如下。
using UnityEngine; using UnityEngine.UI; using UnityEngine.Networking; using UnityEngine.Networking.NetworkSystem; using System; public enum Player { Player1,Player2 }
接下來撰寫class和變數宣告,功能與職掌如下。
public class UNETGame : MonoBehaviour { public Player player;//玩家1P、2P的列舉 public bool turns;//攻守交換的布林判斷 public string[] marks = new string[9];//對應9個按鈕的標記記錄 public Image[] btnImages = new Image[9];//要產生變化的9個按鈕影像 public GameObject gameoverScreen;//遊戲結束時要顯示的畫面物件 public Text winText;//遊戲結束時要顯示的文字元件 public int count;//被劃記的格子總數 public int index;//按鈕序號變數 }
功能部分則分為網路功能和遊戲內功能,網路功能就和聊天一樣的寫法,只是改為通知用戶端哪一格被劃記,遊戲功能則是驗證是否產生勝負用。
網路功能
//網路功能 void Start () { //判斷是否是SERVER if (NetworkServer.active) { //註冊SERVER用的接口 NetworkServer.RegisterHandler(101, ServerReceiveMark); player = Player.Player1;//設定玩家1 } else { player = Player.Player2;//設定玩家2 } //註冊用戶端接口(接收訊息用的,注意不要使用和聊天用一樣編號) NetworkManager.singleton.client.RegisterHandler(101, ReceiveMark); } public void MarkIt(Image img)//發送標記 { if(img.color == Color.white) { StringMessage sm = new StringMessage(); sm.value = img.name;//取得按下的宮格UI的號碼(用名子轉換的),轉成網路格式 NetworkManager.singleton.client.Send(101, sm);//透過網管送出 } } void ReceiveMark(NetworkMessage netMsg)//用戶端接收 { string getMsg = netMsg.ReadMessage<StringMessage>().value;//接收到的網路訊息轉成一般字串 index = int.Parse(getMsg);//讀取按鈕編號轉為序號 btnImages[index].color = SetColor();//設定顏色 turns = !turns;//換手 } void ServerReceiveMark(NetworkMessage netMsg)//伺服器傳送 { StringMessage getMsg = new StringMessage();//創建一個網路訊息格式 getMsg.value = netMsg.ReadMessage<StringMessage>().value;//讀取從用戶傳來的訊息 NetworkServer.SendToAll(101, getMsg);//傳送給每個人 } //遊戲功能 Color SetColor() { count++;//標記總數增加 marks[index] = turns ? "X" : "O";//標記紀錄 Check(marks[index]);//確認該標記是否獲勝 return turns ? Color.red : Color.green;//交換手顏色判定 } void Check(string S)//勝負的9種情況8線1合局 { if (marks[0] == S && marks[1] == S && marks[2] == S) { Win(S + " WIN!!"); } else if (marks[3] == S && marks[4] == S && marks[5] == S) { Win(S + " WIN!!"); } else if (marks[6] == S && marks[7] == S && marks[8] == S) { Win(S + " WIN!!"); } else if (marks[0] == S && marks[3] == S && marks[6] == S) { Win(S + " WIN!!"); } else if (marks[1] == S && marks[4] == S && marks[7] == S) { Win(S + " WIN!!"); } else if (marks[2] == S && marks[5] == S && marks[8] == S) { Win(S + " WIN!!"); } else if (marks[0] == S && marks[4] == S && marks[8] == S) { Win(S + " WIN!!"); } else if (marks[2] == S && marks[4] == S && marks[6] == S) { Win(S + " WIN!!"); } else if (count == 9)//9格劃滿平手 { Win("GG"); } } void Win(string S)//遊戲結束畫面和勝負資訊 { winText.text = S; gameoverScreen.SetActive(true); }
最後製作一個遊戲結束畫面如下,並將Pancel和Text放到先前寫好的UNETGame腳本欄位中。
確認後就可以先關閉這個GameOverPanel等待程式呼叫開啟。