安卓动态加载StreamingAssets路径下的资源

最近负责把一个低模的HTC VR项目打包到一体机,一体机其实就可以看成一个安卓机,遇到的问题就是原来项目打包到安卓后跑步起来,网上查找资料才知道是因为StreamingAssets路径下的资源加载路径不同,安卓和pc平台的加载路径不一样,可以参考http://zhaolongchn.blog.163.com/blog/static/1906585042013624115926451/
得出结论,在安卓平台StreamingAssets文件下的资源加载必须通过www的方式异步加载,而且要注意加载路径。下面通过一个小demo来测试一下:

首先搭建一个场景

Paste_Image.png

然后在StreamingAssets文件下创建一个xml文件

Paste_Image.png
<?xml version="1.0" encoding="utf-8"?>
<npcData>
  <value>
    <ID>2017</ID>
    <Name>LuNa</Name>
    <Sex>woman</Sex>
  </value>
  

</npcData>

切记必须是utf-8的格式。该xml文件就用来后续我们用来测试资源加载,把xml文件当成资源,就不再实例出怪物之类的物体了。

创建储存xml文件数据信息的脚本

Paste_Image.png
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class XmlData  {
    public int id_;
    public int mID
    {
        get { return id_; }
        set { id_ = value; }
    }

    public string name_;
    public string mName
    {
        get { return name_; }
        set { name_ = value; }
    }

    public string sex_;
    public string mSex
    {
        get { return sex_; }
        set { sex_ = value; }
    }
}

创建一个解析xml文件的脚本类

Paste_Image.png
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Xml;
using System.IO;

public class JXXml
{

    public static XmlData ReadXML(string xmlfile)//读取xml信息
    {
        XmlData npcdata = new XmlData();
        if (xmlfile != string.Empty)
        {
            //去除utf-8格式的bom,这样才能读取xml内容
            StringReader stringReader = new StringReader(xmlfile);
            stringReader.Read(); // skip BOM
            string result = stringReader.ReadToEnd();
            stringReader.Close();

            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.LoadXml(result);
            XmlNode npcNode = xmlDoc.DocumentElement;
            foreach (XmlNode npcSonNode in npcNode.ChildNodes)
            {
                if (npcSonNode.Name == "value")
                {
                    npcdata.mID = int.Parse(npcSonNode.ChildNodes.Item(0).InnerText);
                    npcdata.mName = npcSonNode.ChildNodes.Item(1).InnerText;
                    npcdata.mSex = npcSonNode.ChildNodes.Item(2).InnerText;
                }
            }
        }
            return npcdata;
        
    }
}

最后创建一个脚本触发加载

Paste_Image.png
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class LoadXmlTest : MonoBehaviour {
    private TextMesh textmesh;
    private string path;
    private string result;

    void Start () {
        textmesh = GetComponent<TextMesh>();
        path = Application.streamingAssetsPath + "/TestXml.xml";
        StartCoroutine(LoadXml());
    }
    

    void Update () {
        
    }

    private void OnGUI()
    {
        GUIStyle titleStyle = new GUIStyle();
        titleStyle.fontSize = 40;
        titleStyle.normal.textColor = new Color(46f / 256f, 163f / 256f, 256f / 256f, 256f / 256f);
        GUI.Label(new Rect(100, 40, 500, 200),result, titleStyle);
    }

    IEnumerator  LoadXml()
    {
        WWW www = new WWW("file://" + Application.streamingAssetsPath+ "/TestXml.xml");
        yield return www;
        textmesh.text = www.text;
        
        XmlData npcdata = JXXml.ReadXML(www.text);
        result = npcdata.name_; 
    }
}

在unity运行!!!注意是在unity,不是打包后在安卓平台

Paste_Image.png

看到game视图我们就能确定我们已经成功的用www实现了StreamingAssets路径下的资源加载,但是需要注意,我们此时是在unity里面运行的,如果我们要打包到安卓,就需要改一下加载路径,改成:

WWW www = new WWW( Application.streamingAssetsPath+ "/TestXml.xml");

也就是把"file://" +去掉了。此时打包到安卓就可以运行出正确结果了。

总结

1、安卓读取StreamingAssets路径下的文件不能用DirectoryInfo类(切记!!!),只能通过www异步加载,然后就是注意各个平台的访问路径不一样;
2、读取xml文件时遇到的坑,就是如果把解析xml代码改成:

public static XmlData ReadXML(string xmlfile)//读取xml信息
    {
        XmlData npcdata = new XmlData();
        if (xmlfile != string.Empty)
        {
            //去除utf-8格式的bom,这样才能读取xml内容
            //StringReader stringReader = new StringReader(xmlfile);
            //stringReader.Read(); // skip BOM
            //string result = stringReader.ReadToEnd();
            //stringReader.Close();

            XmlDocument xmlDoc = new XmlDocument();

            xmlDoc.LoadXml(xmlfile);   //注释的时候记得把参数改成传入的参数

            XmlNode npcNode = xmlDoc.DocumentElement;
            foreach (XmlNode npcSonNode in npcNode.ChildNodes)
            {
                if (npcSonNode.Name == "value")
                {
                    npcdata.mID = int.Parse(npcSonNode.ChildNodes.Item(0).InnerText);
                    npcdata.mName = npcSonNode.ChildNodes.Item(1).InnerText;
                    npcdata.mSex = npcSonNode.ChildNodes.Item(2).InnerText;
                }
            }
        }
            return npcdata;
        
    }

这样再运行就会报错:

Paste_Image.png

出现这个错误的原因是因为Unity3D加载XML文件的时候,XML文件必须保存为UTF-8编码的格式,同时还必须去掉开头的两个字节(BOM)用来标识UTF-8用的。如何去掉bom标示就用刚才注释掉的代码就行了,分享链接http://answers.unity3d.com/questions/10904/xmlexception-text-node-canot-appear-in-this-state.html

去掉bom标示后就可以正常解析了,很神奇,明明前后打印出来字符串都一样。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容