1. 程式人生 > >UNITY_資源路徑與加載外部文件

UNITY_資源路徑與加載外部文件

路徑和 ngx 新的 內容類型 element baidu 只讀 hid 外部文件

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_資源路徑與加載外部文件