学习Unity已经将近一个月了,今天初接触Json,记录一下!仅供参考,大神看看就好.

  今天使用LitJson搭配NGUI实现登录界面的登录与注册功能,由于我也是新手,有做的不好的地方,欢迎大家指正!

第一步:搭建界面:

  具体过程我就不多说了,我做的界面也不是太好,应为自己也是刚接触NGUI,就不献丑了......

  搭建好的界面大概是这样的:

 

Unity cmd用户名_用户名

Unity cmd用户名_用户名_02

一个登录界面,一个注册界面(原谅我吧,字体不支持中文),

将要实现的功能:登录时会与储存的账户密码对比,账号错误时输出:账号不存在.密码错误时输出:密码错误,请重新输入.账号密码为空时输出:账号密码不能为空,请重新输入! .最后,账号密码都正确时输出:登录成功!

注册界面: 输入的账号密码为空时输出:账号密码不能为空.账号与储存的账号一样时输出:该账号已经有人用了,再换一个吧!:两次输入密码不一样时输出:两次输入的密码不一样.最后一种情况则输出:注册成功!  注册成功时会查找我们的json文件,将用户名密码写入文件储存. 最后,实现在开始运行时读取文件.

话不多说,进入正题:为了简便,我将所有代码都写在了一个脚本上.

在UIRoot 目录下创建了空物体,重命名为:GameManager,然后在右侧Inspector面板最下方点击Add Component,搜索栏输入GameManager然后双击enter键以创建并绑定我们的脚本:

Unity cmd用户名_数据_03

双击打开我们的脚本文件.

根据我们需要的功能,我们须要声明并找到我们的两个panel,以及登录页的两个输入框,两个按钮,注册页的三个输入框,两个按钮.

