Unity3d遊戲客戶端與Photon服務器數據通信

原文地址:blog.liujunliang.com.cn

上篇文章介紹到Photon服務器部署

本文在上一篇博文的基礎上繼續介紹使用Unity3d遊戲客戶端與Photon Server數據通信

打開Unity3d2017,新建項目,在Asset目錄下新建Plugins文件夾

找到Photon SDK目錄下的lib文件PhotonUnity3D.dll文件,將其拖動到Unity Plugins目錄下



新建一個腳本,這裏我命名爲GamContext,將其掛載到場景空對象中

using System.Linq;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using ExitGames.Client.Photon;

public class GameContext : MonoBehaviour,IPhotonPeerListener
{
    private PhotonPeer peer;

    public void DebugReturn(DebugLevel level, string message)
    {       
    }

    //接收服務器發來的事件
    public void OnEvent(EventData eventData)
    {
        switch (eventData.Code)
        {
            case 0:
                //獲取事件數據
                object value = eventData.Parameters.FirstOrDefault(q => q.Key == 1).Value;

                Debug.Log(value.ToString());

                break;
            default:
                break;
        }
    }

    //接收響應數據(客戶端發送了請求)
    public void OnOperationResponse(OperationResponse operationResponse)
    {
        int operationCode = operationResponse.OperationCode;
        switch (operationCode)
        {
            case 0:
                //讀取數據包
                Dictionary<byte, object> responsedata = operationResponse.Parameters;
                object value = responsedata.FirstOrDefault(q => q.Key == 1).Value;

                Debug.Log(value.ToString());
                break;
            default:
                break;
        }
    }

    //連接狀態發送改變
    public void OnStatusChanged(StatusCode statusCode)
    {
        Debug.Log("數據連接狀態發生的改變:" + statusCode);
    }

    private void Start()
    {
        //傳輸協議UDP 、 通過Listener接收服務器端的響應
        peer = new PhotonPeer(this, ConnectionProtocol.Udp);
        //連接本地服務器
        peer.Connect("127.0.0.1:5055", "MYGameServer");

        GameObject.Find("SendRequest").GetComponent<Button>().onClick.AddListener(()=> {

            //傳輸數據
            Dictionary<byte, object> myData = new Dictionary<byte, object>();
            myData.Add(1,"劉俊良");
            myData.Add(2, 20);

            //向服務器發送數據請求
            peer.OpCustom(0, myData, true);
        });
    }

    private void Update()
    {
        //和服務器實時保持數據連接
        peer.Service();    
    }

    private void OnDestroy()
    {
        if (peer != null && peer.PeerState == PeerStateValue.Connected)
        {
            //斷開連接
            peer.Disconnect();
        }
    }
}

同時在服務器端中的ClientPeer類中對數據請求函數進行修改

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Photon.SocketServer;
using PhotonHostRuntimeInterfaces;

namespace MyGameServer
{
    class ClientPeer : Photon.SocketServer.ClientPeer
    {
        public ClientPeer(InitRequest ir) : base(ir) { }

        //該客戶端斷開連接
        protected override void OnDisconnect(DisconnectReason reasonCode, string reasonDetail)
        {
            
        }

        //該客戶端出操作請求
        protected override void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters)
        {
            /*****解析客戶端請求數據*****/
            ReadRequestData(operationRequest);
            /****************************/

            /*****向客戶端發送響應*****/
            OperationResponse operationResponse = new OperationResponse();
            operationResponse.OperationCode = 0;
            //數據包
            operationResponse.Parameters = new Dictionary<byte, object> { { 1, "數據提交成功" } };
            //向客戶端發送請求響應
            SendOperationResponse(operationResponse, sendParameters);
            /**************************/

            /*****向客戶端發送事件*****/
            EventData eventData = new EventData(0, new Dictionary<byte, object> { { 1, "服務器事件" } });
            SendEvent(eventData, new SendParameters());
            /**************************/
        }

        private void ReadRequestData(OperationRequest operationRequest)
        {            
            int operationCode = operationRequest.OperationCode;
            switch (operationCode)
            {
                case 0:
                    Dictionary<byte, object> requestData = operationRequest.Parameters;
                    object value1 = requestData.FirstOrDefault(q => q.Key == 1).Value;
                    object value2 = requestData.FirstOrDefault(q => q.Key == 2).Value;

                    MyGameServer.LOG.Info("數據一:" + value1 + "數據二:" + value2);
                    break;
                default:
                    break;
            }
        }
    }
}



重新生成項目

打開PhotonServer,開啓MyGameServer

運行Unity3d,點擊按鈕,向服務器發送請求

此時Debug正常打印,查看MyGameServer.log日誌文件也正常輸出

這裏我總結了下客戶端與服務器端數據交互流程,如圖所示


原文地址:blog.liujunliang.com.cn


發佈了120 篇原創文章 · 獲贊 181 · 訪問量 41萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章