首页 > 代码库 > Unity C#数据持久化与xml

Unity C#数据持久化与xml

最近工作需要用到数据持久化,所以在此分享一下,通过查阅资料,数据持久化大体都是通过xml或者json来进行的。unity为我们自定义了数据持久化方法,但是比较局限,还需要自己来完成数据持久化方法。

(一)unity方法

unity提供了三个方法来实现数据持久化,不过只能对int float string类型进行数据持久化,命令如下

        //设定Key=float的值为12f
        PlayerPrefs.SetFloat("float", 12f);
        //通过key值“float”获取数值12,如果“float”未设定值,则默认为1f
        PlayerPrefs.GetFloat("float", 1f);
        //相关定义与setfloat相同
        PlayerPrefs.SetInt("int", 12);
        PlayerPrefs.GetInt("int", 1);
        PlayerPrefs.SetString("str", "abc");
        PlayerPrefs.GetString("str", "default");

unity提供的方法比较局限,复杂数据还需要自己进行数据可持续化

(二)C#与xml

通过C#编写读取修改xml

1)编写xml

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;

namespace XmlRW
{
    class Program
    {
        static void Main(string[] args)
        {
            XmlDocument  xmldoc = new XmlDocument();
            //加入XML的声明段落,<?xml version="1.0" encoding="gb2312"?>
            XmlDeclaration xmldecl;
            xmldecl = xmldoc.CreateXmlDeclaration("1.0", "gb2312", null);
            xmldoc.AppendChild(xmldecl);

            //加入一个根元素
            XmlElement xmlelem = xmldoc.CreateElement("", "ToolAndFrame", "");
            xmldoc.AppendChild(xmlelem);
       
            for (int i = 1; i < 3; i++)
            {
                string identifyStr;
                string id;
                int count;
                if(i==1)
                {
                    identifyStr = "tool";
                    count = 16;
                }
                else
                {
                    identifyStr = "frame";
                    count = 32;
                }
                //增加次级节点
                XmlNode root = xmldoc.SelectSingleNode("ToolAndFrame");//查找<ToolAndFrame> 
                XmlElement elem = xmldoc.CreateElement(identifyStr);//创建一个<identifyStr>节点 
                elem.SetAttribute("ID", identifyStr);//设置该节点ID属性 
                //xe1.SetAttribute("ISBN", "2-3631-4");//设置该节点ISBN属性 

                for(int j=0;j<count;j++)
                {
                    XmlElement toolElem = xmldoc.CreateElement("elem"+i.ToString());
                    toolElem.SetAttribute("ID", j.ToString());
                    toolElem.InnerText = "未知        [?]";
                    elem.AppendChild(toolElem);
                }

                root.AppendChild(elem);//添加到<Employees>节点中 
            }
            xmldoc.Save("ToolAndFrame.xml");
        }
    }
}

2)读取

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;

namespace ReadXml
{
    class Program
    {
        static void Main(string[] args)
        {
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load("ToolAndFrame.xml");
            List<string> strList = new List<string>();
            XmlNodeList nodeList = xmlDoc.SelectSingleNode("ToolAndFrame").ChildNodes;//获取Employees节点的所有子节点 

            foreach (XmlNode temp in nodeList)//遍历所有子节点 
            {
                XmlElement elem = (XmlElement)temp;//将子节点类型转换为XmlElement类型 
                //if (elem.GetAttribute("genre") == "张三")//如果genre属性值为“张三” 
                //{
                //    elem.SetAttribute("genre", "update张三");//则修改该属性为“update张三” 
                //}
                XmlNodeList childElem = elem.ChildNodes;//继续获取xe子节点的所有子节点 
                foreach (XmlNode node in childElem)//遍历 
                {
                    XmlElement xml = (XmlElement)node;//转换类型 
                    //if (xml.Name == "author")//如果找到 
                    //{
                    //    xml.InnerText = "亚胜";//则修改
                    //}
                    strList.Add(xml.InnerText);
                }
            }

            foreach(string str in strList)
            {
                Console.WriteLine(str);
            }
            Console.WriteLine(strList.Count);
            Console.ReadKey();
        }
    }
}

3)查找与更改

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;

namespace ChangeText
{
    class Program
    {
        static void Main(string[] args)
        {
            string id = "tool";
            int num = 7;
            string text = "new Name";
            ChangeVal(id, num, text);            
        }
        public static void ChangeVal(string id,int num,string text)
        {
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load("ToolAndFrame.xml");
          //  List<string> strList = new List<string>();
            XmlNodeList nodeList = xmlDoc.SelectSingleNode("ToolAndFrame").ChildNodes;//获取Employees节点的所有子节点 

            foreach (XmlNode temp in nodeList)//遍历所有子节点 
            {
                XmlElement elem = (XmlElement)temp;//将子节点类型转换为XmlElement类型 
                if (elem.Name == id)//如果genre属性值为“张三” 
                {
                    Console.WriteLine(elem.GetAttribute("ID"));
                    Console.WriteLine(elem.Name);

                    XmlNodeList childElem = elem.ChildNodes;//继续获取xe子节点的所有子节点 
                    foreach (XmlNode node in childElem)//遍历 
                    {
                        XmlElement xml = (XmlElement)node;//转换类型 
                        if (xml.GetAttribute("ID") == num.ToString())
                        {
                            xml.InnerText = text;
                            break;
                        }
                    }
                    break;
                }         
            }
            xmlDoc.Save("ToolAndFrame.xml");
            Console.ReadKey();
        }
    }
}

本文查找与更改只是更改了属性,如果需要添加节点或者删除节点,只需要查找到相关节点以后,用命令remvoechild即可,最后一定要保存

Unity C#数据持久化与xml