Unity进阶--通过PhotonServer实现联网登录注册功能(服务器端)--PhotonServer(二)

这篇具有很好参考价值的文章主要介绍了Unity进阶--通过PhotonServer实现联网登录注册功能(服务器端)--PhotonServer(二)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Unity进阶–通过PhotonServer实现联网登录注册功能(服务器端)–PhotonServer(二)

如何配置PhotonServer服务器:https://blog.csdn.net/abaidaye/article/details/132096415

服务器端

大体结构图

Unity进阶--通过PhotonServer实现联网登录注册功能(服务器端)--PhotonServer(二),unity游戏开发,unity,lucene,游戏引擎

  • 结构图示意

Unity进阶--通过PhotonServer实现联网登录注册功能(服务器端)--PhotonServer(二),unity游戏开发,unity,lucene,游戏引擎

BLL层(控制层)

  • 总管理类

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace PhotonServerFirst.Bll
    {
        public class BLLManager
        {
            private static BLLManager bLLManager;
            public static BLLManager Instance
            {
                get
                {
                    if(bLLManager == null)
                    {
                        bLLManager = new BLLManager();
                    }
                    return bLLManager;
                }
            }
            //登录注册管理
            public IMessageHandler accountBLL;
    
            private BLLManager()
            {
                accountBLL = new Account.AccountBLL();
            }
    
        }
    }
    
    
    
  • 控制层接口

    using Net;
    
    namespace PhotonServerFirst.Bll
    {
        public interface IMessageHandler
        {
            //处理客户端断开的后续工作
            void OnDisconnect(PSpeer peer);
    
            //处理客户端的请求
            void OnOperationRequest(PSpeer peer, Message message);
        }
    }
    
    
    
  • 登录注册控制类

    using Net;
    using PhotonServerFirst.Dal;
    
    namespace PhotonServerFirst.Bll.Account
    {
        class AccountBLL : IMessageHandler
        {
            public void OnDisconnect(PSpeer peer)
            {
                throw new System.NotImplementedException();
            }
    
            public void OnOperationRequest(PSpeer peer, Message message)
            {
                //判断命令
                switch (message.Command)
                {
                    case MessageType.Account_Register:
                       Register(peer, message);
                        break;
                    case MessageType.Account_Login:
                       Login(peer, message);
                        break;
                }
    
            }
    
            //注册请求 0账号1密码
            void Register(PSpeer peer, Message message)
            {
                object[] objs = (object[])message.Content;
                //添加用户
                int res = DAlManager.Instance.accountDAL.Add((string)objs[0],(string)objs[1]);
                //服务器响应
                SendMessage.Send(peer, MessageType.Type_UI, MessageType.Account_Register_Res, res);
            }
    
            //登陆请求 0账号1密码
            void Login(PSpeer peer, Message message)
            {
                object[] objs = (object[])message.Content;
                //登录
                int res = DAlManager.Instance.accountDAL.Login(peer, (string)objs[0], (string)objs[1]);
                //响应
                SendMessage.Send(peer, MessageType.Type_UI, MessageType.Account_Login_res, res);
            }
        }
    }
    
    
    

DAL层(数据控制层)

  • 总数据管理层

    using PhotonServerFirst.Bll;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace PhotonServerFirst.Dal
    {
        class DAlManager
        {
            private static DAlManager dALManager;
            public static DAlManager Instance
            {
                get
                {
                    if (dALManager == null)
                    {
                        dALManager = new DAlManager();
                    }
                    return dALManager;
                }
            }
            //登录注册管理
            public AccountDAL accountDAL;
    
            private DAlManager()
            {
                accountDAL = new AccountDAL();
            }
        }
    }
    
    
    
  • 登录注册数据管理层

    using PhotonServerFirst.Model;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace PhotonServerFirst.Dal
    {
        class AccountDAL
        {
            /// <summary>
            /// 保存注册的账号
            /// </summary>
            private List<AccountModel> accountList = new List<AccountModel>();
            private int id = 1;
            ///<summary>
            ///保存已经登录的账号
            /// </summary>
            private Dictionary<PSpeer, AccountModel> peerAccountDic = new Dictionary<PSpeer, AccountModel>();
    
            ///<summary>
            /// 添加账号
            ///</summary>
            ///<param name="account"> 用户名</param>
            ///<param name="password">密码</param>
            ///<returns>1 成功 -1账号已存在 0失败</returns>
            public int Add(string account, string password)
            {
                //如果账号已经存在
                foreach (AccountModel model in accountList)
                {
                    if (model.Account == account)
                    {
                        return -1;
                    }
                }
                //如果不存在
                AccountModel accountModel = new AccountModel();
                accountModel.Account = account;
                accountModel.Password = password;
                accountModel.ID = id++;
                accountList.Add(accountModel);
                return 1;
            }
    
            /// <summary>
            /// 登录账号
            /// </summary>
            /// <param name="peer">连接对象</param>
            /// <param name="account">账号</param>
            /// <param name="password">密码</param>
            /// <returns>登陆成功返回账号id  -1已经登陆  0用户名密码错误</returns>
            public int Login(PSpeer peer, string account, string password)
            {
                //是否已经登陆
                foreach (AccountModel model in peerAccountDic.Values)
                {
                    if (model.Account == account)
                    {
                        return -1;
                    }
                }
                //判断用户名密码是否正确
                foreach (AccountModel model in accountList)
                {
                    if (model.Account == account && model.Password == password)
                    {
                        peerAccountDic.Add(peer, model);
                        return model.ID;
                    }
                }
                return 0;
    
            }
        }
    }
    
    
    

