MMO游戏又称大型多人在线角色扮演类游戏,在所有的角色扮演的游戏当中,玩家都要扮演一个虚拟角色,并控制角色活动
MMO可以分为客户端和服务器两部分,玩家通过客户端连接到互联网登录服务器才能进行游戏,游戏玩家的数据资料保存在服务器上,游戏的开发商和运营商提供游戏的服务器以及管理虚拟世界,对游戏不断的做出更新以便留住老玩家以及吸引新玩家
在之前的训练营课程里,我们已经完成了MMORPG所需的网络通信、协议序列化以及游戏的服务器和客户端部分,接下来就带大家来实现MMO游戏的用户管理
实现UserMag
我们要实现的用户管理是在玩家发出注册请求时校验用户的信息是否合法,要实现这个功能就需要我们在服务器上建立一个用户管理器,用户管理器会存储所有User信息
所以我们的第一步就是建立一个UserMgr类,这个类是一个单件类
namespace Ymck
{
class UserMgr : Singleton<UserMgs>
{
}
}
UserMgr类需要存储所有的用户,那么它应该使用什么样的数据结构来存储用户信息呢?我们的项目是使用字典来存储这些信息,如下,字典中的User类代表用户姓名和密码信息
namespace Ymck
{
class UserMgr : Singleton<UserMgs>
{
Dictionary<string, User> dicNameUser = new Dictionary<string, User>();
}
}
接下来我们来实现获取和添加用户功能
namespace Ymck
{
class UserMgr : Singleton<UserMgs>
{
Dictionary<string, User> dicNameUser = new Dictionary<string, User>();
public User GetUser(string name)
{
if (dicNameUser.TryGetValue(name, out User user)) // 通过用户姓名获取用户信息
return user;
else
return null;
}
public void AddUser(User user)
{
if (dicNameUser.ContainsKey(user.name)) // 如果用户已经注册则返回
return;
dicNameUser[user.name] = user; // 添加用户
}
}
}
上面这种写法是为了让大家更容易的理解服务器要做的事情,在我们真正的项目当中,我们在访问用户数据时,不会自己在内存里创建一个用户管理器,我们会直接从数据库读取用户数据
下面我们来看看UserMgr类应该如何使用
// req代表客户端向服务器发送的客户注册信息
if (UserMgr.Instance.GetUser(req.name) != null) // 如果用户已经注册就向客户端抛出异常
{
nm2.resp.userReg.ok = false;
nm2.resp.userReg.errMsg = "ERR: User exists!";
}
else
{
var newUser = new User() // 创建一个新用户,将客户注册信息注入到新用户中
{
name = req.name,
pwd = req.pwd,
};
UserMgr.Instance.AddUser(newUser); // 添加新用户到用户管理器中
nm2.resp.userReg.ok = true;
nm2.resp.userReg.user = newUser;
}
项目的完整源码、用户管理的客户端和服务器部分内容可以参加我们的《从零开发MMO 3天训练营【第一期】 》训练营获取
课程大纲如下
学完你能够收获
连续3天,360+分钟
不仅仅能让你从零开发MMORPG,更能让你了解游戏行业求职所面临最重要的问题!
让你在入行前避过这些坑