unityファイルストリームを使用してstreamingassetsの下のファイルを操作する

2342 ワード

背景:
1、Unityが最初に起動したときにstreamingassetsの下の最初のパッケージリソースをpersistentDataPathディレクトリの下にコピーします.
2、Unity-androidプラットフォームのこのような操作はwwwを使ってstreamingassetsの下のファイルをロードするしかなく、速度の問題を引き起こす.
コメント:
1、この案はアンドロイドについて少し理解する必要があります.
ソリューション:
1、パッケージ化する時、streamingassetsの下のファイルディレクトリを1つの記録をして、それぞれパッケージ化した相対streamingassetsパスの下のファイルはすべて1つのfiles.txtの中で記録して、例えばstreamingassetsの下にファイルbundles/testbundles.unity 3 dがあって、このようにfiles.txtに記録した名前はbundles/testbundles.unity 3 dです
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(""); 
そして、再帰的に取得したすべてのサブディレクトリの下にあるすべてのファイルを使用して、パス+ファイル名をそれぞれ記録し、リストリストリストfileNameリスト=new ArrayList()に情報を記録する.
5、ファイルを読み取るたびにfileName List.contains(path)を空にし、このファイルが存在するか否かを判断し、存在する場合は読み取り、存在しない場合は読み取り、存在しない場合はunityに0バイトのストリームを返す必要があり、nullを返すと同様にクラッシュが発生する.例えばreturn new byte[0];これによりappのクラッシュを完全に防止できます.
 
では、streamingassetsフォルダの下にあるファイルのコピーとロードについてお話しします.
転載先:https://www.cnblogs.com/vsirWaiter/p/7941171.html