[UNET]UNITY連線小遊戲(二){井字遊戲}

上一篇我們已經透過繼承使用UNET的CALSS來實作區網交換資訊,以達到聊天對話的功能,接下來就來加入一個簡單的井字遊戲,並且利用先前的對話框來拋出一些系統資訊吧。

場景準備

首先,要產生一個九宮格給我們使用,這部分的製作概念是每個格子我們當作是按紐,按下去就執行畫記。所以在外觀上欲呈現如下圖。
unet-20181116001
UI的結構部分接續上篇多建立一個GamePanel並放入9個按鈕,編號名稱命名為0~9這後續程式部分會使用到,按鈕的文字顯示用不到可以取消。
unet-20181116002
在GamePanel上掛載GridLayoutGroup元件,以面板1080高的情況去設記排版數據(Cell Size 300*300)和對齊方式,讓格子順利排列如上。
unet-20181116003
unet-20181116004
註:此處可以關閉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腳本欄位中。
unet-20181116006
unet-20181116007
unet-20181116005
確認後就可以先關閉這個GameOverPanel等待程式呼叫開啟。
 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *