先来搭一个Ui
用的是直接从QQ上扣下来的图..扣的有点不干净..
按下注册账号后会转到注册面板,说是注册面板,其实就是隐藏了登录面板里的东西,保留了输入框和添加了两个按钮
然后写一个Ui管理类
将Ui管理类直接挂载在Canvas上,然后就是一步一步的拖了,这个过程有的折磨人..
然后就是给这些按钮和输入框添加监听了
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using static UnityEditor.Progress;
public class UiManager : MonoBehaviour
{
public Image qqPanel; //主面板
public InputField accInput; //账号输入框
public InputField pwdInput; //密码输入框
public GameObject loginPanel; //登录账号面板
public Toggle remberPwd; //记住密码选项
public Button retrievePassword; //找回密码按钮
public Button register; //转到注册账号面板
public Button loginToPro; //登入按钮
public GameObject registerPanel; //注册账号面板
public Button registerAcc; //注册账号按钮
public Button returnLogin; //返回登录面板
public Dropdown AccList; //下拉框
bool nowRember; //当前记住密码的状态
// Start is called before the first frame update
void Start()
{
//登录面板和注册面板的开关
register.onClick.AddListener(() =>
{
ClearInput();
registerPanel.SetActive(true);
loginPanel.SetActive(false);
});//打开注册面板,关闭登录面板
returnLogin.onClick.AddListener(() =>
{
ClearInput();
registerPanel.SetActive(false);
loginPanel.SetActive(true);
});//打开登录面板,关闭注册面板
//注册
registerAcc.onClick.AddListener(() =>
{
//调用管理类,查找要注册的用户名是否存在
if (GameManager.Instance.CanRegister(accInput.name))
{
//调用管理类中的注册方法
GameManager.Instance.RegisterAccount(accInput.text, pwdInput.text, remberPwd.isOn);
}
else
{
Debug.Log("注册失败!");
}
});
//清空下拉列表中本来有的数据
AccList.ClearOptions();
//新建一个string类型的集合,用来储存以后的用户名
List<string> userNames = new List<string>();
//集合的内容为管理类中的方法返回的集合
userNames = GameManager.Instance.ReturnUserName();
//将集合的内容添加进下拉列表中
AccList.AddOptions(userNames);
//初始化为列表的第一个用户
InputMessage(userNames, 0);
//给下拉列表添加监听,sub是下拉列表中下标,从0开始
AccList.onValueChanged.AddListener((sub) =>
{
//选到哪一个就自动填写哪一个的信息
InputMessage(userNames, sub);
});
//登录
loginToPro.onClick.AddListener(() =>
{
//调用管理类中的判断方法,传进去用户名和密码,判断是否填写正确
if (GameManager.Instance.CanLgin(accInput.text, pwdInput.text))
{
//调用管理类中的更新数据方法,更新Json数据表中的信息,传进去用户名,密码,当前是否记住密码
GameManager.Instance.RefreshUserData(accInput.text, pwdInput.text, remberPwd.isOn);
//登录完成后,清空账号输入框和密码输入框
ClearInput();
//登录成功后的代码
}
else
{
//填写错误提示
Debug.Log("账号或密码错误!");
}
});
}
/// <summary>
/// 填写用户名输入框和密码输入框中的信息(自动填写设置)
/// </summary>
/// <param name="userNames">用户名</param>
/// <param name="sub">位于下拉列表中的下标</param>
private void InputMessage(List<string> userNames, int sub)
{
//用户名自动填写,使用用户名集合
accInput.text = userNames[sub];
//调用管理类中的判断方法,传进去用户名,得到用户是否记住密码
//将记住密码选项按照用户上一次的记录进行勾选
remberPwd.isOn = GameManager.Instance.IsRember(userNames[sub]);
//判断用户上一次是否记住密码
if (GameManager.Instance.IsRember(userNames[sub]))
{
//自动填写密码
pwdInput.text = GameManager.Instance.ReturnPassWord(userNames[sub]);
}
else
{
//没有记住密码就填写空的
pwdInput.text = null;
}
}
//清空账号输入框和密码输入框
void ClearInput()
{
accInput.text = null;
pwdInput.text = null;
}
}
这里会调用到两个新的管理类:游戏管理类和数据管理类
游戏管理类,直接挂载到Canvas上
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 游戏管理类
/// </summary>
public class GameManager : MonoBehaviour
{
//单例
public static GameManager Instance;
//数据管理类
DataManager dataManager;
private void Awake()
{
//数据管理类初始化,初始化时自动调用数据管理类中的无参构造函数
dataManager = new DataManager();
//初始化单例
Instance = this;
}
/// <summary>
/// 确认是否可以登录
/// </summary>
/// <param name="name">用户名</param>
/// <param name="passWord">密码</param>
/// <returns>布尔值,是否可以登录</returns>
public bool CanLgin(string name, string passWord)
{
//遍历数据管理类中的用户数据集合
for (int i = 0; i < dataManager.userDatas.Count; i++)
{
//查找账号和密码是否有相同的
if (name == dataManager.userDatas[i].name && passWord == dataManager.userDatas[i].passWord)
{
//账号和密码符合返回true
return true;
}
}
//找完一遍,没有找到复合的就返回false
return false;
}
/// <summary>
/// 确认是否可以注册
/// </summary>
/// <param name="name">用户名</param>
/// <returns>布尔值,是否可以注册</returns>
public bool CanRegister(string name)
{
//遍历数据管理类中的用户数据集合
for (int i = 0; i < dataManager.userDatas.Count; i++)
{
//判断账号是否有相同的
if (name == dataManager.userDatas[i].name)
{
//有相同的就返回false,不可以注册
return false;
}
}
//有相同的就返回true,可以注册
return true;
}
/// <summary>
/// 注册账号
/// </summary>
/// <param name="name">用户名</param>
/// <param name="passWord">密码</param>
public void RegisterAccount(string name, string passWord, bool isRember)
{
//调用数据管理类中的写入Json的方法
dataManager.WriteUserData(name, passWord, isRember);
}
/// <summary>
/// 返回账号集合
/// </summary>
/// <returns>所有账号组成的集合</returns>
public List<string> ReturnUserName()
{
//定义字符串类型的集合
List<string> result = new List<string>();
//遍历数据管理类中的用户数据集合
foreach (var item in dataManager.userDatas)
{
//将账号添加到新集合里
result.Add(item.name);
}
//返回集合
return result;
}
/// <summary>
/// 返回上次记住密码的状态
/// </summary>
/// <param name="name">要查找的用户名</param>
/// <returns>布尔值,上次记住密码的状态</returns>
public bool IsRember(string name)
{
//遍历数据管理类中的用户数据集合
foreach (var item in dataManager.userDatas)
{
//遍历查找用户名
if (item.name == name)
{
//返回集合中的状态
return item.isRember;
}
}
//没有找到用户就返回false
return false;
}
/// <summary>
/// 根据账号返回密码
/// </summary>
/// <param name="name">要查找的账号</param>
/// <returns>账号的密码</returns>
public string ReturnPassWord(string name)
{
//新建字符串,初始值为空
string result = "";
//遍历数据管理类中的用户数据集合
foreach (var item in dataManager.userDatas)
{
//查找符合的账号
if (item.name == name)
{
//返回密码
result = item.passWord;
}
}
//否则直接返回空的字符串
return result;
}
/// <summary>
/// 刷新用户数据
/// </summary>
/// <param name="name">登录成功时的账号</param>
/// <param name="passWord">登录成功时的密码</param>
/// <param name="Rember">登录成功时记住密码的状态</param>
public void RefreshUserData(string name, string passWord, bool Rember)
{
//遍历数据管理类中的用户数据集合
for (int i = 0; i < dataManager.userDatas.Count; i++)
{
//查找符合的账号
if (dataManager.userDatas[i].name == name)
{
//更新原本用户数据集合中的记住密码状态
dataManager.userDatas[i].isRember = Rember;
//调用数据管理类中的刷新Json文件的方法
dataManager.RefreshData(dataManager.userDatas);
//直接中断方法
return;
}
}
}
}
数据管理类,不继承MonoBehaviour类,所以不用挂载到对象上,用的时候直接调用
using Newtonsoft.Json;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
/// <summary>
/// 用户数据类
/// </summary>
public class UserData
{
public string name;
public string passWord;
public bool isRember;
}
/// <summary>
/// 数据管理类
/// </summary>
public class DataManager
{
//建立用户数据集合,用来临时储存用户数据
public List<UserData> userDatas;
/// <summary>
/// 构造函数,是一个无参构造
/// </summary>
public DataManager()
{
//初始化用户数据集合
userDatas = new List<UserData>();
//解析Json
InitUserData();
}
/// <summary>
/// 读取Json数据
/// </summary>
private void InitUserData()
{
//使用try-catch,将Json解析入集合
try
{
userDatas = JsonConvert.DeserializeObject<List<UserData>>(Resources.Load<TextAsset>("Json/UserData").text);
}//在try中遇到错误会执行catch中的语句
catch (System.Exception)
{
Debug.Log("没有找到文件!");
}
}
/// <summary>
/// 写入Json数据(注册账号)
/// </summary>
/// <param name="name">账号</param>
/// <param name="passWord">密码</param>
/// <param name="isRember">是否记住密码</param>
public void WriteUserData(string name, string passWord, bool isRember)
{
//建立一个新的用户数据,不适用构造函数,直接用大括号加=给数据赋值
UserData user = new UserData() { name = name, passWord = passWord, isRember = isRember };
//用户数据集合中添加一位
userDatas.Add(user);
//Json文件反编译,存到字符串中
string str = JsonConvert.SerializeObject(userDatas);
//Json文件的地址
//Application.dataPath : 当前项目的 "Assets" 文件夹下(记得在后面加上'/',不然再往后面写的话路径就少一个斜杠)
string path = Application.dataPath + "/Resources/Json/UserData.json";
//将字符串str直接写入Json文件
File.WriteAllText(path, str);
}
/// <summary>
/// 刷新Json文件(更新记住密码的信息)
/// </summary>
/// <param name="newDatas">新的集合,登录成功时的账号信息</param>
public void RefreshData(List<UserData> newDatas)
{
//同上面的代码,复制粘贴
string str = JsonConvert.SerializeObject(newDatas);
string path = Application.dataPath + "/Resources/Json/UserData.json";
File.WriteAllText(path, str);
}
}
写到这里,代码就已经写完了,部分功能没有去实现(因为我懒,,,)
希望我的思路可以给你带来参考的意义,我的代码习惯是在是太烂了,尽量不要学着我的代码去敲..