unity3d登陆代码

2015年03月06日 15:15 0 点赞 0 评论 更新于 2017-04-30 22:09

在 Unity3D 开发中实现登录功能,主要会用到 Unity 内置的 WWW 类和 WWWForm 类。通过 WWWForm.AddField(String fieldName, String value) 方法,以 POST 表单提交的方式将表单参数传递给服务器端的逻辑业务层。本文以 JSP 为例进行说明,在逻辑层使用 request.getParameter(fieldName) 即可获取 AddField 中传递的参数,后续就是服务器的逻辑处理。对于 PHP,获取参数的方式通常是 $_POST[fieldName] ;而 ASP.NET 的实现方式暂不展开讨论。

客户端的 demo 效果图说明

其中,原本提到的 imei 一般指手机的唯一识别 ID,但使用 imei 表述可能不太恰当,在代码中使用 SystemInfo.deviceUniqueIdentifier 来获取设备唯一标识。

客户端代码

以下是完整的客户端代码:

using UnityEngine;
using System.Collections;
using System.Text.RegularExpressions;

public class Client : MonoBehaviour
{
WWW www;
WWWForm form;
string url;

string username_label = "username:";
string username_input = "";

string password_label = "password:";
string password_input = "";

string password_label2 = "password2:";
string password_input2 = "";

string email_label = "email:";
string email_input = "";

string callback_label = "result:";
string callback_label2 = "";

void Start()
{
// 可在此处添加初始化逻辑
}

void OnGUI()
{
GUI.Label(new Rect(0, 0, 80, 20), username_label);
username_input = GUI.TextField(new Rect(80, 0, 100, 20), username_input);

GUI.Label(new Rect(0, 30, 80, 20), password_label);
password_input = GUI.TextField(new Rect(80, 30, 100, 20), password_input);

GUI.Label(new Rect(0, 60, 80, 20), password_label2);
password_input2 = GUI.TextField(new Rect(80, 60, 100, 20), password_input2);

GUI.Label(new Rect(0, 90, 80, 20), email_label);
email_input = GUI.TextField(new Rect(80, 90, 100, 20), email_input);

GUI.Label(new Rect(0, 160, 80, 20), callback_label);
callback_label2 = GUI.TextField(new Rect(50, 160, 160, 20), callback_label2);

if (GUI.Button(new Rect(0, 120, 100, 30), "Login"))
{
form = new WWWForm();
form.AddField("name", username_input);
form.AddField("password", password_input);
url = "http://192.168.100.98:8084/ddt/UserLogin.jsp";
www = new WWW(url, form);
StartCoroutine(WaitForRequestUserNameLogin(www));
}

if (GUI.Button(new Rect(120, 120, 100, 30), "Register"))
{
form = new WWWForm();
form.AddField("id", SystemInfo.deviceUniqueIdentifier);
form.AddField("name", username_input);
form.AddField("password", password_input);
form.AddField("retry_password", password_input2);
form.AddField("email", email_input);
url = "http://192.168.100.98:8084/ddt/registerUser.jsp";
www = new WWW(url, form);
StartCoroutine(WaitForRequestRegister(www));
}

if (GUI.Button(new Rect(240, 120, 100, 30), "non-reg to play"))
{
form = new WWWForm();
form.AddField("id", SystemInfo.deviceUniqueIdentifier);
url = "http://192.168.100.98:8084/ddt/NonRegPlay.jsp";
www = new WWW(url, form);
StartCoroutine(WaitForRequestPhoneIdLogin(www));
}

if (GUI.Button(new Rect(200, 0, 130, 20), "Check UserName"))
{
form = new WWWForm();
form.AddField("name", username_input);
Debug.Log("username_input...." + username_input);
url = "http://192.168.100.98:8084/ddt/CheckUserIsExist.jsp";
www = new WWW(url, form);
StartCoroutine(WaitForRequestCheck(www));
}

if (GUI.Button(new Rect(0, 200, 50, 30), "IMEI"))
{
callback_label2 = SystemInfo.deviceUniqueIdentifier;
}
}

IEnumerator WaitForRequestUserNameLogin(WWW www)
{
yield return www;
if (www.error != null)
{
Debug.Log("fail to request..." + www.error);
}
else
{
if (www.isDone)
{
string ex = @"<span>([\S\s\t]*?)</span>";
Match m = Regex.Match(www.data, ex);
if (m.Success)
{
string result = m.Value;
result = result.Substring(result.IndexOf(">") + 1, result.LastIndexOf("<") - result.IndexOf(">") - 1).Trim();
if (result == "success")
{
callback_label2 = "登录成功";
}
else if (result == "empty")
{
callback_label2 = "用户名或密码为空";
}
else if (result == "fail")
{
callback_label2 = "找不到指定用户";
}
else
{
callback_label2 = "未知错误";
}
}
}
}
}

IEnumerator WaitForRequestRegister(WWW www)
{
yield return www;
if (www.error != null)
{
Debug.Log("fail to request..." + www.error);
}
else
{
if (www.isDone)
{
string ex = @"<span>([\S\s\t]*?)</span>";
Match m = Regex.Match(www.data, ex);
if (m.Success)
{
string result = m.Value;
result = result.Substring(result.IndexOf(">") + 1, result.LastIndexOf("<") - result.IndexOf(">") - 1).Trim();
if (result == "success")
{
callback_label2 = "注册成功";
}
else if (result == "empty")
{
callback_label2 = "用户名或密码为空";
}
else if (result == "equals")
{
callback_label2 = "两次输入密码不一致";
}
else if (result == "fail")
{
callback_label2 = "更新数据库失败";
}
else
{
callback_label2 = "未知错误";
}
}
}
}
}

IEnumerator WaitForRequestCheck(WWW www)
{
yield return www;
if (www.error != null)
{
Debug.Log("fail to request..." + www.error);
}
else
{
if (www.isDone)
{
Debug.Log("data-->" + www.data);
string ex = @"<span>([\S\s\t]*?)</span>";
Match m = Regex.Match(www.data, ex);
if (m.Success)
{
string result = m.Value;
result = result.Substring(result.IndexOf(">") + 1, result.LastIndexOf("<") - result.IndexOf(">") - 1).Trim();
if (result == "empty")
{
callback_label2 = "用户名为空";
}
else if (result == "nothing")
{
callback_label2 = "用户名不存在,可以注册";
}
else if (result == "exist")
{
callback_label2 = "用户名已存在";
}
else
{
callback_label2 = "未知错误";
}
}
}
}
}

IEnumerator WaitForRequestPhoneIdLogin(WWW www)
{
yield return www;
if (www.error != null)
{
Debug.Log("fail to request..." + www.error);
}
else
{
if (www.isDone)
{
string ex = @"<span>([\S\s\t]*?)</span>";
Match m = Regex.Match(www.data, ex);
if (m.Success)
{
string result = m.Value;
result = result.Substring(result.IndexOf(">") + 1, result.LastIndexOf("<") - result.IndexOf(">") - 1).Trim();
if (result == "ok")
{
callback_label2 = "手机ID登录成功";
}
else if (result == "error")
{
callback_label2 = "手机ID登录失败"; // 原代码此处表述有误,进行修正
}
else
{
callback_label2 = "未知错误";
}
}
}
}
}
}

