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

unity使用文件流操作streamingassets下的文件

ada 一個 div 每一個 流操作 第一次啟動 andro unit 根目錄

背景:

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文件夾下的文件的拷貝和加載就說到這裏了。

unity使用文件流操作streamingassets下的文件