首页 > Unity3D频道 > 【Unity3D研究院之游戏开发】 > Unity3D研究院之Android同步方法读取streamingAssets(八十八)
2016
04-28

Unity3D研究院之Android同步方法读取streamingAssets(八十八)

版本Unity5.3.3

Android 小米pad1

首先非常感谢 @守着阳光 同学在下面的留言。让我解决了一个大的谜团。。

 

开始我知道 StreamingAssets 路径是这个 path = “jar:file://” + Application.dataPath + “!/assets/”;

文档在这里: http://docs.unity3d.com/Manual/StreamingAssets.html

后来我知道了一个新API Application.streamingAssetsPath

Application.streamingAssetsPath 其实就等于 “jar:file://” + Application.dataPath + “!/assets/”;

然而问题就出现在这个路径上。我打印了一下LOG

Application.streamingAssetsPath = jar:file:///data/app/com.xxx.xxx-1.apk!/assets

Application.dataPath+”!assets” = /data/app/com.xxx.xxx-1.apk!assets

也就是说Application.streamingAssetsPath  多了一个   jar:file://

那么如果想在Android上同步方法AssetBundle.LoadFromFile 就得用 Application.dataPath+”!assets”这个路径。

从此这段代码就正常了。

Unity的坑啊~ 55555555555555555555

还有这个路径只能用来AssetBundle.LoadFromFile 。如果想用File类操作。 比如File.ReadAllText  或者 File.Exists  Directory.Exists 这样都是不行的。

———————————-!!从今天以后下面的代码已经可以作废了!!—————————

streamingAssets 这个目录在IOS下是可以同步读取的,但是在Android下必须用www来异步读取。。这就很恶心了~所以最近我就在想办法如何能在Android下也能同步读取。如下图所示,我把一个sprite打成assetbundle并且放在StreamingAssets目录下。

Unity3D研究院之Android同步方法读取streamingAssets(八十八) - 雨松MOMO程序研究院 - 1

assetbundle的压缩格式 ,我使用的是unity5.x的lz4方式。

然后创建一个3D Sprite 在Hierarchy里 试图把这个ab里的sprite加载上去。

然后,把unity导出成android工程。。

Unity3D研究院之Android同步方法读取streamingAssets(八十八) - 雨松MOMO程序研究院 - 2

用eclipse打开刚刚导出的工程。找到UnityPlayerActivity.java类 添加如下代码

 

OK 大功告成, 我的sprite已经可以同步加载了。

如下图所示,那么实际上unity把已经把streamingAssets目录下的资源放在了android的assets目录下。

Unity3D研究院之Android同步方法读取streamingAssets(八十八) - 雨松MOMO程序研究院 - 3

 

那么我们同步加载的原理也是利用Android的AssetManager这个类来读取的。

刚和同事讨论了一下,如果有效率的问题,我们可以在ndk里读取assets下的资源。 比如向这样~  c#  调用  ndk 读取完直接返回给c# 这样就可以不通过java这一层。。

http://www.cppblog.com/johndragon/archive/2012/12/28/196754.html

最后希望大家可以帮忙多多测试看看,谢谢啦~~

 

雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!

--

最后编辑:
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
捐 赠如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。

