查看: 5702|回复: 6
打印 上一主题 下一主题

[教程] Unity3D角色信息列表or(存档)制作xml版(1)

[复制链接]

3

主题

2

听众

177

积分

设计实习生

Rank: 2

纳金币
55
精华
0

最佳新人

跳转到指定楼层
楼主
发表于 2013-12-30 09:30:52 |只看该作者 |倒序浏览
最近看了C#操作xml文件的方法,然后打算使用xml加NGUI实现角色信息存储或者存档,好了废话不多说先入正题,咱们开始做准备工作,这个教程使用的是NGUI3.0.6。
第一步:先导入NGUI、然后新建3个文件夹Scene、Script、Prefabs分别用来存放场景、脚本、预设,然后使用NGUI创建一个2DUI如图:
0.jpg
第二步:咱们开始写第一个脚本,作为xml文件存储的数据结构,新建个C#脚本,命名为XmlDataStructure,这里就简单的定义一下角色信息(实际中肯定很复杂的,比如玩家的位置啊,当前血量,技能等级等等,这些大家可以自己建立,这里主要提供一个思路),我这里只定义了6个属性变量代码如下:
  1. using System;
  2. /// <summary>
  3. /// Xml data structure.定义一个xml存储的数据结构,数据以后可以扩展
  4. /// </summary>
  5. public class XmlDataStructure {
  6.         /// <summary>
  7.         /// The identifier.id索引、名称、职业、等级、剩余经验、创建时间
  8.         /// </summary>
  9.         public int id ;
  10.         public string name ;
  11.         public string occupation ;
  12.         public int level ;
  13.         public int freeExp ;
  14.         public string createtime ;
  15.         /// <summary>
  16.         /// Initializes a new instance of the <see cref="XmlDataStructure"/> class.构造函数
  17.         /// </summary>
  18.         /// <param name="_id">_id.</param>
  19.         /// <param name="_name">_name.</param>
  20.         /// <param name="_occupation">_occupation.</param>
  21.         /// <param name="_level">_level.</param>
  22.         /// <param name="_freeexp">_freeexp.</param>
  23.         /// <param name="_createtime">_createtime.</param>
  24.         public XmlDataStructure(string _name ,string _occupation , int _level , int _freeexp , string _createtime){
  25.                 name = _name ;
  26.                 occupation = _occupation ;
  27.                 level = _level ;
  28.                 freeExp = _freeexp ;
  29.                 createtime = _createtime ;
  30.         }
  31.         /// <summary>
  32.         /// Initializes a new instance of the <see cref="XmlDataStructure"/> class.空构造函数
  33.         /// </summary>
  34.         public XmlDataStructure(){

  35.         }
  36. }
