文章目录
Unity进阶--通过PhotonServer实现联网登录注册功能(客户端)--PhotonServer(三)
前情提要
-
单例泛型类
csharpusing 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
csharpusing 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(); }
-
消息中心
csharpusing 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下的组件基础
csharpusing System.Collections; using System.Collections.Generic; using Net; using UnityEngine; public class MoonBase : MonoBehaviour { public virtual void ReceiveMessage(Message message){ } }
-
uiManager(绑在canvas上)
csharpusing 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
csharpusing 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); } }
客户端部分
-
搭个页面
-
panel上挂上脚本
csharpusing 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); } }
-
绑定对象,绑定事件