1. 程式人生 > >Unity 中服務端與客戶端的的程式碼Demo

Unity 中服務端與客戶端的的程式碼Demo

 http://blog.csdn.net/zhou_xw6511/article/details/8464157

在網路有些當中服務端負責資料的處理,和邏輯運算。客戶端僅僅是負責繪製服務端計算過後的影象下面想大家展示服務端和客戶端的程式碼:

/*
 * 簡單的網路遊戲程式碼
 * 
 *  功能:  server端程式碼
 *  時間:  2012.12.31
 *  開發:  Nick Zhou
 *   
 * 
 * 網路遊戲中的所有的的邏輯運算和資料處理,全部是由伺服器完成的,客戶端只負責繪製
 * 在客戶端中能看到自己和其他物體的變化
 * 
 */


using UnityEngine;
using System.Collections;

public class ServerGame : MonoBehaviour {

        private  int port=1000;  //埠號
        private string message = "";  //聊天的資訊
        private string MoveInfo = ""; //移動的資訊
         //滾動試圖的位置
        Vector2 scrollPosition;


 // Use this for initialization
 //支援中文;
    void OnGUI() 
    {
        //網路連線的狀態
        switch (Network.peerType) 
        {
            case NetworkPeerType.Disconnected:  //服務狀態未開啟
                 //開啟服務狀態
                StartServer();
                break;
            case  NetworkPeerType.Connecting:    //正在連線
                break;
            case NetworkPeerType.Server:    //成功連線至服務端
                OnServer();
                break;
            case NetworkPeerType.Client:     //成功連線至客戶端
                break;
        }
    }

    //建立伺服器
    void StartServer()
    {
        if (GUILayout.Button("建立本機伺服器"))
        {
            //建立本機伺服器,並允許最大10個客戶端連線
            NetworkConnectionError error = Network.InitializeServer(10, port, false);
            //如果連線失敗 將錯誤資訊打印出來
            Debug.Log("連線狀態:" + error);
        }
    }

    void OnServer() 
    {
        GUILayout.Label("伺服器建立完畢,等待客戶端連線");
        int leng = Network.connections.Length;
        Debug.Log(leng);
        for (int i = 0; i <leng; i++)
        {
            GUILayout.Label("連線伺服器客戶端Id" + i);
            GUILayout.Label("連線伺服器客戶端Ip" + Network.connections[i].ipAddress);
            GUILayout.Label("連線伺服器客戶端埠號" + Network.connections[i].port);
        }
        //斷開伺服器
        if (GUILayout.Button("斷開伺服器"))
        {
            Network.Disconnect();
            //重置聊天資訊
            message = "";
            MoveInfo = "";
        }
        //建立一個滾動試圖,用來顯示聊天資訊
        scrollPosition = GUILayout.BeginScrollView(scrollPosition, GUILayout.Width(200), GUILayout.Height(Screen.height));
        GUILayout.Box(message);
        //顯示玩家移動資訊
        GUILayout.Box(MoveInfo);
        GUILayout.EndScrollView();
    }

    //接收訊息
    [RPC]
    void RequestMessage(string Message,NetworkMessageInfo Info) {
        message += "\n" + "傳送者" + Info.sender + ":" + message;
    }


    //接收模型移動的訊息
    [RPC]
    void RequestMove(string message,NetworkMessageInfo Info) 
    {
        MoveInfo += "\n" + "移動者" + Info.sender + ":執行了" + message+"移動事件";
    }
}

客戶端程式碼:

/*
 * 簡單的網路遊戲程式碼
 * 
 *  功能:  client端程式碼
 *  時間:  2012.12.31
 *  開發:  Nick Zhou
 *   
 * 
 * 網路遊戲中的所有的的邏輯運算和資料處理,全部是由伺服器完成的,客戶端只負責繪製
 * 在客戶端中能看到自己和其他物體的變化
 * 
 */

using UnityEngine;
using System.Collections;

public class ClientGame : MonoBehaviour {

    //伺服器的Ip地址
    string Ip = "127.0.0.1";
     //埠
    int port = 1000;
     //輸入的資訊
    string inputMessage = "請輸入資訊";
     //接收到的資訊
    string ReMessage = "";
     //滾動的試圖位置
    Vector2 scrollpostion;
     