复制代码
这段代码很简单就定义了一个简单的类,来存放角色的信息,大家可以自己扩充。
然后创建第二个脚本,命名为XmlManager,这个是操作xml文件的核心类,所有xml的操作都在这个类里面,这个类有几个重要的函数:
AddRole-->这个函数负责将玩家数据写入xml文件
ClearXmlFile-->这个函数负责清空xml文件内容,也就是清除所有的角色信息(慎用)
ReFreshXmlId-->这个函数负责对xml文件里面的角色id重新排序,主要在xml里面有角色被删除的时候使用
GetDataFromXml-->这个函数是从xml文件中读取角色或者存档信息,结果保存在一个线性表里面
RemoveItemById-->这个函数是从xml文件中删除指定id的角色信息
代码如下:
  1. using System.IO;
  2. using System.Xml;
  3. using UnityEngine;
  4. using System;
  5. using System.Collections.Generic;

  6. public class XmlManager {
  7.         public enum XmlRandS{
  8.                 xml_role ,
  9.                 xml_save
  10.         };
  11.         private static string XmlDir_Path = Application.dataPath + "/XmlDir" ;
  12.         private XmlDocument _xmlDoc = new XmlDocument();
  13.         public List<XmlDataStructure> dataSetList ;

  14.         #region XmlRole_Path
  15.         private string XmlRole_Path = XmlDir_Path + "/Roles.xml" ;
  16.         private string XmlRole_root = "Roles" ;
  17.         #endregion

  18.         #region XmlSave_Path
  19.         private string XmlSave_Path = XmlDir_Path + "/Saves.xml" ;
  20.         private string XmlSave_root = "Saves" ;
  21.         #endregion

  22.         public XmlManager(){
  23.                 Init();
  24.         }
  25.         /// <summary>
  26.         /// Init this instance.检测文件是否存在
  27.         /// </summary>
  28.         void Init(){
  29.                 if(!Directory.Exists(XmlDir_Path)){
  30.                         Directory.CreateDirectory(XmlDir_Path);
  31.                 }
  32.                 CheckAndCreateXml(XmlRole_Path,XmlRole_root);
  33.                 CheckAndCreateXml(XmlSave_Path,XmlSave_root);
  34.         }
  35.         /// <summary>
  36.         /// Checks the and create xml.判断xml是否存在,不存在就创建一个,并同时创建根节点
  37.         /// </summary>
  38.         /// <param name="_name">_name.</param>
  39.         /// <param name="_root">_root.</param>
  40.         void CheckAndCreateXml(string _name , string _root){
  41.                 if(!File.Exists(_name)){
  42.                         //File.Create(_name);
  43.                         XmlDocument tempDoc = new XmlDocument();
  44.                         //tempDoc.Load(_name);
  45.                         XmlElement rootNode = tempDoc.CreateElement(_root);
  46.                         tempDoc.AppendChild(rootNode);
  47.                         tempDoc.Save(_name);
  48.                 }
  49.         }

  50.         /// <summary>
  51.         /// Adds the role.向xml文件中添加一个角色或者添加一个存档
  52.         /// </summary>
  53.         /// <param name="_roleData">_role data.</param>
  54.         /// <param name="r_and_s">R_and_s.</param>
  55.         public void AddRole(XmlDataStructure _roleData,XmlRandS r_and_s){
  56.                 string _xmlpath = "";
  57.                 string newNodeName = "";
  58.                 switch(r_and_s){
  59.                 case XmlRandS.xml_role:
  60.                         _xmlpath = XmlRole_Path;
  61.                         newNodeName = "Role" ;
  62.                         break ;
  63.                 case XmlRandS.xml_save:
  64.                         _xmlpath = XmlSave_Path;
  65.                         newNodeName = "Save" ;
  66.                         break ;
  67.                 }
  68.                 _xmlDoc.Load(_xmlpath);
  69.                 if(!_xmlDoc.DocumentElement.HasChildNodes){
  70.                         _roleData.id = 0 ;
  71.                 }else{
  72.                         _roleData.id = Convert.ToInt32(_xmlDoc.DocumentElement.LastChild.Attributes[0].InnerText) + 1 ;
  73.                 }

  74.                 XmlElement newNode = _xmlDoc.CreateElement(newNodeName);
  75.                 newNode.SetAttribute("id",_roleData.id.ToString());
  76.                 newNode.SetAttribute("time",_roleData.createtime);
  77.                 _xmlDoc.DocumentElement.AppendChild(newNode);

  78.                 XmlElement nameNode = _xmlDoc.CreateElement("name");
  79.                 nameNode.InnerText = _roleData.name ;
  80.                 XmlElement occuNode = _xmlDoc.CreateElement("occu");
  81.                 occuNode.InnerText = _roleData.occupation ;
  82.                 XmlElement levelNode = _xmlDoc.CreateElement("level");
  83.                 levelNode.InnerText = _roleData.level.ToString() ;
  84.                 XmlElement expNode = _xmlDoc.CreateElement("exp");
  85.                 expNode.InnerText = _roleData.freeExp.ToString() ;

  86.                 newNode.AppendChild(expNode);
  87.                 newNode.AppendChild(levelNode);
  88.                 newNode.AppendChild(occuNode);
  89.                 newNode.AppendChild(nameNode);

  90.                 _xmlDoc.Save(_xmlpath);
  91.         }

  92.         /// <summary>
  93.         /// Clears the xml file.清空整个xml文件
  94.         /// </summary>
  95.         /// <param name="r_and_s">R_and_s.</param>
  96.         public void ClearXmlFile(XmlRandS r_and_s){
  97.                 string _xmlpath = "";
  98.                 switch(r_and_s){
  99.                 case XmlRandS.xml_role:
  100.                         _xmlpath = XmlRole_Path;
  101.                         break ;
  102.                 case XmlRandS.xml_save:
  103.                         _xmlpath = XmlSave_Path;
  104.                         break ;
  105.                 }
  106.                 _xmlDoc.Load(_xmlpath);
  107.                 _xmlDoc.DocumentElement.RemoveAll();
  108.                 _xmlDoc.Save(_xmlpath);
  109.         }
  110.         /// <summary>
  111.         /// Res the fresh xml identifier.当xml中有节点被删除的时候从新排下节点的id。
  112.         /// </summary>
  113.         /// <param name="r_and_s">R_and_s.</param>
  114.         public void ReFreshXmlId(XmlRandS r_and_s){
  115.                 string _xmlpath = "";
  116.                 switch(r_and_s){
  117.                 case XmlRandS.xml_role:
  118.                         _xmlpath = XmlRole_Path;
  119.                         break ;
  120.                 case XmlRandS.xml_save:
  121.                         _xmlpath = XmlSave_Path;
  122.                         break ;
  123.                 }
  124.                 _xmlDoc.Load(_xmlpath);
  125.                 if(_xmlDoc.DocumentElement.HasChildNodes){
  126.                         XmlNodeList _chilidlist = _xmlDoc.DocumentElement.ChildNodes ;
  127.                         int i = 0 ;
  128.                         foreach(XmlNode xn in _chilidlist){
  129.                                 XmlElement xe = (XmlElement)xn ;
  130.                                 xe.Attributes[0].InnerText = (i++).ToString();
  131.                         }
  132.                 }
  133.                 _xmlDoc.Save(_xmlpath);
  134.         }
  135.         /// <summary>
  136.         /// Gets the data from xml.先打开xml然后读取xml里面的内容
  137.         /// </summary>
  138.         /// <returns>The data from xml.</returns>
  139.         /// <param name="r_and_s">R_and_s.</param>
  140.         public List<XmlDataStructure> GetDataFromXml(XmlRandS r_and_s){
  141.                 string _xmlpath = "";
  142.                 switch(r_and_s){
  143.                 case XmlRandS.xml_role:
  144.                         _xmlpath = XmlRole_Path;
  145.                         break ;
  146.                 case XmlRandS.xml_save:
  147.                         _xmlpath = XmlSave_Path;
  148.                         break ;
  149.                 }
  150.                 _xmlDoc.Load(_xmlpath);
  151.                 dataSetList = new List<XmlDataStructure>();
  152.                 if(_xmlDoc.DocumentElement.HasChildNodes){
  153.                         dataSetList.Clear();
  154.                         XmlNodeList _chilidlist = _xmlDoc.DocumentElement.ChildNodes ;
  155.                         foreach(XmlNode xn in _chilidlist){
  156.                                 XmlElement xe = (XmlElement)xn ;
  157.                                 XmlDataStructure xds = new XmlDataStructure(xe.ChildNodes[3].InnerText,
  158.                                                                             xe.ChildNodes[2].InnerText,
  159.                                                                             Convert.ToInt32(xe.ChildNodes[0].InnerText),
  160.                                                                             Convert.ToInt32(xe.ChildNodes[1].InnerText),
  161.                                                                             xe.Attributes[1].InnerText) ;
  162.                                 xds.id = Convert.ToInt32(xe.Attributes[0].InnerText);
  163.                                 dataSetList.Add(xds);
  164.                         }
  165.                 }
  166.                 _xmlDoc.Save(_xmlpath);
  167.                 return dataSetList ;                                                         
  168.         }
  169.         /// <summary>
  170.         /// Removes the item by identifier.通过id属性找到节点,然后删除
  171.         /// </summary>
  172.         /// <param name="id">Identifier.</param>
  173.         /// <param name="r_and_s">R_and_s.</param>
  174.         public void RemoveItemById(int id , XmlRandS r_and_s){
  175.                 string _xmlpath = "";
  176.                 switch(r_and_s){
  177.                 case XmlRandS.xml_role:
  178.                         _xmlpath = XmlRole_Path;
  179.                         break ;
  180.                 case XmlRandS.xml_save:
  181.                         _xmlpath = XmlSave_Path;
  182.                         break ;
  183.                 }
  184.                 _xmlDoc.Load(_xmlpath);
  185.                 if(_xmlDoc.DocumentElement.HasChildNodes){
  186.                         XmlNodeList _chilidlist = _xmlDoc.DocumentElement.ChildNodes ;
  187.                         for(int i = 0 ; i < _chilidlist.Count ; ++i){
  188.                                 if(_chilidlist[i].Attributes[0].InnerText == id.ToString()){
  189.                                         _xmlDoc.DocumentElement.RemoveChild(_chilidlist[i]);
  190.                                         break;
  191.                                 }
  192.                         }
  193.                 }
  194.                 _xmlDoc.Save(_xmlpath);
  195.                 //ReFreshXmlId(r_and_s);
  196.         }
  197. }
