最近开始的Unity项目中用到过了XML文件加载数据到游戏中幻灵镇魂曲 。作为游戏设计的新手,我不得不做大量的搜索工作来找出加载XML文件的方式以及怎样准确分配数据。在游戏的制作过程中七侠荡寇志 ,我确实收获不迷宫旅人小,所以写下这篇文章详细讲讲怎样读取XML文件及使用XML文件,使用的是C#殷怡航 。我将要讲的是用C#从XML文件中读取数据,将这些数据存储到List集合中,这样可以在项目的任何地方使用了。这实质就是Unity中最基本的读取XML文件雅比斯的祷告 。
在Unity中读取XML文件的可选项
第一点我要指出的是有好几种不同的方式可以完成XML读取。
XMLReader:很多朋友会推荐使用XMLReader,因为XMLReader提供了非缓存,向前访问XML数据。据我所知,这是开销最小的获取XML数据的方式。它提供了最低的性能消耗在你的游戏中。
XMLDocment:另一个是XMLDocment,我对这个类了解比较少新津春子,发现也很少人主张在Untiy中使用这个类。
XDocument:最后,就是XDocument,就是我最终使用,并且将在这篇文章里使用的。不可否认的,我选择它主要是因为在Unity领域中文档是最齐全的。在未来,我希望探索XMLReader更深无可厚非造句 ,因为它被认为是最高性能的。
步骤一 创建XML文件
首先沧县吧 ,在Unity工程中要有XML文件。你可以用一些应用来创建XML文件奥术至高,比如 Notepad++.这里给出我使用的测试文件,将它拷贝到你的XML编辑器中,保存:
<?xmlversion=”1.0″ encoding=”UTF-8″ standalone=”yes”华盖运 ?>
<chapter_1xmlns:xsi=”[url]http://www.w3.org/2001/XMLSchema-instance[/url]”>
<pagenumber=“1”>
<name>Mark</name>
<dialogue>Thisisa test!</dialogue>
</page>
<pagenumber=“2”>
<name>Tony</name>
<dialogue>Thisisasecondtest.</dialogue>
</page>
<pagenumber=“3”>
<name>Carol</name>
<dialogue>Thisisathirdtest.</dialogue>
</page>
<pagenumber=“4”>
<name>Kristie</name>
<dialogue>Thisisafourthtest.</dialogue>
</page>
<pagenumber=“5”>
<name>Jeff</name>
<dialogue>Thisisafifthtest.</dialogue>
</page>
<pagenumber=“6”>
<name>Frank</name>
<dialogue>Thisisasixthtest.</dialogue>
</page></chapter_1>
步骤二 添加XML文件到Unity
当你创建好文件之后,你需要将文件放入到你的项目工程里面,我将文件放在了Assets/Resources/XML Files.
步骤三 创建加载场景
现在,在Unity工程里,第一要做的是创建一个加载场景,包含一个Loader物体,用来加载xml文件,读取所有数据,将数据存档到List集合,以在整个项目中都可以使用,按照以下步骤:
创建一个scene命名为TestScene.TestScene可保持空白。
保存TestScene,再创建一个新Scene,这就是Loader Scene,在Hierarchy视图中新建一个空的游戏对象。任何时候都可以调用。
在空对象上添加一个C#脚本作为组件,取个名字,在这里我取Loader.打开脚本编辑器。
现在林仔仔 ,Loader scene 看起来应该是这样的:
步骤四 编辑代码
打开编辑器,将以下代码粘贴到Loader脚本中(如果格式丢失了,我只能抱歉了)。在每一段关键代码后面我都写了注释 (译者注:像这种每行代码都写注释的程序猿不多了,大家请珍惜!!!原文注释我保留了,译文写在每一行的上方)
usingUnityEngine;
usingSystem.Collections;
//List集合所需
usingSystem.Collections.Generic;//NeededforLists
//XML函数所需
usingSystem.Xml;//NeededforXML functionality
//XML函数所需
usingSystem.Xml.Serialization;//NeededforXML Functionality
usingSystem.IO;
//XML相关库
usingSystem.Xml.Linq;//NeededforXDocument
publicclassLoader:MonoBehaviour{
//创建Xdocment,后边读取XML文件要用到的
XDocument xmlDoc;//create Xdocument. Will be used latertoreadXMLfile
//创建Ienumerable List集合深大附中,用来存储xml数据单元
IEnumerable<XElement>items;//Create an Ienumerablelist. Will be usedtostore XML Items.
//初始化XMLData对象的List集合
List<XMLData>data=newList<XMLData>();//Initialize ListofXMLData objects.
int iteration=0,pageNum=0;
stringcharText,dialogueText;
bool finishedLoading=false;
void Start()
{
//加载新场景时,当前场景不销毁
DontDestroyOnLoad(gameObject);//Allows Loadertocarryoverintonewscene
//加载XML文件,代码在下边
LoadXML();//Loads XML File. Codebelow.
//开启异步加载XML数据到List中,代码在下边
StartCoroutine(“AssignData”);//Starts assigning XMLdatatodataList. Codebelow
}
void Update()
{
if(finishedLoading)
{
//在异步加载完成时,才执行
Application.LoadLevel(“TestScene”);//Only happensifcoroutineisfinished finishedLoading=false;
}
}
void LoadXML()
{
//赋值 xmlDoc丹尼爱特,从文件路径中加载xml文件
//Assigning Xdocument xmlDoc. Loadsthexmlfilefromthefilepathlisted.
xmlDoc=XDocument.Load(“Assets/Resources/XML Files/circles_test.xml”);
//这行主要是将xml文档分解成XML元素,后边会用到
//This basically breaksdowntheXML DocumentintoXML Elements. Used later.
items=xmlDoc.Descendants(“page”).Elements();
}
//这个是异步读取和存储XML数据到列表的实现
//thisisour coroutinethatwill actuallyreadandassigntheXMLdatatoour List IEnumerator AssignData()
{
foreach(variteminitems)
{
if(item.Parent.Attribute(“number”).Value==iteration.ToString())
{
pageNum=int.Parse(item.Parent.Attribute(“number”).Value);
charText=item.Parent.Element(“name”).Value.Trim();
dialogueText=item.Parent.Element(“dialogue”).Value.Trim();
data.Add(newXMLData(pageNum,charText,dialogueText));
Debug.Log(data[iteration].dialogueText);
//这句不想翻译了
iteration++;//incrementtheiterationby1
}
}
finishedLoading=true;
//告诉程序,我们已经加载完数据了
//telltheprogramthatwe’ve finished loadingdata.
yieldreturnnull;
}
}
这个类是用来将XML Data 赋值给列表的对象,方便后面调用。
//Thisclassisusedtoassign our XML Datatoobjectsinalistso we can callonthem later. publicclassXMLData{
public int pageNum;
publicstringcharText,dialogueText;
//Create a constructorthatwill accept multiple argumentsthatcan be assignedtoour variables. public XMLData(int page,stringcharacter,stringdialogue)
{
pageNum=page;
charText=character;
dialogueText=dialogue;
}
}
步骤五 测试
现在舒比奇 ,运行Loader Scene,所有的xml数据都会加载。如果你用的是我提供的XML文件养鸡成本 ,在Console视图应该可以看到:
这证实了我们的列表填充正确数量的对象数据,并且每一个都包含唯一的信息按每个页码商盾网。还有,你还会注意到,如果你的TestScene并没有什么特别,但是Loader 会继续存在新的场景中,任何时候你可以调用数据。在hierarchy视图如下截图,可以看到TestScene所有的元素在Loader object:
理解元素和属性
在第一次使用XML文件时,有一点我比较难理解的是元素和属性的区别卢凤梅。如果你不知道这些术语的含义,你肯定会感觉非常困惑。元素就是,实质上就是异国剑士 ,XML文件的一个标签。所以,在我的XML文件中<name>其实就是一个元素。这个元素包含的数据就是指在<name>和</name>之间的任意内容。所以,当我调用 item.Parent.Element(“name”).Value 时,其实就是调用标签<name>和</name>之间的值。元素与属性是不同的,属性是变量,属性是用元素来赋值。举个例子:<page number = “1”> 在这个例子中,”number” 是”page”元素的属性。我用这个属性(number)作为if语句的判断条件,来确定我正在读取的是哪一页。符合if条件下,我将指定的page下的number属性的值赋给变量。这就可以了,因为if 语句只有在找到指定的page number下才会执行。
附加信息:声音和文本
我在游戏中还用到了声音剪辑和音效的加载,像这样几行代码:
musicClip=Resources.Load(“Music/”+item.Parent.Element(“music”).Value.Trim().ToString())asAudioClip;
I’ve also writtentextfroman XMLdocumentstraightintoa Text UI object like this:
foreach(varnameinnames)
{
//istheelementnamed“name”andisita childofthecurrent pagenumber?
if(name.Name==“name”&&name.Parent.Attribute(“number”).Value==
pageNum.ToString())
{
nameUI.text=name.Value.Trim();
}
}
总结
总的来说,这是很基础的XML读取的例子。希望能够服务这些刚刚在这个领域开始的朋友,只要你清楚了Unity中XML的基本套路,你就能够更好的优化代码,创造更多不可思议的系统。我希望本文能够帮你在Unity中加入XML文件。欢迎评论或者给我反馈,我确定还有很多方面是可以更高效的。编程是团队的成就,所以,请不要吝啬你的评论绷带奇缘 ,请尽量给我评论二重身 ,一起讨论还有什么不同的地方是可以做的,或者厝边头尾 ,另外一种不同的实现方式。谢谢!乔引娣