代码解释

  • 字段声明:定义了用于存储 WWW 请求对象、WWWForm 表单对象、URL 以及用户输入信息和回调结果的变量。
  • Start 方法:可用于初始化一些必要的数据。
  • OnGUI 方法:绘制用户界面,包括输入框、按钮等,并根据用户点击按钮的操作,创建 WWWForm 表单,添加相应的字段,然后发起 WWW 请求,并启动协程等待响应。
  • 协程方法WaitForRequestUserNameLoginWaitForRequestRegisterWaitForRequestCheckWaitForRequestPhoneIdLogin 用于等待 WWW 请求完成,并根据服务器返回的结果更新回调信息。

服务器端注册逻辑

以下是服务器端注册逻辑的 JSP 代码:

<%@ page language="java" import="ddt.*" %>
<jsp:useBean id="user" scope="session" class="ddt.UserBean" />
<%@page contentType="text/html" pageEncoding="UTF-8" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<%
String id = request.getParameter("id");
String username = request.getParameter("name");
String password = request.getParameter("password");
String retry_password = request.getParameter("retry_password");
String email = request.getParameter("email");
user.processRegisterUserRequest(id, username, password, retry_password, email, request, response);
%>
</body>
</html>

代码解释

  • 页面声明:指定页面使用的语言为 Java,并导入 ddt 包中的类。
  • 使用 JavaBean:使用 jsp:useBean 标签创建一个 ddt.UserBean 类型的对象。
  • 获取参数:通过 request.getParameter 方法获取客户端传递的参数。
  • 调用方法:调用 user 对象的 processRegisterUserRequest 方法处理注册请求。

登录等其他功能的业务处理流程与注册类似,这里不再详细阐述。

作者信息

boke

boke

共发布了 1025 篇文章