复制代码
好了到现在为止咱们已经把核心代码搞定了,那么接下来咱们插播一点界面元素:
先将UICamera下的Anchor复制一个,分别命名为:Info(UIAnchor的side属性设为TopLeft)和Buttons(UIAnchor的side属性设为BottomRight),然后在Buttons的panel下创建一个按钮,给按钮添加一个label,复制这个按钮,修改名称分别为:Create、Load,并修改它们的label值为:创建角色,返回登录,结构如下:

11.jpg
然后设计信息面板,在Info的panel下创建一个空物体命名为Item(这里记得修改它的层为2DUI,并且reset它的transform)然后给Item添加一个Label和一个Input控件,然后将Item复制3个,并且将Label的内容修改成,姓名、职业、等级、经验(这些其实是从游戏里面读取的,这里就直接输入好了,其实在游戏存储的时候这些值都是知道的),然后给Info的panel添加一个ngui的UITable脚本设置Columns = 1 ,最终效果如下图:
12.jpg
字数限制你妹啊,好吧去下一篇
http://www.narkii.com/club/thread-312931-1.html

已有 1 人评分纳金币 收起 理由
艾西格亚 + 5

总评分: 纳金币 + 5   查看全部评分

分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏2 支持支持0 反对反对0
回复

使用道具 举报

