Netty游戏服务器之五Unity3d登陆消息
今天我们来讲客户端Unity和服务器收发消息的具体过程。
首先,我们要在unity上搭建登陆界面的UI,这里呢,我用的是NGUI插件。
相信做过unity3d前端的都对这个非常的熟悉,最近官方的UGUI也非常的火,但是毕竟是刚出来的,有些功能还不够完善。我期待UGUI干翻NGUI的那天。
算了,不意淫了。这里我不详细的讲怎么搭建UI,我只是走个过场,讲下重点的。
这里有三个重要的gameobject,分别是userInput(账号输入框),passInput(密码输入框),加上BtnLogin(开始游戏按钮),其他自己搭建很快的
这里我讲下思路,就是输入账号和密码后,点击开始游戏按钮,客户端就会发送一条消息给服务器,
然后服务器收到消息,读取里面的账号密码去数据库验证是否存在该用户或密码是否正确,
如果正确就发送成功的消息给客户端,客户端就可以加载其他场景了。(这里只是我个人的思路,可能有很多不好的地方,需要你们大神的指正)
ok,我们来写发送消息额机制,不得说ngui的事件监听写的太牛了。而且我最近向一个大神学了一个ui的底层框架,用起来就更加得心应手了。
public class Protocol{ public const int TYPE_LOGIN = 0; public const int TYPE_USER = 1; public const int TYPE_WIZARD = 2; public const int TYPE_BATTLE = 3; }
public class LoginProtocol { public const int Area_LoginRequest = 0; // 请求登陆 public const int Area_LoginResponse = 1; //登陆响应 public const int Login_InvalidMessage = 0;//无效消息 public const int Login_InvalidUsername = 1;//无效用户名 public const int Login_InvalidPassword = 2;//密码错误 public const int Login_Succeed = 10;//登陆成功 }
using UnityEngine; using System.Collections; using System.Collections.Generic; public class LoginUI : SceneBase { #region 界面加载相关 protected override void OnInitFront() { base.OnInitFront(); _type = SceneType.LoginUI; } protected override void OnInitSkinFront() { base.OnInitSkinFront(); SetMainSkinPath("UI/Login/LoginUI"); } protected override void OnInitDone() { base.OnInitDone(); InitData(); } protected override void OnDestroyDone() { base.OnDestroyDone(); } protected override void OnDestroyFront() { base.OnDestroyFront(); } protected override void OnClick(GameObject target) { base.OnClick(target); ButtonClick(target); } public override void OnInit(params object[] sceneArgs) { base.OnInit(sceneArgs); } public override void OnShowed() { base.OnShowed(); } #endregion #region 数据定义 private UIInput UserInput; private UIInput PassInput; #endregion #region ui逻辑 void InitData() { UserInput = skinTransform.Find("UserInput").GetComponent<UIInput>();//获得相关组件 PassInput = skinTransform.Find("PassInput").GetComponent<UIInput>(); if (PlayerPrefs.GetString("Username") != null && PlayerPrefs.GetString("Username") != "") { UserInput.value = PlayerPrefs.GetString("Username"); } } void ButtonClick(GameObject click)//按钮监听 { if(click.name.Equals("BtnLogin"))//如果是登录按钮 { if (UserInput.value == "")//账号为空什么都不做 { return ; } else if (PassInput.value == "")//密码为空什么都不做 { return ; } else { SocketModel LoginRequset = new SocketModel(); LoginRequset.SetType(Protocol.TYPE_LOGIN);//消息的类型为Login LoginRequset.SetArea(LoginProtocol.Area_LoginRequest); LoginRequset.SetCommand(0); List<string> message = new List<string>();//这里存的是用户的账号密码 message.Add(UserInput.value); message.Add(PassInput.value); LoginRequset.SetMessage(message); MainClient.instance.SendMsg(LoginRequset);//发送这条消息给服务器 } } } #endregion }