找回密码
 注册帐号

扫一扫,访问微社区

zhang273162308 奇葩问题之奇葩解决方案系列——安卓手机外部加载Assetbundle

3
回复
1507
查看
[ 复制链接 ]
排名
141
昨日变化

125

主题

596

帖子

7062

积分

Rank: 9Rank: 9Rank: 9

UID
3579
好友
110
蛮牛币
5840
威望
0
注册时间
2013-9-10
在线时间
1608 小时
最后登录
2020-3-27

专栏作家活力之星游戏蛮牛QQ群会员蛮牛哥

2018-11-10 16:55:11 显示全部楼层 阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
本帖最后由 zhang273162308 于 2018-11-10 16:58 编辑

一、前言
       首先,这个需求是这么被创造出来的,我们要在安卓手机上加载超过一个G的资源,正常的Unity的程序员都会立马想到使用Assetbundle进行资源打包和加载,我当然也不例外。于是乎我就吭哧吭哧的熟练的对资源进行打包,然后用异步 AssetBundle.LoadFromFileAsync进行加载,然鹅,居然读取不到资源。为啥?我这个资源是放在手机的SD卡新建的一个文件夹ResourcesData下,谷歌了很多大神的资料都说的是放到Unity的streamingAssets的目录下,比如松哥的文章点击https://www.xuanyusong.com/archives/4033研究院之同步方法读取streamingAssets(八十八)
可是这个目录是随着APK一起打包的,也就是说我想预先放置Assetbundle资源在安卓手机的指定目录下好像不行。
二、世界上本没有需求想多了就有了
     读取Assetbundle的代码如下:
[C#] 纯文本查看 复制代码
    private IEnumerator LoadAsync()
    {
        tempPathURL = "file:///storage/emulated/0" + "/ResourcesData/ARSandBox/AssetBundles/scenes";
        bundleLoadRequest = AssetBundle.LoadFromFileAsync(tempPathURL);
        while (!bundleLoadRequest.isDone)
        {

            yield return bundleLoadRequest;
        }

        var myLoadedAssetBundle = bundleLoadRequest.assetBundle;
        if (myLoadedAssetBundle == null)
        {
            uiText.text += "Failed LoadAsync:" + tempPathURL;
            Debug.Log("Failed to load AssetBundle!");
            yield break;
        }

        var assetLoadRequest = myLoadedAssetBundle.LoadAssetAsync<GameObject>("ScenesDefault");
        yield return assetLoadRequest;

        GameObject prefab = assetLoadRequest.asset as GameObject;
        prefab.transform.position = Vector3.zero;
        loadObj = Instantiate(prefab);

        //var matRequest = myLoadedAssetBundle.LoadAssetAsync<Material>("HJS_M");
        //yield return matRequest;
        //Material mat = matRequest.asset as Material;
        //HJSObj.GetComponent<MeshRenderer>().material = mat;

        myLoadedAssetBundle.Unload(false);

    }


在安卓系统的华为mate10和小米2S下试过了都不管用
但是接下来的代码:居然神奇的可以加载出来,资源还是原来的资源,只不过从AssetBundle.LoadFromFileAsync换成了WWW的加载方式,但是这个WWW的加载不能做进度条啊,会在点击加载的时候卡一会儿,因为不是异步加载,我刚开始以为是我打包的姿势不对,然后我又分别打包安卓的Assetbundle的时候三种压缩模式都使用过了,结果还是一样。
[C#] 纯文本查看 复制代码
 // tempPathURL = "file:///storage/emulated/0" + "/ResourcesData/BattlefieldARElecSandbox/Assetbundles/Android/cube";
    private IEnumerator LoadWWW2()
    {
        // tempPathURL = "file:///storage/emulated/0" + "/ResourcesData/hjs";
        // tempPathURL = Application.streamingAssetsPath + "/Android/Models/hjs";

        using (WWW www = WWW.LoadFromCacheOrDownload(tempPathURL,5))
        {
            while (!www.isDone)
            {
                LoadPro = Mathf.RoundToInt(www.progress) * 100 + "%";
                Debug.Log(LoadPro);
                yield return new WaitForSeconds(0.5f);
            }
            if (!string.IsNullOrEmpty(www.error))
            {
                uiText.text += "加载错误:" + www.error;
                yield break;
            }
            else
            {
                LoadPro = "100%";
                AssetBundle bundle = www.assetBundle;
                var prefab = bundle.LoadAsset<GameObject>(loadGameObjName);
                loadObj = Instantiate(prefab);
                loadObj.transform.position = new Vector3(3, 5, 0);

            }
        }
    }


三、总结
我想在手机的SD指定文件夹预先放置Unity的打包好的资源Assetbundle,然后加载的时候只能用WWW的方式,而 AssetBundle.LoadFromFileAsync这个方法不管用

回复

使用道具 举报

3偶尔光临
190/300
排名
15302
昨日变化

0

主题

112

帖子

190

积分

Rank: 3Rank: 3Rank: 3

UID
301584
好友
1
蛮牛币
562
威望
0
注册时间
2018-10-28
在线时间
28 小时
最后登录
2019-5-21
2018-11-11 12:24:03 显示全部楼层
回复

使用道具 举报

3偶尔光临
257/300
排名
28932
昨日变化

0

主题

35

帖子

257

积分

Rank: 3Rank: 3Rank: 3

UID
117353
好友
0
蛮牛币
96
威望
0
注册时间
2015-8-10
在线时间
213 小时
最后登录
2019-12-4
2018-11-13 13:44:54 显示全部楼层
66666666666666
回复

使用道具 举报

3偶尔光临
270/300
排名
10596
昨日变化

1

主题

82

帖子

270

积分

Rank: 3Rank: 3Rank: 3

UID
188990
好友
0
蛮牛币
22
威望
0
注册时间
2016-12-2
在线时间
88 小时
最后登录
2019-11-14
QQ
2018-12-29 17:16:37 显示全部楼层
streamingAssets这个文件夹在安卓端是被压缩了的,也就是说是一个压缩文件,io流读取的方式是不能读取压缩文件的,而www是可以加载压缩包的
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则