0

主题

0

听众

6661

积分

高级设计师

Rank: 6Rank: 6

纳金币
168
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

沙发
发表于 2013-12-30 10:21:13 |只看该作者
thanks for sharing
回复

使用道具 举报

10

主题

3

听众

760

积分

初级设计师

Rank: 3Rank: 3

纳金币
3
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

板凳
发表于 2013-12-30 10:24:18 |只看该作者
MARK一下 感谢分享
回复

使用道具 举报

3

主题

1

听众

6189

积分

高级设计师

Rank: 6Rank: 6

纳金币
370
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

地板
发表于 2013-12-30 11:59:18 |只看该作者
不错,请问如果用XML数据会被破解么?
回复

使用道具 举报

711

主题

10

听众

5805

积分

高级设计师

Rank: 6Rank: 6

纳金币
2954
精华
3

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

5#
发表于 2013-12-30 12:11:18 |只看该作者
很不错的教程,mark下
回复

使用道具 举报

s9999    

0

主题

1

听众

164

积分

设计实习生

Rank: 2

纳金币
37
精华
0

最佳新人

6#
发表于 2013-12-30 12:47:08 |只看该作者
这个支持移动端么 不支持吧
回复

使用道具 举报

2

主题

9

听众

6387

积分

高级设计师

Rank: 6Rank: 6

纳金币
881
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

7#
发表于 2013-12-30 21:49:12 |只看该作者
很不错,赞一个
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

关闭

站长推荐上一条 /1 下一条

手机版|纳金网 ( 闽ICP备08008928号

GMT+8, 2024-5-27 03:09 , Processed in 0.109332 second(s), 36 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部