首页 > 编程语言 > 详细

UNITY_资源路径与加载外部文件

时间:2019-03-11 23:14:47      阅读:256      评论:0      收藏:0      [点我收藏+]

UNITY_资源路径与加载外部文件

https://www.tuicool.com/articles/qMNnmm6
https://blog.csdn.net/appppppen/article/details/51396256
https://zhidao.baidu.com/question/1111619840086129059.html

背景:

有许多静态数据是放在客户端中的,比如csv/xml文件,是需要动态读取文件的

实例: 动态读取一个xml文件,并生成一个类

<?xml version="1.0" encoding="UTF-8"?>
<test>
    <name>chenjd</name>
    <blog>http://www.cnblogs.com/murongxiaopifu/</blog>
    <organization>Fanyoy</organization>
    <age>25</age>
</test>

将此xml文件随意放在某路径下:Assets/aa/bb/Test.xml

使用代码读取文件内容

void Start() {
    XElement result = LoadXML("Assets/aa/bb/Test.xml");
}

void LoadXML(string path) {
    XElement xml = XElement.Load(path);
    return xml;
}

读取成功。

问题1. 路径和地址。在移动端是找不到文件的。
问题2. 使用的是PC上传统的一套读取资源的做法,而没有使用unity3d提供的方法。
  可能导致找得到文件但是没能正确地读取文件内容

移动平台的资源路径:

Application.dataPath: 程序的数据文件所在文件夹。在Editor中就是Assets
  安卓: /data/app/xxx.xxx.xxx.apk
  iOS:  Application/xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/Data

Application.streamingAssetsPath: 流数据的缓存目录,为相对路径,适合设置一些外部数据文件
  安卓: jar:file:///data/app/xxx.xxx.xxx.apk/!/assets
  iOS:  Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx.app/Data/Raw

Application.persistentDataPath: 持久化数据存储目录的路径,可用于存储一些持久化的数据文件
  安卓: /data/data/xxx.xxx.xxx/files
  iOS:  Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/Documents

Application.temporaryCachePath: 临时数据的缓存目录
  安卓: /data/data/xxx.xxx.xxx/cache
  iOS:  Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/Library/Caches

dataPath和streamingAssetsPath一般是相对程序的安装目录位置
persistentDataPath和temporaryCachePath一般是与系统有关的固定位置

那么,打包之后的资源的路径如何与这些地址对应上呢?

Unity中的资源处理种类:

Resources:

如果有文件夹名为Resources,则里面的内容会无条件地在打包时打包集成到.asset文件中
可以放置一些Prefab,因为Prefab在打包时会自动过滤掉不需要的资源,有利于减小资源包
1. 只读。不能动态修改,会动态更新的资源不要放在这里
2. 主线程加载
3. 使用Resources.Load()加载资源

StreamingAssets:

与Resources类似
区别为:Resources文件夹中的内容在打包时会被压缩和加密,而StreamingAssets中的内容则原封不动地打包
一般用来存放一些二进制文件
1. 只读,不能动态修改
2. 主要存放二进制文件
3. 只能通过WWW类读取

AssetBundle:

将prefab或二进制文件封装成AssetBundle文件(也是二进制文件)
缺点: 在移动端无法更新脚本
总结:
1. 该二进制文件(AssetBundle文件) 是Unity3D定义的一种二进制类型
2. 最好将Prefab封装成AssetBundle,但是在移动端无法更新脚本
3. 使用WWW类读取

PersistentDataPath:

这是一个路径(可读写)
在iOS上就是应用程序的沙盒;
在安卓上可以是程序的沙盒或sdCard -- 在安卓打包时,ProjectSetting的选项WriteAccess可设置路径是沙盒还是sdcard
总结:
1. 内容在运行时可读写,提前将数据存入这个路径是不可行的
2. 无内容类型的限制
3. 写下的文件可以在电脑上查看,同样也可以在电脑中清除

移动平台读取外部文件的方法:

使用Unity3D规定的操作方式来读取外部资源:Resources/ StreamingAssets/ AssetBundle

Resources: 

新建Resources目录,在目录中创建文件Test.xml(之前在背景中提到的那个文件)
通过Resources的方法来读取Test.xml中的内容。

public class Test: MonoBehaviour {
    private string _result;
    
    void Start(){
        LoadXML("Test");
    }

    private void LoadXML(string path){
        _result = Resources.Load(path).ToString();
        XmlDocument doc = new XmlDocument();
        doc.LoadXml(_result);
    }
}

StreamingAssets:

新建StreamingAssets文件夹并存放Test.xml文件
(StreamingAssets文件夹中的文件不会被压缩或加密,所以一般是要放二进制文件的,这里放xml只是做一个演示,实际操作中切记不要直接把数据文件放到该目录中)

public class Test : MonoBehaviour {
    private string _result;

    void Start(){
        StartCoroutine(LoadXML());
    }

    IEnumerator LoadXML(){
        string path = Application.streamingAssetsPath;
        WWW www = new WWW(path);
        yield return www;
        _result = www.text;
    }
}

AssetBundle:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

UNITY_资源路径与加载外部文件

原文:https://www.cnblogs.com/FudgeBear/p/10513784.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!