原文地址: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日誌文件也正常輸出
這裏我總結了下客戶端與服務器端數據交互流程,如圖所示