unity 常用的数据读取与存储的方法(PlayerPrefs、XML、Json)解读

PlayerPrefs

PlayerPrefs是unity中一个用于本地持久化保存与读取的类。它以键值对的形式将数据保存在文件中,
然后程序可以根据这个名称取出上次保存的数值。
PlayerPrefs类支持3中数据类型的保存和读取,浮点型,整形,和字符串型。
分别对应的函数为:
SetInt();保存整型数据;
GetInt();读取整形数据;
SetFloat();保存浮点型数据;
GetFlost();读取浮点型数据;
SetString();保存字符串型数据;
GetString();读取字符串型数据;

用法如下:


//PlayerPrefs 的存储功能

  PlayerPrefs.SetInt ("yong", 110);
  
  PlayerPrefs.SetString (m_UserName, m_PassWord);
  //读取数据功能
  
  print (PlayerPrefs.GetInt ("yong"));
  
  // 输出为110
  
  //提供的其他方法

PlayerPrefs.DeleteKey (key) //删除指定数据

PlayerPrefs.DeleteAll() //删除全部键 

PlayerPrefs.HasKey (key)//判断数据是否存在的方法

if (PlayerPrefs.HasKey("isShow"))
{
  //TODO
}
  

XML

1、引入命名空间


using System.Xml;

2、创建XML文档


// 创建XML文档
  void CreatXML ()
  {
    // 创建一个声明
    XmlDeclaration dec = doc.CreateXmlDeclaration ("1.0", "UTF-8", null);
    // 将声明拼接到文档中去
    doc.AppendChild (dec);

    //创建一个根元素节点
    XmlNode rootNode = doc.CreateNode (XmlNodeType.Element, "Transform", null);
    // 对这个根元素节点添加属性
    XmlAttribute attr = doc.CreateAttribute ("name");
    attr.Value = "YourCube";   //给属性赋值
    //将刚刚创建的属性放进根元素节点标签中去
    rootNode.Attributes.SetNamedItem (attr);

    // 拼接到xml文档里去
    doc.AppendChild (rootNode);
    // 效果展示  <Transform name="MyCube" tag="CubeTag">

    // 创建一个子元素 添加到根元素节点中
    XmlElement pos = doc.CreateElement ("Position");

    XmlElement pos_X = doc.CreateElement ("x");
    XmlElement pos_Y = doc.CreateElement ("y");
    XmlElement pos_Z = doc.CreateElement ("z");

    pos_X.InnerText = "78";
    pos_Y.InnerText = "30";
    pos_Z.InnerText = "56";

    pos.AppendChild (pos_X);
    pos.AppendChild (pos_Y);
    pos.AppendChild (pos_Z);

    // 拼接到根节点中去
    rootNode.AppendChild (pos);

    // 记得保存文档
    //Application.dataPath 路径就是Assets文件夹
    // 记得在文件前写/ 表示在这个文件夹下
    doc.Save (Application.dataPath + "/XML/MonoCodeXML.xml");
  } 

3、解析XML文档


// 解析XML文档
  void AnalyzeXML ()
  {
    // 首先拿到文档 [用xml文档实例去加载这个文档]
    doc.Load (Application.dataPath + "/XML/MonoCodeXML.xml");

    //根据文档的数据结构, 来分析如何获取想要的数据

    // 拿到根元素节点
    XmlElement root = doc.DocumentElement;
    //print (root.Name);
    // root.FirstChild 就是这一层级下面的一个子元素节点
    XmlNode pos_X = root.FirstChild.FirstChild;

    // X子节点中存储的数据内容
    string pos_X_String = pos_X.InnerText;
    //print (pos_X_String);

    //或者通过层级路径拿到这个节点的内容
    XmlNode pos_x = root.SelectSingleNode ("/Transform/Position/x");
    print (pos_x.InnerText);
  } 

4、完整脚本



using UnityEngine;
using System.Collections;
using System.Xml;

public class CreatXMLScript : MonoBehaviour
{

  // 创建一个文档
  XmlDocument doc = new XmlDocument ();

  void Start ()
  {
    CreatXML ();
    AnalyzeXML ();
  }

