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

来源:互联网 发布:沅有芷兮澧有兰 知乎 编辑:程序博客网 时间:2024/05/22 17:34

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



阅读全文
1 0
原创粉丝点击