最近看了C#操作xml文件的方法,然后打算使用xml加NGUI实现角色信息存储或者存档,好了废话不多说先入正题,咱们开始做准备工作,这个教程使用的是NGUI3.0.6。
第一步:先导入NGUI、然后新建3个文件夹Scene、Script、Prefabs分别用来存放场景、脚本、预设,然后使用NGUI创建一个2DUI如图:
第二步:咱们开始写第一个脚本,作为xml文件存储的数据结构,新建个C#脚本,命名为XmlDataStructure,这里就简单的定义一下角色信息(实际中肯定很复杂的,比如玩家的位置啊,当前血量,技能等级等等,这些大家可以自己建立,这里主要提供一个思路),我这里只定义了6个属性变量代码如下: - using System;
- /// <summary>
- /// Xml data structure.定义一个xml存储的数据结构,数据以后可以扩展
- /// </summary>
- public class XmlDataStructure {
- /// <summary>
- /// The identifier.id索引、名称、职业、等级、剩余经验、创建时间
- /// </summary>
- public int id ;
- public string name ;
- public string occupation ;
- public int level ;
- public int freeExp ;
- public string createtime ;
- /// <summary>
- /// Initializes a new instance of the <see cref="XmlDataStructure"/> class.构造函数
- /// </summary>
- /// <param name="_id">_id.</param>
- /// <param name="_name">_name.</param>
- /// <param name="_occupation">_occupation.</param>
- /// <param name="_level">_level.</param>
- /// <param name="_freeexp">_freeexp.</param>
- /// <param name="_createtime">_createtime.</param>
- public XmlDataStructure(string _name ,string _occupation , int _level , int _freeexp , string _createtime){
- name = _name ;
- occupation = _occupation ;
- level = _level ;
- freeExp = _freeexp ;
- createtime = _createtime ;
- }
- /// <summary>
- /// Initializes a new instance of the <see cref="XmlDataStructure"/> class.空构造函数
- /// </summary>
- public XmlDataStructure(){
- }
- }
复制代码这段代码很简单就定义了一个简单的类,来存放角色的信息,大家可以自己扩充。
然后创建第二个脚本,命名为XmlManager,这个是操作xml文件的核心类,所有xml的操作都在这个类里面,这个类有几个重要的函数:
AddRole-->这个函数负责将玩家数据写入xml文件
ClearXmlFile-->这个函数负责清空xml文件内容,也就是清除所有的角色信息(慎用)
ReFreshXmlId-->这个函数负责对xml文件里面的角色id重新排序,主要在xml里面有角色被删除的时候使用
GetDataFromXml-->这个函数是从xml文件中读取角色或者存档信息,结果保存在一个线性表里面
RemoveItemById-->这个函数是从xml文件中删除指定id的角色信息
代码如下: - using System.IO;
- using System.Xml;
- using UnityEngine;
- using System;
- using System.Collections.Generic;
- public class XmlManager {
- public enum XmlRandS{
- xml_role ,
- xml_save
- };
- private static string XmlDir_Path = Application.dataPath + "/XmlDir" ;
- private XmlDocument _xmlDoc = new XmlDocument();
- public List<XmlDataStructure> dataSetList ;
- #region XmlRole_Path
- private string XmlRole_Path = XmlDir_Path + "/Roles.xml" ;
- private string XmlRole_root = "Roles" ;
- #endregion
- #region XmlSave_Path
- private string XmlSave_Path = XmlDir_Path + "/Saves.xml" ;
- private string XmlSave_root = "Saves" ;
- #endregion
- public XmlManager(){
- Init();
- }
- /// <summary>
- /// Init this instance.检测文件是否存在
- /// </summary>
- void Init(){
- if(!Directory.Exists(XmlDir_Path)){
- Directory.CreateDirectory(XmlDir_Path);
- }
- CheckAndCreateXml(XmlRole_Path,XmlRole_root);
- CheckAndCreateXml(XmlSave_Path,XmlSave_root);
- }
- /// <summary>
- /// Checks the and create xml.判断xml是否存在,不存在就创建一个,并同时创建根节点
- /// </summary>
- /// <param name="_name">_name.</param>
- /// <param name="_root">_root.</param>
- void CheckAndCreateXml(string _name , string _root){
- if(!File.Exists(_name)){
- //File.Create(_name);
- XmlDocument tempDoc = new XmlDocument();
- //tempDoc.Load(_name);
- XmlElement rootNode = tempDoc.CreateElement(_root);
- tempDoc.AppendChild(rootNode);
- tempDoc.Save(_name);
- }
- }
- /// <summary>
- /// Adds the role.向xml文件中添加一个角色或者添加一个存档
- /// </summary>
- /// <param name="_roleData">_role data.</param>
- /// <param name="r_and_s">R_and_s.</param>
- public void AddRole(XmlDataStructure _roleData,XmlRandS r_and_s){
- string _xmlpath = "";
- string newNodeName = "";
- switch(r_and_s){
- case XmlRandS.xml_role:
- _xmlpath = XmlRole_Path;
- newNodeName = "Role" ;
- break ;
- case XmlRandS.xml_save:
- _xmlpath = XmlSave_Path;
- newNodeName = "Save" ;
- break ;
- }
- _xmlDoc.Load(_xmlpath);
- if(!_xmlDoc.DocumentElement.HasChildNodes){
- _roleData.id = 0 ;
- }else{
- _roleData.id = Convert.ToInt32(_xmlDoc.DocumentElement.LastChild.Attributes[0].InnerText) + 1 ;
- }
- XmlElement newNode = _xmlDoc.CreateElement(newNodeName);
- newNode.SetAttribute("id",_roleData.id.ToString());
- newNode.SetAttribute("time",_roleData.createtime);
- _xmlDoc.DocumentElement.AppendChild(newNode);
- XmlElement nameNode = _xmlDoc.CreateElement("name");
- nameNode.InnerText = _roleData.name ;
- XmlElement occuNode = _xmlDoc.CreateElement("occu");
- occuNode.InnerText = _roleData.occupation ;
- XmlElement levelNode = _xmlDoc.CreateElement("level");
- levelNode.InnerText = _roleData.level.ToString() ;
- XmlElement expNode = _xmlDoc.CreateElement("exp");
- expNode.InnerText = _roleData.freeExp.ToString() ;
- newNode.AppendChild(expNode);
- newNode.AppendChild(levelNode);
- newNode.AppendChild(occuNode);
- newNode.AppendChild(nameNode);
- _xmlDoc.Save(_xmlpath);
- }
- /// <summary>
- /// Clears the xml file.清空整个xml文件
- /// </summary>
- /// <param name="r_and_s">R_and_s.</param>
- public void ClearXmlFile(XmlRandS r_and_s){
- string _xmlpath = "";
- switch(r_and_s){
- case XmlRandS.xml_role:
- _xmlpath = XmlRole_Path;
- break ;
- case XmlRandS.xml_save:
- _xmlpath = XmlSave_Path;
- break ;
- }
- _xmlDoc.Load(_xmlpath);
- _xmlDoc.DocumentElement.RemoveAll();
- _xmlDoc.Save(_xmlpath);
- }
- /// <summary>
- /// Res the fresh xml identifier.当xml中有节点被删除的时候从新排下节点的id。
- /// </summary>
- /// <param name="r_and_s">R_and_s.</param>
- public void ReFreshXmlId(XmlRandS r_and_s){
- string _xmlpath = "";
- switch(r_and_s){
- case XmlRandS.xml_role:
- _xmlpath = XmlRole_Path;
- break ;
- case XmlRandS.xml_save:
- _xmlpath = XmlSave_Path;
- break ;
- }
- _xmlDoc.Load(_xmlpath);
- if(_xmlDoc.DocumentElement.HasChildNodes){
- XmlNodeList _chilidlist = _xmlDoc.DocumentElement.ChildNodes ;
- int i = 0 ;
- foreach(XmlNode xn in _chilidlist){
- XmlElement xe = (XmlElement)xn ;
- xe.Attributes[0].InnerText = (i++).ToString();
- }
- }
- _xmlDoc.Save(_xmlpath);
- }
- /// <summary>
- /// Gets the data from xml.先打开xml然后读取xml里面的内容
- /// </summary>
- /// <returns>The data from xml.</returns>
- /// <param name="r_and_s">R_and_s.</param>
- public List<XmlDataStructure> GetDataFromXml(XmlRandS r_and_s){
- string _xmlpath = "";
- switch(r_and_s){
- case XmlRandS.xml_role:
- _xmlpath = XmlRole_Path;
- break ;
- case XmlRandS.xml_save:
- _xmlpath = XmlSave_Path;
- break ;
- }
- _xmlDoc.Load(_xmlpath);
- dataSetList = new List<XmlDataStructure>();
- if(_xmlDoc.DocumentElement.HasChildNodes){
- dataSetList.Clear();
- XmlNodeList _chilidlist = _xmlDoc.DocumentElement.ChildNodes ;
- foreach(XmlNode xn in _chilidlist){
- XmlElement xe = (XmlElement)xn ;
- XmlDataStructure xds = new XmlDataStructure(xe.ChildNodes[3].InnerText,
- xe.ChildNodes[2].InnerText,
- Convert.ToInt32(xe.ChildNodes[0].InnerText),
- Convert.ToInt32(xe.ChildNodes[1].InnerText),
- xe.Attributes[1].InnerText) ;
- xds.id = Convert.ToInt32(xe.Attributes[0].InnerText);
- dataSetList.Add(xds);
- }
- }
- _xmlDoc.Save(_xmlpath);
- return dataSetList ;
- }
- /// <summary>
- /// Removes the item by identifier.通过id属性找到节点,然后删除
- /// </summary>
- /// <param name="id">Identifier.</param>
- /// <param name="r_and_s">R_and_s.</param>
- public void RemoveItemById(int id , XmlRandS r_and_s){
- string _xmlpath = "";
- switch(r_and_s){
- case XmlRandS.xml_role:
- _xmlpath = XmlRole_Path;
- break ;
- case XmlRandS.xml_save:
- _xmlpath = XmlSave_Path;
- break ;
- }
- _xmlDoc.Load(_xmlpath);
- if(_xmlDoc.DocumentElement.HasChildNodes){
- XmlNodeList _chilidlist = _xmlDoc.DocumentElement.ChildNodes ;
- for(int i = 0 ; i < _chilidlist.Count ; ++i){
- if(_chilidlist[i].Attributes[0].InnerText == id.ToString()){
- _xmlDoc.DocumentElement.RemoveChild(_chilidlist[i]);
- break;
- }
- }
- }
- _xmlDoc.Save(_xmlpath);
- //ReFreshXmlId(r_and_s);
- }
- }
复制代码 好了到现在为止咱们已经把核心代码搞定了,那么接下来咱们插播一点界面元素:
先将UICamera下的Anchor复制一个,分别命名为:Info(UIAnchor的side属性设为TopLeft)和Buttons(UIAnchor的side属性设为BottomRight),然后在Buttons的panel下创建一个按钮,给按钮添加一个label,复制这个按钮,修改名称分别为:Create、Load,并修改它们的label值为:创建角色,返回登录,结构如下:
然后设计信息面板,在Info的panel下创建一个空物体命名为Item(这里记得修改它的层为2DUI,并且reset它的transform)然后给Item添加一个Label和一个Input控件,然后将Item复制3个,并且将Label的内容修改成,姓名、职业、等级、经验(这些其实是从游戏里面读取的,这里就直接输入好了,其实在游戏存储的时候这些值都是知道的),然后给Info的panel添加一个ngui的UITable脚本设置Columns = 1 ,最终效果如下图:
字数限制你妹啊,好吧去下一篇
http://www.narkii.com/club/thread-312931-1.html
|