您的位置:首页 > 移动开发 > Unity3D

Unity3d游戏客户端与Photon服务器数据通信

2017-10-20 16:37 176 查看

原文地址: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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息