一.项目描述
一款多人在线的MMORPG游戏,使用C#语言,u3d引擎进行学习。
二.学习过程(用户登录与注册)
首先在Unity中创建一个场景,在场景中创建一个空物体,起名为NetClient,挂在脚本NetClient,在创建一个空物体,起名为loadingmanager,挂载脚本loadingmanager。(课程自带,不是自己写的)。
然后,进行UI创作(与原UI不同,本人自己找的资源),包括背景,登陆界面,注册界面,进度条,开始页面提示(健康游戏公告)等。(如上所示)
最后,对其中的功能模块——登录,注册两个功能进行脚本编写,给登录界面和注册界面分别绑定UILogin脚本和UIRegister脚本,将账号输入、密码输入以及按钮进行绑定。(如下所示)
完成后,在LoadingManager上进行控件绑定。(如下所示)
进行验证,与服务端进行消息发送,看是否能够成功登录并注册。
注册与登录功能均实现。
客户端代码如下:
UILogin
public InputField username;
public InputField password;
public Button buttonLogin;
// Use this for initialization
void Start () {
UserService.Instance.OnLogin = OnLogin;
}
// Update is called once per frame
void Update () {
}
public void OnClickLogin()
{
if (string.IsNullOrEmpty(this.username.text))
{
MessageBox.Show("请输入账号");
return;
}
if (string.IsNullOrEmpty(this.password.text))
{
MessageBox.Show("请输入密码");
return;
}
UserService.Instance.SendLogin(username.text, password.text);
}
public void OnLogin(Result result,string message)
{
if (result==Result.Success)
{
MessageBox.Show("登录成功");
}
else
MessageBox.Show(message, "错误", MessageBoxType.Error);
}
UIRegister
public InputField username;
public InputField userpassword;
public InputField confirePassword;
public Button registerButton;
public GameObject uiLogin;
private void Start()
{
UserService.Instance.OnRegister = onRegiter;
}
public void OnClickRegister()
{
if (string.IsNullOrEmpty(this.username.text))
{
MessageBox.Show("请输入账号");
return;
}
if (string.IsNullOrEmpty(this.userpassword.text))
{
MessageBox.Show("请输入密码");
return;
}
if (string.IsNullOrEmpty(this.confirePassword.text))
{
MessageBox.Show("请输入确认密码");
return;
}
if (this.userpassword.text != this.confirePassword.text)
{
MessageBox.Show("两次输入的密码不一致");
return;
}
UserService.Instance.SendRegister(this.username.text, this.userpassword.text);
}
void onRegiter(Result result,string message)
{
if (result == Result.Success)
{
MessageBox.Show("注册成功,请登录", "提示", MessageBoxType.Information).OnYes = this.CloseRegister;
}
else
MessageBox.Show(message, "错误", MessageBoxType.Error);
}
void CloseRegister()
{
this.gameObject.SetActive(false);
uiLogin.SetActive(true);
}
用户服务(UserService)
public UnityEngine.Events.UnityAction<Result, string> OnLogin;
public UnityEngine.Events.UnityAction<Result, string> OnRegister;
NetMessage pendingMessage = null;
bool isQuitGame = false;
bool connected = false;
public UserService()
{
NetClient.Instance.OnConnect += OnGameServerConnect;
NetClient.Instance.OnDisconnect += OnGameServerDisconnect;
MessageDistributer.Instance.Subscribe<UserLoginResponse>(OnUserLogin);
MessageDistributer.Instance.Subscribe<UserRegisterResponse>(this.OnUserRegister);
}
public void Dispose()
{
MessageDistributer.Instance.Unsubscribe<UserLoginResponse>(this.OnUserLogin);
MessageDistributer.Instance.Unsubscribe<UserRegisterResponse>(this.OnUserRegister);
NetClient.Instance.OnConnect -= OnGameServerConnect;
NetClient.Instance.OnDisconnect -= OnGameServerDisconnect;
}
public void ConnectToServer()
{
Debug.Log("ConnectToServer() Start ");
//NetClient.Instance.CryptKey = this.SessionId;
NetClient.Instance.Init("127.0.0.1", 8000);
NetClient.Instance.Connect();
}
void OnGameServerConnect(int result, string reason)
{
Log.InfoFormat("LoadingMesager:OnGameServerConnect :{0} reason:{1}", result, reason);
if (NetClient.Instance.Connected)
{
this.connected = true;
if(this.pendingMessage!=null)
{
NetClient.Instance.SendMessage(this.pendingMessage);
this.pendingMessage = null;
}
}
else
{
if (!this.DisconnectNotify(result, reason))
{
MessageBox.Show(string.Format("网络错误,无法连接到服务器!\n RESULT:{0} ERROR:{1}", result, reason), "错误", MessageBoxType.Error);
}
}
}
public void OnGameServerDisconnect(int result, string reason)
{
this.DisconnectNotify(result, reason);
return;
}
bool DisconnectNotify(int result,string reason)
{
if (this.pendingMessage != null)
{
if (this.pendingMessage.Request.userLogin!=null)
{
if (this.OnLogin != null)
{
this.OnLogin(Result.Failed, string.Format("服务器断开!\n RESULT:{0} ERROR:{1}", result, reason));
}
}
else if(this.pendingMessage.Request.userRegister!=null)
{
if (this.OnRegister != null)
{
this.OnRegister(Result.Failed, string.Format("服务器断开!\n RESULT:{0} ERROR:{1}", result, reason));
}
}
else
{
if (this.OnCharacterCreate != null)
{
this.OnCharacterCreate(Result.Failed, string.Format("服务器断开!\n RESULT:{0} ERROR:{1}", result, reason));
}
}
return true;
}
return false;
}
public void SendLogin(string user, string psw)
{
Debug.LogFormat("UserLoginRequest::user :{0} psw:{1}", user, psw);
NetMessage message = new NetMessage();
message.Request = new NetMessageRequest();
message.Request.userLogin = new UserLoginRequest();
message.Request.userLogin.User = user;
message.Request.userLogin.Passward = psw;
if (this.connected && NetClient.Instance.Connected)
{
this.pendingMessage = null;
NetClient.Instance.SendMessage(message);
}
else
{
this.pendingMessage = message;
this.ConnectToServer();
}
}
void OnUserLogin(object sender, UserLoginResponse response)
{
Debug.LogFormat("OnUserLogin:{0} [{1}]", response.Result, response.Errormsg);
if (response.Result == Result.Success)
{//登陆成功逻辑
//响应成功,建立角色信息
User.Instance.SetupUserInfo(response.Userinfo);
}
//回调
if (this.OnLogin != null)
{
//从服务端判断账号是否存在,密码是否正确
this.OnLogin(response.Result, response.Errormsg);
}
}
public void SendRegister(string user, string psw)
{
Debug.LogFormat("UserRegisterRequest::user :{0} psw:{1}", user, psw);
NetMessage message = new NetMessage();
message.Request = new NetMessageRequest();
message.Request.userRegister = new UserRegisterRequest();
message.Request.userRegister.User = user;
message.Request.userRegister.Passward = psw;
if (this.connected && NetClient.Instance.Connected)
{
this.pendingMessage = null;
NetClient.Instance.SendMessage(message);
}
else
{
this.pendingMessage = message;
this.ConnectToServer();
}
}
void OnUserRegister(object sender, UserRegisterResponse response)
{
Debug.LogFormat("OnUserRegister:{0} [{1}]", response.Result, response.Errormsg);
if (this.OnRegister != null)
{
this.OnRegister(response.Result, response.Errormsg);
}
}
服务端代码:(UserService)
public UserService()
{
MessageDistributer<NetConnection<NetSession>>.Instance.Subscribe<UserLoginRequest>(this.OnLogin);
MessageDistributer<NetConnection<NetSession>>.Instance.Subscribe<UserRegisterRequest>(this.OnRegister);
}
void OnLogin(NetConnection<NetSession> sender, UserLoginRequest request)
{
Log.InfoFormat("UserLoginRequest: User:{0} Pass:{1}", request.User, request.Passward);
sender.Session.Response.userLogin = new UserLoginResponse();
TUser user = DBService.Instance.Entities.Users.Where(u => u.Username == request.User).FirstOrDefault();
if (user == null)
{
sender.Session.Response.userLogin.Result = Result.Failed;
sender.Session.Response.userLogin.Errormsg = "用户不存在";
}
else if (user.Password != request.Passward)
{
sender.Session.Response.userLogin.Result = Result.Failed;
sender.Session.Response.userLogin.Errormsg = "密码错误";
}
else
{
sender.Session.User = user;
sender.Session.Response.userLogin.Result = Result.Success;
sender.Session.Response.userLogin.Errormsg = "None";
sender.Session.Response.userLogin.Userinfo = new NUserInfo();
sender.Session.Response.userLogin.Userinfo.Id =(int)user.ID;
sender.Session.Response.userLogin.Userinfo.Player = new NPlayerInfo();
sender.Session.Response.userLogin.Userinfo.Player.Id = user.Player.ID;
foreach (var c in user.Player.Characters)
{
NCharacterInfo info = new NCharacterInfo();
info.Id = c.ID;
info.Name = c.Name;
info.Class = (CharacterClass)c.Class;
info.ConfigId = c.TID;
sender.Session.Response.userLogin.Userinfo.Player.Characters.Add(info);
}
}
sender.SendResponse();
}
void OnRegister(NetConnection<NetSession> sender, UserRegisterRequest request)
{
Log.InfoFormat("UserRegisterRequest: User:{0} Pass:{1}", request.User, request.Passward);
sender.Session.Response.userRegister = new UserRegisterResponse();
TUser user = DBService.Instance.Entities.Users.Where(u => u.Username == request.User).FirstOrDefault();
if (user != null)
{
sender.Session.Response.userRegister.Result = Result.Failed;
sender.Session.Response.userRegister.Errormsg = "用户已存在.";
}
else
{
TPlayer player = DBService.Instance.Entities.Players.Add(new TPlayer());
DBService.Instance.Entities.Users.Add(new TUser() { Username = request.User, Password = request.Passward, Player = player , });
DBService.Instance.Entities.SaveChanges();
sender.Session.Response.userRegister.Result = Result.Success;
sender.Session.Response.userRegister.Errormsg = "None";
}
sender.SendResponse();
}
完成
注:登录界面的注册按钮与注册界面的返回按钮可以不用写代码便使其可以进行界面跳转,如下
登录界面注册功能:
注册界面返回功能:
大功告成,第一个Loading场景基本完成。
第一天学习任务完成