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資料夾下的檔案的拷貝和載入就說到這裡了。