Unity Advanced: implementación de la función de inicio de sesión y registro en línea a través de PhotonServer (cliente) – PhotonServer (3)

Unity Advanced: implementación de la función de inicio de sesión y registro en línea a través de PhotonServer (cliente) – PhotonServer (3)

Resumen

  • Clase genérica singleton

    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;
        }
    }
    
    
  • AdministradorBase

    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();
    }
    
    
    • Centro de mensajes

      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);
              }
          }
      }
      
      
      • Base de componentes bajo el administrador

        using System.Collections;
        using System.Collections.Generic;
        using Net;
        using UnityEngine;
        
        public class MoonBase : MonoBehaviour
        {
                  
                  
            public virtual void ReceiveMessage(Message message){
                  
                  
                
            }
        }
        
        
      • uiManager (atado al lienzo)

        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;
            }
            
        }
        
        
        
  • Administrador de fotones

    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);
        }
    
    }
    
    

parte del cliente

  1. Crear una pagina

    [La transferencia de la imagen del enlace externo falló. El sitio de origen puede tener un mecanismo anti-leeching. Se recomienda guardar la imagen y cargarla directamente (img-2kLIN0oV-1692427488913) (../AppData/Roaming/Typora/typora-user -imagenes/imagen-20230808114712080.png)]

  2. Cuelga el guión en el panel.

    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. Vincular objetos, vincular eventos

[La transferencia de la imagen del enlace externo falló. El sitio de origen puede tener un mecanismo anti-leeching. Se recomienda guardar la imagen y cargarla directamente (img-jILwqbyK-1692427488914)(../AppData/Roaming/Typora/typora-user -imagenes/imagen-20230808160430040.png)]

[La transferencia de la imagen del enlace externo falló. El sitio de origen puede tener un mecanismo anti-leeching. Se recomienda guardar la imagen y cargarla directamente (img-lmhcdlev-1692427488915)(../AppData/Roaming/Typora/typora-user -imagenes/imagen-20230808161310270.png)]

おすすめ

転載: blog.csdn.net/abaidaye/article/details/132379826