模型层

  • 登录注册层

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace PhotonServerFirst.Model
    {
        /// <summary>
        /// 账号模型
        /// </summary>
        class AccountModel
        {
            public int ID;
            public string Account; 
            public string Password;
        }
    }
    
    

DLC 服务器配置类 发送消息类 以及消息类

  • 服务器配置类

    using Photon.SocketServer;
    using ExitGames.Logging;
    using ExitGames.Logging.Log4Net;
    using log4net.Config;
    using System.IO;
    
    namespace PhotonServerFirst
    {
        public class PSTest : ApplicationBase
        {
            //日志需要的
            public static readonly ILogger log = LogManager.GetCurrentClassLogger();
            protected override PeerBase CreatePeer(InitRequest initRequest)
            { 
                return new PSpeer(initRequest);
            }
    
            //初始化
            protected override void Setup()
            {
                InitLog();
                
            }
    
            //server端关闭的时候
            protected override void TearDown()
            {
    
            }
            #region 日志
            /// <summary>
            /// 初始化日志以及配置
            /// </summary>
            private void InitLog()
            {
                //日志的初始化
                log4net.GlobalContext.Properties["Photon:ApplicationLogPath"] = this.ApplicationRootPath + @"\bin_Win64\log";
                //设置日志的路径
                FileInfo configFileInfo = new FileInfo(this.BinaryPath + @"\log4net.config");
                //获取配置文件
                if (configFileInfo.Exists)
                {
                    //对photonserver设置日志为log4net
                    LogManager.SetLoggerFactory(Log4NetLoggerFactory.Instance);
                    XmlConfigurator.ConfigureAndWatch(configFileInfo);
                    log.Info("初始化成功");
                }
            }
            #endregion        
            
        }
    }
    
    
    
  • 服务器面向客户端类

    using System;
    using System.Collections.Generic;
    using Net;
    using Photon.SocketServer;
    using PhotonHostRuntimeInterfaces;
    using PhotonServerFirst.Bll;
    
    namespace PhotonServerFirst
    {
        public class PSpeer : ClientPeer
        {
            public PSpeer(InitRequest initRequest) : base(initRequest)
            {
    
            }
    
            //处理客户端断开的后续工作
            protected override void OnDisconnect(DisconnectReason reasonCode, string reasonDetail)
            {
                //关闭管理器
                BLLManager.Instance.accountBLL.OnDisconnect(this);
            }
    
            //处理客户端的请求
            protected override void OnOperationRequest(OperationRequest operationRequest, SendParameters sendParameters)
            {
                var dic = operationRequest.Parameters;
    
                //转为PhotonMessage
                Message message = new Message();
                message.Type = (byte)dic[0];
                message.Command = (int)dic[1];
                List<object> objs = new List<object>();
                for (byte i = 2; i < dic.Count; i++)
                {
                    objs.Add(dic[i]);
                }
                message.Content = objs.ToArray();
    
                //消息分发
                switch (message.Type)
                {
                    case MessageType.Type_Account:
                        BLLManager.Instance.accountBLL.OnOperationRequest(this, message); 
                        break;
                    case MessageType.Type_User:
                        break;
    
    
                }
            }
        }
    }
    
    
  • 消息类

    因为这个类是unity和服务器端都需要有的,所以最好生成为dll文件放进unity(net3.5以下)

    namespace Net
    {
        public class Message
        {
            public byte Type;
            public int Command;
            public object Content;
            public Message() { }
    
            public Message(byte type, int command, object content)
            {
                Type = type;
                Command = command;
                Content = content;
            }
        }
        //消息类型
        public class MessageType
        {
            public const byte Type_Account = 1;
            public const byte Type_User = 2;
            //注册账号
            public const int Account_Register = 100;
            public const int Account_Register_Res = 101;
            //登陆
            public const int Account_Login = 102;
            public const int Account_Login_res = 103;
    
        }
    }
    
    
    
  • 发送消息类文章来源地址https://www.toymoban.com/news/detail-627200.html

    using Photon.SocketServer;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace PhotonServerFirst
    {
        class SendMessage
        {
            /// <summary>
            /// 发送消息
            /// </ summary>
            /// <param name = "peer"> 连接对象 </ param >
            /// < param name="type">类型</param>
            /// <param name="command"> 命令</param>
            /// <param name = "objs" > 参数 </ param > 
            public static void Send(PSpeer peer, 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);
                }
                EventData ed = new EventData(0, dic);
                peer.SendEvent(ed, new SendParameters());
            }
        }  
    }
    
    
    

