Unity开发,搭建一个简易的登录界面

先来搭一个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);
    }
}

写到这里,代码就已经写完了,部分功能没有去实现(因为我懒,,,)

希望我的思路可以给你带来参考的意义,我的代码习惯是在是太烂了,尽量不要学着我的代码去敲..

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值