      //移動的速度
      float speed = 10.0f;
      //旋轉的速度
      float rocationSpeed = 100.0f;
      //主角控制模型
      GameObject cubeContral = null;
      //對方控制模型
      GameObject cubeUnContral = null;


 // Use this for initialization
 //支援中文;
 void Start () {
        cubeContral = GameObject.Find("Cube0");
        cubeUnContral = GameObject.Find("Cube1");

 }
 
 // Update is called once per frame
 void Update () {
 
 }
    void FixedUpdate() {
         
        //如果是客戶端
        if (Network.isClient)
        {
            float translation = Input.GetAxis("Vertical");
            float roation = Input.GetAxis("Herizontal ");
            if (translation==1)
            {
                //使用RPC傳送向前移動事件
                networkView.RPC("RequestMove", RPCMode.All, "up");
            }
            if (translation==-1)
            {
                //使用RPC傳送向後移動事件
                networkView.RPC("RequestMove", RPCMode.All, "down");

            }
            if (roation==1)
            {
                //使用RPC傳送向左旋轉事件
                networkView.RPC("RequestMove", RPCMode.All, "left");

            }
            if (roation==-1)
            {
                networkView.RPC("RequestMove", RPCMode.All, "right");
            }
        }
    }

    void OnGUI() 
    {
        switch (Network.peerType)
        {
            case NetworkPeerType.Client: //成功連線客戶端
                OnClient();
                break;
            case NetworkPeerType.Connecting: //正在嘗試連線
                break;
            case NetworkPeerType.Disconnected: //伺服器未開啟
                StartConnect();
                break;
            case NetworkPeerType.Server: //成功連線服務端
                break;
            default:
                break;
        }
    }

    void StartConnect() 
    {
        if (GUILayout.Button("加入遊戲"))
        {
            //客戶端開始嘗試連線伺服器
            NetworkConnectionError error = Network.Connect(Ip, port);
            //如果連線失敗。將錯誤資訊打印出來
            Debug.Log("連線狀態:" + error);
        }
    }

    void OnClient() {
      //建立一個滾動檢視,用來顯示聊天資訊
        scrollpostion = GUILayout.BeginScrollView(scrollpostion,GUILayout.Width(200),GUILayout.Height(500) );
        //顯示聊天資訊
        GUILayout.Box(ReMessage);
        //建立水平方向檢視
        GUILayout.BeginHorizontal();  
        inputMessage = GUILayout.TextArea(inputMessage); //編輯輸入的內容
        //傳送內容
        if (GUILayout.Button("傳送訊息"))
        {
            networkView.RPC("RequestMessage", RPCMode.All, inputMessage); //使用RPC傳送的內容
        }
        //接收水平方向檢視
        GUILayout.EndHorizontal();
        //斷開連線
        if (GUILayout.Button("斷開連線"))
        {
            Network.Disconnect(); //斷開連線
            ReMessage = "";  //歸零聊天資訊
        }
        GUILayout.EndScrollView(); //結束滾動檢視
    }

    //接收訊息
    [RPC]
    void RequestMessage( string message,NetworkMessageInfo Info) { 
       ReMessage+="\n"+"傳送者 "+Info.sender+":"+message;
    }
    //接收模型移動訊息
    [RPC]
    void RequestMove(string message,NetworkMessageInfo Info) 
    {
        string sender = Info.sender.ToString();
        GameObject moveObject = null;
        //自己移動事件
        if (sender == "-1")
        {
            moveObject = cubeContral;
        }
        else
        {
            moveObject = cubeUnContral;
        }
        //根據訊息判斷事件型別
        int vertical = 0;
        int horizontal = 0;

        switch (message)
        {
            case  "up":
                vertical = 1;
                break;
            case "down":
                vertical = -1;
                break;
            case "left":
                horizontal = 1;
                break;
            case "right":
                horizontal = -1;
                break;
            default:
                break;
        }

        //移動角色
        float translation = vertical * speed * Time.deltaTime;
        float rotation = horizontal * rocationSpeed * Time.deltaTime;
        moveObject.gameObject.transform.Translate(0, 0, translation);
        moveObject.gameObject.transform.Rotate(0, rotation, 0);
    }
}