  // 创建XML文档
  void CreatXML ()
  {
    // 创建一个声明
    XmlDeclaration dec = doc.CreateXmlDeclaration ("1.0", "UTF-8", null);
    // 将声明拼接到文档中去
    doc.AppendChild (dec);


    //创建一个根元素节点
    XmlNode rootNode = doc.CreateNode (XmlNodeType.Element, "Transform", null);
    // 对这个根元素节点添加属性
    XmlAttribute attr = doc.CreateAttribute ("name");
    attr.Value = "YourCube";   //给属性赋值
    //将刚刚创建的属性放进根元素节点标签中去
    rootNode.Attributes.SetNamedItem (attr);

    // 拼接到xml文档里去
    doc.AppendChild (rootNode);
    // 效果展示  <Transform name="MyCube" tag="CubeTag">


    // 创建一个子元素 添加到根元素节点中
    XmlElement pos = doc.CreateElement ("Position");

    XmlElement pos_X = doc.CreateElement ("x");
    XmlElement pos_Y = doc.CreateElement ("y");
    XmlElement pos_Z = doc.CreateElement ("z");

    pos_X.InnerText = "78";
    pos_Y.InnerText = "30";
    pos_Z.InnerText = "56";

    pos.AppendChild (pos_X);
    pos.AppendChild (pos_Y);
    pos.AppendChild (pos_Z);

    // 拼接到根节点中去
    rootNode.AppendChild (pos);


    // 记得保存文档
    //Application.dataPath 路径就是Assets文件夹
    // 记得在文件前写/ 表示在这个文件夹下
    doc.Save (Application.dataPath + "/XML/MonoCodeXML.xml");

  }


  // 解析XML文档
  void AnalyzeXML ()
  {
    // 首先拿到文档 [用xml文档实例去加载这个文档]
    doc.Load (Application.dataPath + "/XML/MonoCodeXML.xml");

    //根据文档的数据结构, 来分析如何获取想要的数据

    // 拿到根元素节点
    XmlElement root = doc.DocumentElement;
    //print (root.Name);
    // root.FirstChild 就是这一层级下面的一个子元素节点
    XmlNode pos_X = root.FirstChild.FirstChild;

    // X子节点中存储的数据内容
    string pos_X_String = pos_X.InnerText;
    //print (pos_X_String);

    //或者通过层级路径拿到这个节点的内容
    XmlNode pos_x = root.SelectSingleNode ("/Transform/Position/x");
    print (pos_x.InnerText);
  }
}
 

Json 数据解析

1、JsonUtility untiy 自带的解析工具 无需引用命名空间


using UnityEngine;

using System.Collections.Generic;

//此脚本使用的是System.Json 来操作JSON数据的
//将System.Json.dll 拉到unity  Plugins 文件夹下
// System.Json.dll 文件位置   unity安装位置下
//  Editor\Data\Mono\lib\mono\unity\System.Json.dll
using System.Json;

//数据流的写入和读取
using System.IO;

//让编辑器刷新资源
using UnityEditor;

using System.Text;

using System;

public class CreatJsonScript : MonoBehaviour
{
  void Start()
    {
        // 使用代码创建JSON 保存数据
        //CreatJSONData ();
        // 解析JSON
        ParseJSONData();
    }

    // 创建json
    void CreatJSONData()
    {
        // 写一个大括号
        JsonObject Students = new JsonObject();
       
        // Q W E R
        JsonObject message_1 = new JsonObject();
        JsonObject message_2 = new JsonObject();
        JsonObject message_3 = new JsonObject();
        JsonObject message_4 = new JsonObject();

        // 填充数据
        message_1.Add("Subject", "语文");
        message_1.Add("Stage", "一考");
        message_1.Add("Score", "93");
        message_1.Add("Ranking", "7");

        message_2.Add("Subject", "数学");
        message_2.Add("Stage", "一考");
        message_2.Add("Score", "95");
        message_2.Add("Ranking", "5");

        message_3.Add("Subject", "英语");
        message_3.Add("Stage", "一考");
        message_3.Add("Score", "96");
        message_3.Add("Ranking", "4");

        message_4.Add("Subject", "物理");
        message_4.Add("Stage", "一考");
        message_4.Add("Score", "99");
        message_4.Add("Ranking", "2");

        // 信息数组
        JsonArray MessageArr = new JsonArray();
        MessageArr.Add(message_1);
        MessageArr.Add(message_2);
        MessageArr.Add(message_3);
        MessageArr.Add(message_4);

        Students.Add("Messages", MessageArr);
        Students.Add("StudentName", "小明");
        Students.Add("StudentGrade", 6);
        Students.Add("StudentID", 258);

        print (Students.ToString ());

        // 拓展-- 数据留存档
        // 创建数据流的写入
        StreamWriter writer = new StreamWriter(Application.dataPath + "/Json/MySystemJSON.txt");
        Students.Save(writer);
        //自动装载缓冲区
        writer.AutoFlush = true;

        writer.Close();

        //让编辑器刷新资源
        AssetDatabase.Refresh();
    }

    void ParseJSONData()
    {
        // 本地文件的读取
        FileInfo file = new FileInfo(Application.dataPath + "/Json/MySystemJSON.txt");
        StreamReader reader = new StreamReader(file.OpenRead(), Encoding.UTF8);
        string str = reader.ReadToEnd();

       // print (str);
        reader.Close();
        // 释放资源
        reader.Dispose();
        // 开始解析
        StudentInfo m_StudentInfo = JsonUtility.FromJson<StudentInfo>(str);
        
        for (int i = 0; i < m_StudentInfo.Messages.Count; i++)
        {
            print(m_StudentInfo.Messages[i].Score); //93 95 96 99
        }
    }
    //创建数据模型 接受解析数据 [因为我们是面向对象开发的]
    // 将我们在需要数据的地方直接使用类就可以点出这个模型