public class GameManager : MonoBehaviour {
    public UIPanel login, signUp;
    public UIInput un, pw, reun, repw, repw2;

可以在Start方法中使用GameObject.Find();方法查找,也可以在场景中点中GameManager空物体,分别将上述面板以及输入框及按钮拖入inspector面板的GameManager属性中.

 

void Start () {
        login = GameObject.Find("LoginPanel").GetComponent <UIPanel >();
        signUp  = GameObject.Find("Register").GetComponent<UIPanel>();
        un = GameObject.Find("LoginPanel/Username/un").GetComponent<UIInput>();
        pw = GameObject.Find("LoginPanel/Password/pw").GetComponent<UIInput>();
        reun = GameObject.Find("Register/Username/un").GetComponent<UIInput>();
        repw = GameObject.Find("Register/Password/pw").GetComponent<UIInput>();
        repw2 = GameObject.Find("Register/RePassword/pw").GetComponent<UIInput>();
        signUp.gameObject.SetActive(false);

    }

这里我们须要创建一个字典来临时储存所有的账户和密码.

public class GameManager : MonoBehaviour {
    public UIPanel login, signUp;
    public UIInput un, pw, reun, repw, repw2;
    //创建一个字典来储存账号信息
    public Dictionary<string, string> allAccount = new Dictionary<string, string>();

先写一下Login按钮的点击事件:

//登录按钮点击事件
    public void LoginButton() {
        //获取输入框中的值
        string username = un.value;
        string password = pw.value;
        //根据这两个值进行逻辑判断

        if (username == "" || password == "") {
            print("用户名或密码为空,请重新输入");
            return;//如果用户名或密码为空,进入这里
        }
        else if (allAccount.ContainsKey(username))
        {//否则如果用户名正确
            if (password == allAccount[username])
            {
                //如果与这个用户名一对的密码正确
                print("登录成功!!");
                return;
            }
            else {
                //如果用户名正确但是密码不正确
                print("密码错误");
                return;
            }
        }
        else {
            //其他情况输出用户名或者密码错误
            print("用户名或密码错误,请重新输入");
            return;
        }
    }

然后是登录界面的注册按钮事件:

//登录界面的注册按钮事件
    public void RegisterButton() {
        login.gameObject.SetActive(false);
        signUp.gameObject.SetActive(true);
    }

此时就跳转到了注册页面了,接下来是对注册页面的一些操作:

先写这个页面的注册按钮事件吧:

//注册页面的注册按钮事件
    public void SignUpButton() {
        //获取输入框的值
        string username = reun.value;
        string password = repw.value;
        string password2 = repw2.value;
        //根据这两个值进行逻辑判断
        if (username == "" || password == "")
        {
            //如果用户名和密码为空时
            print("用户名和密码不能为空!!");
            return;
        }
        else if (allAccount.ContainsKey(username))
        {
            //如果用户名和已知的重复时
            print("该用户名已经被用了,请换一个吧!");
            return;
        }
        else if (password != password2)
        {
            //如果两次输入密码不一致时
            print("两次输入的密码不一样");
            return;
        }
        else {
            allAccount.Add(username, password);
            print("注册成功!!");
        }
    }

还是这个方法,我们需要将allAccount中的数据写入到Json文件中,实现数据的保存;

首先引用一下: 注:这一步前需要先将Json文件导入到你的项目中,再新建一个.txt格式的储存信息的文件

注:这一步前需要先将LitJson文件导入到你的项目中,再新建一个.txt格式的储存信息的文件(我的文件名字是RegisteJson.txt)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using LitJson;
using System.IO;

开始写入文件:(写入文件后需要关闭文件写入工具,刷新储存文件)

else {
            //将数据存入字典中
            allAccount.Add(username, password);

            //将数据存入Json文件中
            //声明一个字符串类型来储存文件的位置
            string path = Application.dataPath + "/Appconfig/RegisteJson.txt";
            //记录储存文件的信息
            FileInfo file = new FileInfo(path);
            if (!file.Exists) {
                //如果找不到文件则警告
                Debug.LogError("找不到储存文件!!!!!");
            }
            //开始写入数据
            //创建一个写入对象,用于写入数据
            StreamWriter writer = new StreamWriter(path );
            //将字典内容转换成Json可识别内容(不知道怎么形容好........)
            JsonData jd = JsonMapper.ToJson(allAccount);
            //写入数据
            writer.Write(jd);
            //关闭写入器
            writer.Close();
            //刷新储存文件
            file.Refresh();

            print("注册成功!!");
            return;

        }

然后就是返回按钮的事件了:

//返回按钮事件
    public void BackButton() {
        signUp.gameObject.SetActive(false);
        login.gameObject.SetActive(true);
    }

由于写入模式是覆盖式,所以我们需要在开始时将数据读取出来储存到字典中:

创建一个读取数据方法:

//读取数据方法
    public void ReadJson() {
        //读取数据
        //声明一个字符串类型来储存文件的位置
        string path = Application.dataPath + "/Appconfig/RegisteJson.txt";
        //记录储存文件的信息
        FileInfo file = new FileInfo(path);
        if (!file.Exists)
        {
            //如果找不到文件则警告
            Debug.LogError("找不到储存文件!!!!!");
        }
        //读取数据
        string all = File.ReadAllText(path);
        allAccount = JsonMapper.ToObject<Dictionary<string, string>>(all );
    }

然后在start()方法中调用读取数据方法:

void Start () {
        login = GameObject.Find("LoginPanel").GetComponent <UIPanel >();
        signUp  = GameObject.Find("Register").GetComponent<UIPanel>();
        un = GameObject.Find("LoginPanel/Username/un").GetComponent<UIInput >();
        pw = GameObject.Find("LoginPanel/Password/pw").GetComponent<UIInput>();
        reun = GameObject.Find("Register/Username/un").GetComponent<UIInput>();
        repw = GameObject.Find("Register/Password/pw").GetComponent<UIInput>();
        repw2 = GameObject.Find("Register/RePassword/pw").GetComponent<UIInput>();
        signUp.gameObject.SetActive(false);
        ReadJson();

    }

至此,我们的一些小功能就全部实现了!!!