Unity进阶–通过PhotonServer实现联网登录注册功能(客户端)–PhotonServer(三)

文章目录

Unity进阶--通过PhotonServer实现联网登录注册功能(客户端)--PhotonServer(三)

前情提要

  • 单例泛型类

    csharp 复制代码
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class MyrSingletonBase<T> : MonoBehaviour where T : MonoBehaviour
    {
        private static T instance;
        public static T Instance {
            get
            {
                return instance;
            }
        }
    
        protected virtual void Awake() {
            instance = this as T;
        }
    
        protected virtual void OnDestroy() {
            instance = null;
        }
    }
  • ManagerBase

    csharp 复制代码
    using System.Collections;
    using System.Collections.Generic;
    using Net;
    using UnityEngine;
    
    public abstract class ManagerBase : MyrSingletonBase<ManagerBase>
    {
       public List<MoonBase> Monos = new List<MoonBase>();
    
       public void Register(MoonBase mono){
        if (!Monos.Contains(mono)){
            Monos.Add(mono);
        }
       }
       
       public virtual void ReceiveMessage(Message message){
        if (message.Type != GetMessageType()){
            return;
        } 
        foreach (var mono in Monos){
            mono.ReceiveMessage(message);
        }
       }
    
       
       public abstract byte GetMessageType();
    }
    • 消息中心

      csharp 复制代码
      using System.Collections;
      using System.Collections.Generic;
      using Net;
      using UnityEngine;
      
      public class MessageCenter : MyrSingletonBase<MessageCenter>
      {
          public static List<ManagerBase> Managers = new List<ManagerBase>();
      
          public void Register(ManagerBase manager){
              if (!Managers.Contains(manager)){
                  Managers.Add(manager);
              }
          }
      
          public void SendCustomMessage(Message message){
              foreach(var manager in Managers){
                  manager.ReceiveMessage(message);
              }
          }
      
          public static void SendMessage(Message message){
               foreach(var manager in Managers){
                  manager.ReceiveMessage(message);
              }
          }
      }
      • manager下的组件基础

        csharp 复制代码
        using System.Collections;
        using System.Collections.Generic;
        using Net;
        using UnityEngine;
        
        public class MoonBase : MonoBehaviour
        {
            public virtual void ReceiveMessage(Message message){
                
            }
        }
      • uiManager(绑在canvas上)

        csharp 复制代码
        using System.Collections;
        using System.Collections.Generic;
        using Net;
        using UnityEngine;
        
        public class UiManager : ManagerBase
        {
            void Start()
            {
                MessageCenter.Instance.Register(this);
            }
        
          public override byte GetMessageType()
            {
                return MessageType.Type_UI;
            }
            
        }
  • PhotonManager

    csharp 复制代码
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using ExitGames.Client.Photon;
    using Net;
    
    public class PhotonManager : MyrSingletonBase<PhotonManager>, IPhotonPeerListener
    {
        private  PhotonPeer peer;
        
        void Awake() {
            base.Awake();
            DontDestroyOnLoad(this);
        }
        // Start is called before the first frame update
        void Start()
        {
            peer = new PhotonPeer(this, ConnectionProtocol.Tcp);
            peer.Connect("127.0.0.1:4530", "PhotonServerFirst");
        }
    
        void Update()
        {
            peer.Service();
        }
    
        private void OnDestroy() {
            base.OnDestroy();
            //断开连接
            peer.Disconnect();    
        }
    
        public void DebugReturn(DebugLevel level, string message)
        {
    
        }
    
        /// <summary>
        /// 接收服务器事件
        /// </summary>
        /// <param name="eventData"></param>
        public void OnEvent(EventData eventData)
        {
            //拆包
            Message msg = new Message();
            msg.Type = (byte)eventData.Parameters[0];
            msg.Command = (int)eventData. Parameters[1];
            List<object> list = new List<object>();
            for (byte i = 2; i < eventData.Parameters.Count; i++){
                list.Add(eventData.Parameters[i]);
            }
            msg.Content = list.ToArray();
            MessageCenter.SendMessage(msg);
        }
    
        /// <summary>
        /// 接收服务器响应
        /// </summary>
        /// <param name="operationResponse"></param>
        public void OnOperationResponse(OperationResponse operationResponse)
        {
            if (operationResponse.OperationCode == 1){
                Debug.Log(operationResponse.Parameters[1]);
            }
    
        }
    
        /// <summary>
        /// 状态改变
        /// </summary>
        /// <param name="statusCode"></param>
        public void OnStatusChanged(StatusCode statusCode)
        {
            Debug.Log(statusCode);
        }
    
        /// <summary>
        /// 发送消息
        /// </summary>
        public void Send(byte type, int command, params object[] objs)
        {
            Dictionary<byte, object> dic = new Dictionary<byte,object>();
            dic.Add(0,type);
            dic.Add(1,command);
            byte i = 2;
            foreach (object o in objs){
                dic.Add(i++, o);
            }
            peer.OpCustom(0, dic, true);
        }
    
    }

