zoukankan      html  css  js  c++  java
  • 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文件夹下的文件的拷贝和加载就说到这里了。

  • 相关阅读:
    Android PopupWindow 弹窗背景半透明,设置最大高度
    Android性能优化之:ViewStub
    EventBus使用详解(一)——初步使用EventBus
    Android开发中,那些让你相见恨晚的方法、类或接口
    android 提高进程优先级 拍照永不崩溃(闪退)
    Android框架 加载图片 库 Picasso 的使用简介
    vc 取windows系统信息 版本 cpu信息 内存信息 ie版本信息 office版本
    VC 三点 划 曲线
    VC 类泡泡龙游戏算法
    vc 判断哪个按键 被按下 消息 按键 状态
  • 原文地址:https://www.cnblogs.com/vsirWaiter/p/7941171.html
Copyright © 2011-2022 走看看