Unity 安卓游戏加载xml文件

前言

一般在电脑上面加载xml文件,我们都会使用XmlDocument.Load(Path)。在pc上面测试的时候是没有问题的,xml文件可以成功加载。但是当我们打包成apk文件,并在手机上面安装并游玩的时候,发现出现问题了,xml文件好像没有加载出来,因为游戏中的对话全部没法正常执行。原来,在安卓环境下不支持XmlDocument.Load(Path)。我们要使用WWW来加载xml文件。

创建xml

我的xml文件:

<?xml version="1.0" encoding="utf-8"?>
<item>
    <speakData>
      <name>我:</name>
      <speak>哎呀!吓我一跳,我只是碰巧路过此地而已,你后面那扇门看起来挺诱人的,嘿嘿</speak>
    </speakData>
    <speakData>
      <name>巨大雕像:</name>
      <speak>碰巧路过?你以为人名警察会信你的鬼话么</speak>
    </speakData>
    <speakData>
      <name>我:</name>
      <speak>啊?人民警察?完蛋了,万一告我私闯名宅</speak>
    </speakData>
    <speakData>
      <name>巨大雕像:</name>
      <speak>不管我是谁,你今天死定了,任何人都不允许通过那扇门,主人是这么说的</speak>
    </speakData>
</item>

将xml文件放在Assets文件夹下面的streamingAssets文件夹里面

加载xml文件

利用Application.platform == RuntimePlatform.Android判断是否处于安卓环境,因为Pc端和安卓端的路径写法是不一样的

if (Application.platform == RuntimePlatform.Android)
        {
            //安卓端写法
            filePath = Application.streamingAssetsPath + "/SpeakData/EnemySpeak.xml";
        }
        else
        {
            //PC端写法
       filePath="file://"+Application.streamingAssetsPath+"/SpeakData/EnemySpeak.xml";
        }

然后使用WWW加载路径:

 WWW www = new WWW(filePath);

利用 if(www.isDone)判断是否加载成功,加载成功后就可以获取xml的数据了,下面是完整代码:

private IEnumerator LoadXmlData()
    {
        string filePath;
        if (Application.platform == RuntimePlatform.Android)
        {
            filePath = Application.streamingAssetsPath + "/SpeakData/EnemySpeak.xml";
        }
        else
        {
           filePath="file://"+Application.streamingAssetsPath+"/SpeakData/EnemySpeak.xml";
        }
        WWW www = new WWW(filePath);
        yield return www;
        if(www.isDone)
        {
            XmlDocument xDo = new XmlDocument();
            xDo.LoadXml(www.text);
            //xDo.Load(filePath);
            //获取item节点里面的数据
            XmlNodeList xnl = xDo.SelectSingleNode("item").ChildNodes;
            foreach (XmlElement e in xnl)//遍历子节点数据
            {
                sdata = new StringBuilder();
                foreach (XmlElement e2 in e.ChildNodes)//遍历子节点的子节点数据
                {
                    //判断是哪个节点
                    if (e2.Name.Equals("name"))
                    {
                        sdata.Append(e2.InnerText + "\n");//获取节点内容
                    }
                    else if (e2.Name.Equals("speak"))
                    {
                        sdata.Append(e2.InnerText);//获取节点内容
                    }
                }
                speakList.Add(sdata.ToString());//将每次遍历完的数据添加到List<string>
            }
        }
        yield return null;
}

疑问

使用WWW加载xml文件需要用到协程,我也不知道为什么,如果不使用协程就没法正常加载。到底是什么原理呢?

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值