Photon Server 实现注册与登录(三) --- 前端UI设计和发起请求
一、打开之前的测试项目。先将服务端代码编译一下,在 bin/Debug/目录下会发现有一个Common.dill。我们相应导入到前端使用。直接拖拽到相应地方
UI相应布局属于前端操作,这里就不做介绍了。详细查看视频:https://www.bilibili.com/video/av35109390/?p=70
二、代码处理:跟后端一样,前端发起请求的地方也会随着项目变大而变多,所以也得单独区分出每个请求独自管理。
Request.cs 请求基类
LoginRequest.cs 登录请求逻辑
RegiesterRequest.cs 注册请求连接
LoginPanel.cs 登录面挂载脚本
ReginsterPanel.cs 注册脚本挂载脚
三、调整PhotonManager.cs 管理类
(1)、添加字典,管理所以请求
private Dictionary<OperationCode,Request> ResquesDict = new Dictionary<OperationCode, Request>();
(2)、分配peer
public static PhotonPeer Peer { get { return peer; } }
(3)、添加两个函数,管理请求
public void AddRequest(Request rest) { ResquesDict.Add(rest.OpCode,rest); } public void RemoveRequest(Request rest) { ResquesDict.Remove(rest.OpCode); }
(4)、修改OnOperationResponse() 函数,实现接收服务端返回数据的分发
/// <summary> /// 客户端请求后,服务端响应,返回数据 /// </summary> /// <param name="operationResponse"></param> public void OnOperationResponse(OperationResponse operationResponse) { //服务端返回的code OperationCode opCode = (OperationCode)operationResponse.OperationCode; Request request = null; //根据code查找相应请求 bool tmp = ResquesDict.TryGetValue(opCode, out request); if (tmp) { //如果存在,分发给相应OnOperationResponse去处理自己的接收数据逻辑 request.OnOperationResponse(operationResponse); } else { Debug.Log("没找到响应处理对象"); } }
(5)、完整代码
using System; using System.Collections; using System.Collections.Generic; using System.Reflection.Emit; using Common; using UnityEngine; using ExitGames.Client.Photon; public class PhotonManager : MonoBehaviour,IPhotonPeerListener { //单例模式,保证只有一个链接服务器 public static PhotonManager Instance; private static PhotonPeer peer; private bool connected; private Dictionary<OperationCode,Request> ResquesDict = new Dictionary<OperationCode, Request>(); public static PhotonPeer Peer { get { return peer; } } private void Awake() { if (Instance == null) { Instance = this; DontDestroyOnLoad(this.gameObject); }else if (Instance != this) { Destroy(this.gameObject); return; } } // Start is called before the first frame update void Start() { Debug.Log("111------开始连接----"); peer = new PhotonPeer(this, ConnectionProtocol.Udp); peer.Connect("127.0.0.1:5055","MyGame1"); connected = false; } // Update is called once per frame void Update() { Debug.Log("update------" + connected); peer.Service(); } private void OnDestroy() { if (peer != null && peer.PeerState == PeerStateValue.Connected) { peer.Disconnect(); } } public void DebugReturn(DebugLevel level, string message) { } /// <summary> /// 客户端请求后,服务端响应,返回数据 /// </summary> /// <param name="operationResponse"></param> public void OnOperationResponse(OperationResponse operationResponse) { //服务端返回的code OperationCode opCode = (OperationCode)operationResponse.OperationCode; Request request = null; //根据code查找相应请求 bool tmp = ResquesDict.TryGetValue(opCode, out request); if (tmp) { //如果存在,分发给相应OnOperationResponse去处理自己的接收数据逻辑 request.OnOperationResponse(operationResponse); } else { Debug.Log("没找到响应处理对象"); } } /// <summary> /// 连接状态发生改变时 /// </summary> /// <param name="statusCode"></param> public void OnStatusChanged(StatusCode statusCode) { Debug.Log("serStatus-----" + statusCode.ToString()); switch (statusCode) { case StatusCode.Connect: connected = true; break; default: connected = false; break; } } /// <summary> /// 服务端直接给客户端数据时,不需要向服务器请求 /// </summary> /// <param name="eventData"></param> public void OnEvent(EventData eventData) { switch (eventData.Code) { case 1: break; case 2: break; default: break; } } public void AddRequest(Request rest) { ResquesDict.Add(rest.OpCode,rest); } public void RemoveRequest(Request rest) { ResquesDict.Remove(rest.OpCode); } }
四、请求类
(1)、Request.cs 基类
using System; using Common; using ExitGames.Client.Photon; using UnityEngine; public abstract class Request: MonoBehaviour { //定义请求code public OperationCode OpCode; public abstract void DefaultRequest(); //发送请求 public abstract void OnOperationResponse(OperationResponse operationResponse); //接收返回的数据 public virtual void Start() { //从管理类中添加该请求 PhotonManager.Instance.AddRequest(this); } public void OnDestroy() { //从管理类中移除该请求 PhotonManager.Instance.RemoveRequest(this); } }