客户端部分

  1. 搭个页面

  2. panel上挂上脚本

    csharp 复制代码
    using System.Collections;
    using System.Collections.Generic;
    using Net;
    using UnityEngine;
    using UnityEngine.UI;
    
    public class LoginPanel : MoonBase
    {
        //账号和密码输入框
        public InputField AccountField;
        public InputField PasswordField;
        // Start is called before the first frame update
        void Start()
        {
            UiManager.Instance.Register(this);
        }
    
        // Update is called once per frame
        void Update()
        {
            
        }
    
        public override void ReceiveMessage(Message message){
            //判断是否是自己该传递的消息
            base.ReceiveMessage(message);
            //判断消息命令
            switch (message.Command)
            {
                case MessageType.Account_Register_Res:
                    Debug.Log("注册成功");
                    break;
                case MessageType.Account_Login_res:
                    Destroy(gameObject);
                    break;
            }
        }
    
        //注册
        public void Register(){
            PhotonManager.Instance.Send(MessageType.Type_Account, MessageType.Account_Register, AccountField.text, PasswordField.text);
        }
    
        //登录
        public void Login() {
            PhotonManager.Instance.Send(MessageType.Type_Account, MessageType.Account_Login, AccountField.text, PasswordField.text);
        }
    }
  3. 绑定对象,绑定事件

相关推荐
摇滚侠27 分钟前
JDBC 基础到高级一套通关!进阶篇 16-27
java
明志数科1 小时前
4D时序标注技术详解:让机器人理解连续动作的数据基础
java·算法·机器人
_qingche1 小时前
H2 数据库到 MySQL 数据迁移
java·数据库·spring boot·mysql·spring·重构·kotlin
jiayong231 小时前
虚幻引擎 Unreal Engine 通俗指南
游戏引擎·虚幻
可乐ea2 小时前
【知识获取与分享社区项目 | 项目日记第 21 天】索引构建与联想建议:Outbox 增量更新 + Completion Suggester
java·大数据·mysql·elasticsearch·搜索引擎
RainCity2 小时前
Java Swing 自定义组件库分享(十一)
java·笔记·后端
好家伙VCC2 小时前
Qdrant + LangChain 实战:构建毫秒级语义检索服务
java·langchain
AI人工智能+电脑小能手2 小时前
【大白话说Java面试题 第93题】【Mysql篇】第23题:从查找速度来看,聚集索引和非聚集索引哪个更快?
java·开发语言·数据库·mysql·面试
摇滚侠2 小时前
JDBC 基础到高级一套通关!高级篇 28-40
java
Smoothcloud润云3 小时前
5大功能精修,重构AI算力使用体验!
java·人工智能·windows·算法·重构·编辑器·sublime text