首页 > 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块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。

  1. 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)

  2. “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那个“/”的区别吗?

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

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

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

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

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

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

        • 我是把原始资源放在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”);