看了网上各种读取教程,挺厉害的。但不如我这个封装好的方便,现在我来记录下用法。
首先,下载我这个GameUtils.dll文件,http://download.csdn.net/download/qq_17758883/10018728
把文件复制到Unity工程的Assets目录下的任意文件夹里,Unity会自动编译这个文件。
然后就是脚本了,我来举一个简单的例子。现在我要创建一个任务系统,任务通过读取XML显示在游戏中,那么我们先来看下任务XML文件:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ArrayOfTask1 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Task1>
<taskID>0</taskID>
<content>制作一杯草莓汁</content>
<isFinished>false</isFinished>
</Task1>
<Task1>
<taskID>1</taskID>
<content>制作一杯橙汁</content>
<isFinished>false</isFinished>
</Task1>
<Task1>
<taskID>2</taskID>
<content>制作一杯芒果汁</content>
<isFinished>false</isFinished>
</Task1>
<Task1>
<taskID>3</taskID>
<content>制作一杯猕猴桃汁</content>
<isFinished>false</isFinished>
</Task1>
<Task1>
<taskID>4</taskID>
<content>制作一杯西瓜汁</content>
<isFinished>false</isFinished>
</Task1>
<Task1>
<taskID>5</taskID>
<content>制作一杯蓝莓汁</content>
<isFinished>false</isFinished>
</Task1>
</ArrayOfTask1>
需要注意的一点是:XML的根标签是ArrayOfTask1,你在使用时注意改成ArrayOf+自己的类名。比如ArrayOfFood、ArrayOfRole等。
再来新建一个Task1类:
using System;
using UnityEngine;
using System.Collections;
[Serializable]
public class Task1
{
public int taskID;
public string content;
public bool isFinished;
//请忽略这个构造方法
//public Task1(int id, string content)
//{
// taskID = id;
// this.content = content;
// isFinished = false;
//}
}
接着读取XML的脚本了,很简单,而且能返回一个泛型的List,及其方便我们使用。
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityGameAssist;
public class TaskManager1 : MonoSingletion<TaskManager1>
{
/// <summary>
/// 存放当前要执行的任务
/// </summary>
public List<Task1> tasks=new List<Task1>();
/// <summary>
/// 存放所有任务
/// </summary>
public List<Task1> allTask=new List<Task1>();
/// <summary>
/// 发布任务
/// </summary>
public void PublishTask(string type, int taskNum)
{
if (type.Equals("fruit"))
{
//读取水果任务
FileUtils.ReadXml<List<Task1>>("Task", ref allTask, null);
}
else
{
//读取做菜任务
FileUtils.ReadXml<List<Task1>>("FoodTask", ref allTask, null);
}
for (int i = 0; i < taskNum; i++)
{
int temp = Random.Range(0, allTask.Count);
//判断是否包含重复元素,若包含,则i--(有风险,可能会导致生成的实际任务数量,比设定的要多)
if (tasks.Contains(allTask[temp]))
{
if (i >= 0)
i--;
continue;
}
tasks.Add(allTask[temp]);
}
}
注意看命名空间,要引用UnityGameAssist,然后直接调用FileUtils.ReadXml,第一个参数是你的XML文件名,放在Resources/data/目录下,千万不能放错,不然读取不到。
第二个参数是你的List,第三个参数设为空即可。
Json的读取方式和这个差不多,只不过函数变成了FileUtils.ReadJson,这里就不赘述了。
或者可以看我的另一篇博客,使用Unity原生API读取Json文件,性能更好。