unity学习笔记#3--在unity中读取XML数据
来源:互联网 发布:java数据库连接池写法 编辑:程序博客网 时间:2024/05/16 23:21
最近在学习unity的对话系统,其中我打算用XML来存储人物对话,考虑到对话中可能会需要实时呈现出说话人的样子,即在对话框上加上角色的立绘。我的解决方法是在获取对话的同时还要获取人物角色唯一标识ID,通过人物ID来确定其立绘。这其中会涉及到XML文件的读取。因此在编写XML文件时要在里面先把人物id及其相应的对话先写好。
例如我的一个dialogueTest.xml文件是这样写的:
<objects><Scenes SceneID="classroom"><people id="student_1">学生1:起立</people><people id="student_2">学生2:老师好!</people><people id="student_3">学生3:老师好!!</people><people id="teacher_1">老师:同学们好!</people></Scenes></objects>
在读取时,我的脚本代码如下:
using System.Collections;using System.Collections.Generic;using System.Xml;using System.IO;using UnityEngine;using UnityEngine.UI;public class XMLDialogueTest : MonoBehaviour{ public string _sceneID; //当前场景ID // Use this for initialization void Start () { //传递Xml文件的路径,注意要在自己输的路径前加"/"号 InitXML(Application.dataPath+ "/XMLData/dialogueTest.xml"); } //初始化xml,读取对话,将对话数据及其id传入数组 void InitXML(string path) { //新建一个XmlDocument对象 XmlDocument xml=new XmlDocument(); //判断xml文件是否存在 if (File.Exists(path)) { print("读取到了"); //通过路径path加载xml xml.Load(path); //获取objects节点下的子节点 XmlNodeList xmlNodeList = xml.SelectSingleNode("objects").ChildNodes; //遍历objects节点下的子节点 foreach (XmlElement xl1 in xmlNodeList) { //确认对话的场景ID if(xl1.GetAttribute("SceneID")==_sceneID) { print("当前场景ID为"+xl1.GetAttribute("SceneID")); //新建对话数组,用于存放对话 ArrayList dialogueList = new ArrayList(xl1.ChildNodes.Count); //新建人物数组,用于存放对应的人物id ArrayList NPCIDList = new ArrayList(xl1.ChildNodes.Count); //遍历人物对话,将对话放入数组中 foreach (XmlElement xl2 in xl1.ChildNodes) { //InnerText能取得相应节点的内容 dialogueList.Add(xl2.InnerText); //取得节点的属性id的值,即人物id NPCIDList.Add(xl2.GetAttribute("id")); } //传递对话数组 DialogueListToText(dialogueList,NPCIDList); } } } } //将对话输出到控制台 void DialogueListToText(ArrayList dialogueList,ArrayList NPCIDList) { for (int i = 0; i < dialogueList.Count; i++) { Debug.Log("ID为" + NPCIDList[i] +"的对话是:"+dialogueList[i]); } }}
将该脚本放到场景后,需要将上面dialogueTest.xml文件放在正确的路径下:
运行场景,控制台输出结果如下:
注:该脚本目前只是实现了读取xml文件,取得其中的人物id及其相应的对话,并将其输出到控制台而已。里面我有个我认为有待改进的地方,其中在存放人物id及其对话时,我本来是想将其人物id及其对话结合起来存放在一个对象上,期间我想到使用字典(Dictionary)来存数据,将人物id作为字典对象的key,将对话内容作为value,但是考虑到一个人物是有多句对话的,这样就相当于一个key对应了多个value,且与他人的对话之间会有个先后顺序,这个放到字典里的话就体现不出来顺序关系了。故而目前只能通过同时新建两个数组,一个用于存放人物id,另一个用于存放对话,由于是同步存储节点的id及对话,便能保证其对话的顺序及对话人物id相对应,但毕竟是用两个数组分别存数据,因此对于这两个数组的操作要同时进行,同时如果其中一个数组的数据出现问题,势必会影响最后读取数据的结果,其中的风险可想而知,因此如果有其他更好的替代方法我会在后面的笔记中给出。至于如何将取到的人物id及其对话结合到游戏中的对话框,实现人物对话还有待我接下来的继续学习。
另注:如果要获取到节点的属性名(注意,是属性名,不是属性值,例如id=”student_1”其中id为属性名,student_1为属性id的值)时,因为在XmlElement类下有一个属性是Attributes,返回值为XmlAttributeCollection,而节点element的属性名则存储在XmlAttributeCollection下。所以可以在上面脚本中已获取到了xl2节点的情况下,可以通过以下代码取得其属性名:
XmlAttributeCollection xac = xl2.Attributes;//遍历节点的属性,将属性传给数组foreach (XmlAttribute xat in xac){ string str = xat.Name; //输出节点的属性名 print(str);}
参考资料:
C#获取属性名称
Unity中的XML文件创建,读取,修改,添加
[Unity3D]Unity3D游戏开发之Xml解析实现NPC对话系统
- unity学习笔记#3--在unity中读取XML数据
- unity中xml读取
- 在unity中如何读取json数据
- unity学习笔记#4--读取XML数据用于人物间对话
- unity中读取xml文件
- Unity 中读取XML文件
- unity中WWW读取xml
- 【unity学习笔记】在unity中扩展编辑器添加菜单
- 【Unity学习笔记】关于在Unity中build apk error
- XML在Unity中使用
- 关于Unity读取XML的简单学习
- Unity 读取xml 文件
- Unity 读取xml 文件
- unity c#读取xml
- unity 读取xml 信息
- Unity读取XML定制。
- unity的XML读取
- Unity 读取XML文件
- 46.ClassTag 、Manifest、ClassManifest、TypeTag代码实战及其在Spark中的应用源码解析
- HDU1251:统计难题
- Fork函数
- verilogVGA显示字符
- Fails to build with protobuf 2.6.0
- unity学习笔记#3--在unity中读取XML数据
- SDCard读写文件
- 好的技术网站,值得收藏。。。
- Android PopupWindow详解
- 二维数组和二维指针的关系
- caioj 1070 dp
- 2017.9.21 problem a 失败总结
- 各种好用的网站
- mysql 数据库优化