    //序列化  你发个qq 消息别人接收你的qq消息 不会分别将不同的数据类型发送或接收
    // 序列化后 相当于将消息编码加密 解密
    //[SerializeField] 修饰私有字段的 [强制将脚本中的私有变量在unity面板中出现 可以实现引用拖拽 但是其他脚本还是拿不到这个变量]


    //[Serializable]  修饰对象 作用 将对象序列化为二进制数据流 byte 类型  传输数据或解析数据

    [Serializable]
    public class Message
    {
        public string Subject = "";
        public string Stage = "";
        public string Score = "";
        public string Ranking = "";
    }

    [Serializable]
    public class StudentInfo
    {
        public List<Message> Messages = new List<Message>();
        public string StudentName = "";
        public float StudentGrade;
        public float StudentID;
    }
}
 

system.json创建的json数据结构如下:


{
    "Messages": [{
        "Subject": "语文",
        "Stage": "一考",
        "Score": "93",
        "Ranking": "7"
    }, {
        "Subject": "数学",
        "Stage": "一考",
        "Score": "95",
        "Ranking": "5"
    }, {
        "Subject": "英语",
        "Stage": "一考",
        "Score": "96",
        "Ranking": "4"
    }, {
        "Subject": "物理",
        "Stage": "一考",
        "Score": "99",
        "Ranking": "2"
    }],
    "StudentName": "小明",
    "StudentGrade": 6,
    "StudentID": 258
}

2、JsonMapper 需引用命名空间 using LitJson; //需要将LitJson加到Plugins里面

LitJson下载 https://pan.baidu.com/s/1eeJn8H8EO7wRxqcK32J-Ug


using UnityEngine;
using System.Collections;
using LitJson;
using System.IO;
using UnityEditor;
using System.Text;
using System;

public class LitJSONScript : MonoBehaviour
{
      void Start()
    {
        //使用LitJSON创建JSON数据
      //  CreatJSONByLit ();

        // 使用LitJSON解析数据
        ParseJSONLit();
    }

    void CreatJSONByLit()
    {
        //创建一个JSON结构的实例
        JsonData Students = new JsonData();
        Students["StudentName"] = "xioaming";
        Students["StudentGrade"] =7;
        Students["StudentID"] = 122;

        Students["Messages"] = new JsonData();

        // 小技能
        JsonData message_1 = new JsonData();

        message_1["Subject"] = "Chinese";
        message_1["Stage"] = "First";
        message_1["Score"] = "115";
        message_1["Ranking"] = "6";

        JsonData message_2 = new JsonData();

        message_2["Subject"] = "Maths";
        message_2["Stage"] = "First";
        message_2["Score"] = "119";
        message_2["Ranking"] = "2";

        Students["Messages"].Add(message_1);
        Students["Messages"].Add(message_2);

        print(Students.ToJson());

        // 保存到本地 并刷新
        SaveJson(Students.ToJson());
    }

    private void SaveJson(string json)
    {
        string path = Application.dataPath + "/Json/MyLitJsonByMono.txt";
        // 文件流创建一个文本文件
        FileStream file = new FileStream(path, FileMode.Create);
        //得到字符串的UTF8 数据流
        byte[] bts = System.Text.Encoding.UTF8.GetBytes(json);
        // 文件写入数据流
        file.Write(bts, 0, bts.Length);
        if (file != null)
        {
            //清空缓存
            file.Flush();
            // 关闭流
            file.Close();
            //销毁资源
            file.Dispose();
        }
    }

    void ParseJSONLit()
    {
        //
        StreamReader reader = new StreamReader(Application.dataPath + "/Json/MyLitJsonByMono.txt");
        string str = reader.ReadToEnd();
        //print (str);
        reader.Close();
        reader.Dispose();
        //开始解析数据
        JsonData data = JsonMapper.ToObject(str);
        // 拿到JSON的对象
        print(data["StudentName"]);    //xioaming

        for (int i = 0; i < data["Messages"].Count; i++)
        {
            print(data["Messages"][i]["Subject"]);     //Chinese     Maths
        }
    }
}

litjson创建的json如下:


{
    "StudentName": "xioaming",
    "StudentGrade": 7,
    "StudentID": 122,
    "Messages": [{
        "Subject": "Chinese",
        "Stage": "First",
        "Score": "115",
        "Ranking": "6"
    }, {
        "Subject": "Maths",
        "Stage": "First",
        "Score": "119",
        "Ranking": "2"
    }]
}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350