Unity3D研究院之Android同步方法读取streamingAssets(八十八)》有 74 条评论

  1. lvfy 说:

    亲自测试(windows和android) 新版API, Application.streamingAssetsPath 可以使用。

  2. 荷包蛋饭特稀 说:

    Unity5.3.4 亲测这样写也能用了AssetBundle.LoadFromFile(Application.streamingAssetsPath +”/yusong.unity3d”);

  3. 烏拉龜 说:

    最近也在用直接读取apk里的ab来减轻把ab复制出去的麻烦,但有很大的问题,loadasset内容时,最少卡半分钟以上。。。这种读法效率这么差?

  4. Turing 说:

    那么不能用File进行操作了,那怎样读取Manifest里面的内容啊?怎样获取依赖关系呢?

  5. 小明 说:

    Android 同步读取文件用 ZipFile

  6. 海游 说:

    http://www.bkjia.com/Androidjc/972936.html像这种方式的 同步加载是不是 不科学。我测试是行不通的。 因为他把主线程卡死了,而WWW也用的是主线程,WWW就没机会执行了

  7. 刘麟 说:

    AssetBundle.LoadFromFile 读取失败路径:Application.dataPath “!assets/”版本:5.4.1not find resouce:Background/background_4.assetbundle(/data/app/com.max.test-1/base.apk!assets/nico/background/background_4.assetbundle)

  8. 刘麟 说:

    AssetBundle.LoadFromFile 读取失败路径:Application.dataPath + “!assets/”版本:5.4.1not find resouce:Background/background_4.assetbundle(/data/app/com.max.test-1/base.apk!assets/nico/background/background_4.assetbundle)

  9. 顺子 说:

    AssetBundle.LoadFromFile 加载Application.persistentDataPath里的assetbundle路径是什么格式,我总是加载不成功

  10. 今朝愚公?珅佳 说:

    “Application.streamingAssetsPath = jar:file:///data/app/com.xxx.xxx-1.apk!/assetsApplication.dataPath ”!assets” = /data/app/com.xxx.xxx-1.apk!assets区别在于有没有jar:file://”真的吗????难道不是在.apk!/assets和.apk!assets那个“/”的区别吗?

  11. 今朝愚公•珅佳 说:

    “Application.streamingAssetsPath = jar:file:///data/app/com.xxx.xxx-1.apk!/assetsApplication.dataPath+”!assets” = /data/app/com.xxx.xxx-1.apk!assets区别在于有没有jar:file://”真的吗????难道不是在.apk!/assets和.apk!assets那个“/”的区别吗?

  12. Superboy 说:

    bgm.unity3d 看下路径对不对 改成 string path = Application.streamingAssetsPath “/bgm”; 可以加载

  13. 谢志勇 说:

    5.3.4版本调用LoadFromFile 路径里不能有感叹号直接用Application.dataPath /assets/xxx.ab

  14. 谢志勇 说:

    5.3.4版本调用LoadFromFile 路径里不能有感叹号直接用Application.dataPath+/assets/xxx.ab

  15. 千叶孤鹤 说:

    安卓安装包,安装在安卓上后streamingassets下的html文件怎样读取到

  16. 琉璃冰 说:

    AssetBundle.LoadFromFile是不是5.3的API,我项目5.2.3,没有这个方法

  17. 张洁勇 说:

    这个办法unity4.0可以用吗?

  18. 张洁勇 说:

    请问 如果我第一个工程有stream asset. 打包apk. 下一次打包前工程删掉streamasset目录重新打一个apk包覆盖安装。原来的apk下streamasset的资源会被删除吗?

  19. 石叶 说:

    string path = Application.dataPath “!/assets/bgm.unity3d”;AssetBundle asset = AssetBundle.LoadFromFile(path);这些代码我在安卓上测试根本不能去读。。。即便是txt文件,用LoadFromFile也无法读取,只能用www,不知道为什么。有代码例子吗

  20. 石叶 说:

    string path = Application.dataPath + “!/assets/bgm.unity3d”;AssetBundle asset = AssetBundle.LoadFromFile(path);这些代码我在安卓上测试根本不能去读。。。即便是txt文件,用LoadFromFile也无法读取,只能用www,不知道为什么。有代码例子吗

  21. 石叶 说:

    .TXT文件有这个方法试,怎么不行啊。说文件未找到。

  22. 朱贤智 说:

    求救,为什么我的加载不了。 string path = Application.dataPath “!assets/bgm.unity3d”; AssetBundle asset = AssetBundle.LoadFromFile(path);确定文件名以及文件没问题;5.3,4P5

  23. 朱贤智 说:

    求救,为什么我的加载不了。 string path = Application.dataPath + “!assets/bgm.unity3d”; AssetBundle asset = AssetBundle.LoadFromFile(path);确定文件名以及文件没问题;5.3,4P5

  24. Keyboard_NOW 说:

    后面更新的方法,果然把之前的不优雅的做法干掉了。~~

  25. 外聲 说:

    我项目用的是assetmanager效率还可以,也不算太慢

  26. 守着阳光 说:

    Android可以用AssetBundle.LoadFromFile,只是路径问题

  27. 郭袁 说:

    我们之前也确实是这样实现的通过java直接读取byte[]。但是后边需要在后台线程加载资源 就必须用NDK去直接去数据,就你后边提到的ndk读取asset 目前有什么好的方案吗?

  28. 李幸涛 说:

    AssetBundle assetbundle = AssetBundle.LoadFromFile(Application.streamingAssetsPath “/yusong.unity3d”);这个在android 上不行,不是因为路径的原因吗?? Application.streamingAssetsPath 在android 下的路径格式是 jar:///****用 Application.dataPath 拼一下路径, 再加载应该就可以了~

  29. 李幸涛 说:

    AssetBundle assetbundle = AssetBundle.LoadFromFile(Application.streamingAssetsPath +”/yusong.unity3d”);这个在android 上不行,不是因为路径的原因吗?? Application.streamingAssetsPath 在android 下的路径格式是 jar:///****用 Application.dataPath 拼一下路径, 再加载应该就可以了~

  30. 太子 说:

    AssetBundle.LoadFromMemory(s); 依然会产生WebStream ,AssetBundle.CreatFromFile还是不能用啊 你用LoadFromMemory 大ab包占内存,小的还行。

  31. long 说:

    你好,请问这个方法比用AssetBundle.CreatFromFile好在哪儿

  32. 为何不直接放到 persist 目录呢? 这样也统一

    • 雨松MOMO 说:

      Application.persistentDataPath 安装完包以后才有这个目录。。 没法提前放进去啊。。

      • 刘剑寒 说:

        我知道的一般做法是,运行第一次的时候把所有Assetbundle拷贝到这个目录,后续更新也放到这个目录下

        • 雨松MOMO 说:

          我是把原始资源放在resources下。 加载资源的策略是优先查看assetbundle如果没有则去resources下加载。这样就不需要拷贝的。。 可是android平台下resources文件夹会被切割成很多份。感觉影响安装的速度, 所以准备用这种方式试试。。

          • 雨凇大大 既然StreamingAssets这个目录下可以用AssetBundle.LoadFromFile读取了,为什么还要拷贝到Application.persistentDataPath这个目录下呢?用AssetBundle.CreatFromFile 这个方式读取这两个目录 有什么区别呀?最后确认一个问题就是IOS和Android 都能用AssetBundle.LoadFromFile读取是吗?IOS:AssetBundle assetbundle = AssetBundle.LoadFromFile(Application.streamingAssetsPath +”/yusong.unity3d”); Android :AssetBundle assetbundle = AssetBundle.LoadFromFile( Application.dataPath + “!assets/yusong.unity3d”);

          • 雨凇大大 既然StreamingAssets这个目录下可以用AssetBundle.LoadFromFile读取了,为什么还要拷贝到Application.persistentDataPath这个目录下呢?用AssetBundle.CreatFromFile 这个方式读取这两个目录 有什么区别呀?最后确认一个问题就是IOS和Android 都能用AssetBundle.LoadFromFile读取是吗?IOS:AssetBundle assetbundle = AssetBundle.LoadFromFile(Application.streamingAssetsPath “/yusong.unity3d”); Android :AssetBundle assetbundle = AssetBundle.LoadFromFile( Application.dataPath “!assets/yusong.unity3d”);

  33. 张洁勇 说:

    话说雨凇大大 mac下用的啥编辑器哇?

  34. Chiuan 说:

    这样用蛮久了,效率ok的就是文章中您说用NDK里面替换? 看了那个文章介绍,有必要么? 和 android的am管理有啥区别

  35. 麦小爱罗 说:

    这样写有啥子好处么? Unity3D研究院之Android同步方法读取streamingAssets(八十八) - 雨松MOMO程序研究院 - 1

留下一个回复

你的email不会被公开。