到了这里,关于Unity进阶--通过PhotonServer实现联网登录注册功能(服务器端)--PhotonServer(二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity使用leancloud开发弱数据联网游戏(注册、登录和云端数据存读)

    最近,由于开发需要数据存储服务,就跑去Bmob看看,不看不要紧,发现自己以前创建的应用的数据存储服务居然变成非永久的了,只有一年的免费时间,而且还过期了。这对于我将要开发的软件时很不友好的;因此,我就只能去找与Bmob同类型的后端云服务,就是我接下来要

    2023年04月23日
    浏览(39)
  • Unity实现登录/注册/审核功能

    2024年01月23日
    浏览(50)
  • Unity实现账号登录,注册功能

    制作了用户登录界面  关于弹窗使用了DOTween插件,实现渐隐渐显效果。 关于账号使用了本地Json读取, 默认账号:YSQS/YSQS1 密码:admin/admin1 注册功能其实应该重构的因为有二次读流的问题存在。 账号注册加入了邀请码(其实就一个if)  接下来就是我那臭死了的源码。 GameSt

    2024年02月11日
    浏览(43)
  • 【Unity+MySQL】实现简单的注册登录系统

    确保这两个软件都能够在你的计算机上良好地运行。 镜像地址:http://mirrors.sohu.com/mysql/MySQL-8.0/ 下载完成后双击运行msi文件。 Next→ Next→ 选择自定义安装, Next→ 选择安装路径, Next→ Install安装, 安装完成,Finish。 此电脑→计算机→属性, 关于→高级系统设置, 高级→环

    2024年02月05日
    浏览(62)
  • 【Unity+MySQL】实现注册登录系统(封装版)

    接着 上篇文章的注册登录系统,这篇文章将MySQL相关操作封装,在Unity交互脚本中直接调用封装的方法。 编写一个DBConnector脚本,封装MySQL中常用的操作,如连接数据库、关闭数据库、查询数据库、除查询外的插入、更新、删除等操作。 编写一个User脚本用于封装用户注册、登

    2024年02月05日
    浏览(48)
  • 【Unity+MySQL】实现注册登录系统(升级版)

    接着 上篇文章所谈到的系统缺陷,这篇文章进行升级解决。 问题 :注册界面与登录界面是同一个界面,导致用户输入用户密码进行注册后,即可点击登录。 解决 :在同一个场景中分别创建注册界面和登录界面,使用SetActive控制注册/登录成功后UI的显示与隐藏。 整体的UI框

    2024年02月09日
    浏览(50)
  • Unity3D制作注册登录界面,并实现场景跳转

    效果预览图片: 效果预览视频: 一、新建项目工程 1、打开Unity3D,新建一个项目,将其命名为“Login”。我这里用的版本是Unity2018.4.2f1,不同版本制作过程中的界面可能稍有不同,但是不影响具体功能的实现。 2、可以将样例场景SampleScene重命名为Login,最好做到见名知意。

    2024年02月03日
    浏览(82)
  • Unity3D实现MySql数据库登录与注册功能

    1、界面布局如下: 2、界面控件 1、封装MySql 2、编写登录、注册功能脚本 挂载LoginPanel脚本,并将控件映射到公共属性如下: 有问题请指出,谢谢!

    2024年02月11日
    浏览(67)
  • 基于Unity客户端与服务端实现登录与注册以及多人在线聊天

    1.在Unity下,创建一个GameManager空对象,用于启动客户端连接以及实例化一个登录页面LoginView的Prefab,并将脚本LoginView挂载在上面。 2.创建一个Client类,用于客户端向服务端发起连接请求,并且发送给服务端消息以及接收服务端的响应 3.创建一个脚本LoginView挂载在LoginView对象上

    2024年04月16日
    浏览(51)
  • 手把手教你实现:Android注册登录功能,通过本地服务器保存用户账号密码到数据库

    代码我放到文章最后面了 首先你需要电脑一台:如果没有电脑将会很难办呢 -----沃兹基硕德 下载并安装以下开发工具 Android Studio 官网最新版 用来开发 安卓App IntelliJ IDEA 官网最新版 用来开发 后端 ,处理安卓APP的请求 Navicat for MySql 官网最新版 数据库可视化工具,用来查看数

    2024年01月16日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包