客户端就以我正在做的一个简易聊天软件为例,只讲下前面的登录和注册的验证功能。聊天系统是直接用的photon提供的一个插件,叫做photon chat,有兴趣可以去研究看看,免费的可以允许同时在线10个人,以此插件为基础,做一个聊天软件很轻松。
当然也可以直接用自己网站上的数据库作为聊天中介(这是我自己的理解,不知道对不对,原则上实现相互通信的没有问题的),不过尽量不要这么做,太占用数据库空间了。
客户端开发
UI部分
这部分脚本和UI搭建之类的就不多说了,我这边贴出我的最后效果。
web连接部分
在Hierarchy面板加入两个空物体命名随意,分别挂载Login和Register脚本
Login脚本如下:
using System.Collections;
using UnityEngine;
public class Login : MonoBehaviour {
string formText = ""; //用来获取返回值
string formUser; //获取用户名
string formPassword; //获取密码
public string URL = "http://www.dongliguangyou.cn/QQChat/login.php"; //这边是改变你的网站地址的,我的是http://www.dongliguangyou.cn,你们改成自己的就行
public string hash = "hashcode"; //相当于加密吧
void Start()
{
}
//这个方法是用来获取数据的,在unity中可以通过消息机制,来做这件事
public void GetData(string data)
{
string[] dataS = data.Split(':');
formUser = dataS[0];
formPassword = dataS[1];
StartCoroutine(LoginGame());
}
IEnumerator LoginGame()
{
WWWForm form = new WWWForm();
form.AddField("myform_hash", hash); //要和php脚本中的一致
form.AddField("myform_user", formUser);
form.AddField("myform_pass", formPassword);
WWW w = new WWW(URL, form);
yield return w;
if (w.error != null)
{
Debug.LogError("网络问题: " + w.error);
}
else
{
formText = w.text; //返回php脚本中的信息
GameObject.Find("GameScripts").GetComponent("LoginAndRegister").SendMessage("AnswerLogin", formText);//将获取的返回值,也就是登录成功或者登陆失败的消息返回,传递给AnswerLogin来处理,是否允许登录。
w.Dispose(); //清除form
}
}
}
Register脚本,同样的道理,我就不写注释了:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Register : MonoBehaviour {
string formText = "";
string formUser;
string formPassword;
public string URL = "http://www.dongliguangyou.cn/QQChat/register.php";
public string hash = "hashcode";
void Start()
{
}
public void GetData(string data)
{
string[] dataS = data.Split(':');
formUser = dataS[0];
formPassword = dataS[1];
StartCoroutine(SignUpGame());
}
IEnumerator SignUpGame()
{
WWWForm form = new WWWForm();
form.AddField("myform_hash", hash);
form.AddField("myform_user", formUser);
form.AddField("myform_pass", formPassword);
WWW w = new WWW(URL, form);
yield return w;
if (w.error != null)
{
Debug.LogError("网络问题: " + w.error);
}
else
{
formText = w.text;
GameObject.Find("GameScripts").GetComponent("LoginAndRegister").SendMessage("AnswerRegister", formText);
w.Dispose();
}
}
}
最后我还是贴上LoginAndRegister这个脚本吧,这是用来处理登录和注册请求以及返回值。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class LoginAndRegister : MonoBehaviour {
public InputField userName;
public InputField password;
public InputField newUserName;
public InputField newPassword;
public InputField confirmPassword;
public GameObject registerPanel;
public GameObject createPanel;
public GameObject waitPage;
public bool rem=true; //是否记住账号
public void OnClickLogin() //请求登录
{
GameObject.Find("WebLogin").GetComponent("Login").SendMessage("GetData", userName.text + ":" + password.text);
}
public void OnClickRegister()
{
registerPanel.SetActive(true);
}
public void OnClickConfirmRegister() //请求注册
{
if (newPassword.text != confirmPassword.text)
{
Debug.Log("两次密码不一致");
return;
}
else
{
GameObject.Find("WebRegister").GetComponent("Register").SendMessage("GetData", newUserName.text + ":" + newPassword.text);
}
}
public void AnswerLogin(string ans) //处理登录返回值
{
ans = ans.Remove(0, 1);
if (ans.Split(':')[0] == "Correct")
{
GameInfo._instance.userName = userName.text;
//这下面可以不看
if (rem)
{
PlayerPrefs.SetString("User", userName.text);
}
if (ans.Split(':')[1] == "0")
{
Debug.Log("新账号,创建名字");
createPanel.gameObject.SetActive(true);
}
else
{
GameInfo._instance.nickName = PlayerPrefs.GetString("NickName");
waitPage.SetActive(true);
Invoke("EnterApp", 1.0f);
Debug.Log("进入账户");
}
}
if (ans.Split(':')[0] == "Wrong")
{
Debug.Log("登录错误");
//错误进入错误页面
//StartCoroutine("ErrorWindow", "wrongData");
}
}
public void AnswerRegister(string ans) //处理注册返回值
{
ans = ans.Remove(0, 1);
if (ans == "Done")
{
registerPanel.SetActive(false);
}
else
{
Debug.Log("登录错误");
//StartCoroutine("ErrorWindow", "alreadyBeen");
}
}
}
客户端的主要代码部分就这些,主要是与php脚本的交互,通过www发送和接受信息。下次就是最后一部分php代码部分,和实际测试效果。