1. 程式人生 > >unity使用檔案流操作streamingassets下的檔案

unity使用檔案流操作streamingassets下的檔案

1、Unity第一次啟動時將streamingassets下的首包資源拷貝到persistentDataPath目錄下。

2、Unity-android平臺上的的這種操作只能使用www去載入streamingassets下的檔案,導致速度問題。

備註:

1、此方案需要您對安卓有一點點的瞭解。

解決方案:

1、在打包的時候,將streamingassets下的檔案目錄做一個記錄,每一個打包進去的相對streamingassets路徑下的檔案都記錄在一個files.txt裡面,比如streamingassets下有檔案bundles/testbundles.unity3d,這樣記錄進files.txt的名字就是bundles/testbundles.unity3d

2、安卓層讀取檔案流,在unity裡用www讀取files.txt,然後讀取files.txt裡的路徑資料,迴圈。然後將路徑傳入android獲取流,然後將流傳入unity,然後unity用檔案流再將此流寫入persistentDataPath,這裡的效率問題其實可以忽略的,unity的實質就是一個android的activity,雖然寫流放在了C#,但對www載入的優化已經提高了很多倍了,安卓程式碼如下。

public byte[] LoadAB(String path)
        {
             InputStream inputStream = null ;
                 try {      
                      inputStream = assetManagerAndoird.open(path);
                  }
              catch (IOException e) {
                   Log.v ("unity", e.getMessage());
                  }
              return readtextbytes(inputStream);
        }

3、第2條的程式碼,如果路徑上指定的檔案為空,大部分真機的app會直接crash,而不會主動去丟擲異常。

4、針對第3條的優化,在OnCreate裡獲取根目錄下的所有檔案及資料夾,AssetManager assets = assets.list(""); 

然後使用遞迴獲取到所有子目錄下的所有檔案,分別記錄路徑+檔名,並將資訊記錄到一個列表List<String> fileNameList = new ArrayList<String>()。

5、每次在讀取檔案時先判空fileNameList.contains(path),判斷這個檔案是否存在,如果存在則讀取,如果不存在則不讀取,不存在的時候需要返回0位元組的流到unity,如果返回null,同樣會發生崩潰,例如return new byte[0];,這樣就能完全防止app發生崩潰。

好了,關於streamingassets資料夾下的檔案的拷貝和載入就說到這裡了。