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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值