Unity 加载AssetBundle

栏目: 后端 · 发布时间: 4年前

内容简介:随着Unity的版本更新,加载AssetBundle的API也不断变化,要熟悉这些API才能把资源包管理的更好,在这里做个总结。Unty4.x - 5.x 用WWW类加载WWW.LoadFromCacheOrDownload() 通过Url和版本号自动缓存资源包 注意必须是资源包 不能是其他格式 不能加密

随着Unity的版本更新,加载AssetBundle的API也不断变化,要熟悉这些API才能把资源包管理的更好,在这里做个总结。

WWW

Unty4.x - 5.x 用WWW类加载

WWW.LoadFromCacheOrDownload() 通过Url和版本号自动缓存资源包 注意必须是资源包 不能是其他格式 不能加密

www加载样例:

using UnityEngine;
using System.Collections;

public class LoadFromCacheOrDownloadExample : MonoBehaviour
{
    IEnumerator Start()
    {
        while (!Caching.ready)
            yield return null;

        using (var www = WWW.LoadFromCacheOrDownload("http://myserver.com/myassetBundle.unity3d", 5))
        {
            yield return www;
            if (!string.IsNullOrEmpty(www.error))
            {
                Debug.Log(www.error);
                yield return null;
            }
            var myLoadedAssetBundle = www.assetBundle;

            var asset = myLoadedAssetBundle.mainAsset;
        }
    }
}

UnityWebRequest

Unity2018.1以后 官方建议用UnityWebRequest类代替WWW类

UnityWebRequest.GetAssetBundle() 兼容WWW.LoadFromCacheOrDownload()的功能 并提供了更多的功能

UnityWebRequest加载样例:

using UnityEngine;
using UnityEngine.Networking;
using System.Collections;

/// <summary>
/// 下载测试
/// <para>原文地址:https://segmentfault.com/a/1190000019656656</para>
/// </summary>
public class WebRequestTest : MonoBehaviour {

    private void Start () {
        StartCoroutine(DoLoadFile());
    }

    // 下载文本或二进制文件
    private IEnumerator DoLoadFile() {
        string url = Application.streamingAssetsPath + "/" + "test.txt";
        using (UnityWebRequest request = UnityWebRequest.Get(url)) {
            yield return request.SendWebRequest();
            if (request.isHttpError || request.isNetworkError) {
                // 下载出错
                print(request.error);
            } else {
                // 下载完成
                string text = request.downloadHandler.text;
                byte[] bytes = request.downloadHandler.data;
            }
        }
    }

    // 下载图片
    private IEnumerator DoLoadTexture() {
        string url = Application.streamingAssetsPath + "/" + "test.png";
        using (UnityWebRequest request = UnityWebRequestTexture.GetTexture(url)) {
            yield return request.SendWebRequest();
            if (request.isHttpError || request.isNetworkError) {
                // 下载出错
                print(request.error);
            } else {
                // 下载完成
                Texture2D texture = (request.downloadHandler as DownloadHandlerTexture).texture;
            }
        }
    }

    // 下载AssetBundle
    private IEnumerator DoLoadAssetBundle() {
        string url = Application.streamingAssetsPath + "/" + "test.ab";
        using (UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(url)) {
            yield return request.SendWebRequest();
            if (request.isHttpError || request.isNetworkError) {
                // 下载出错
                print(request.error);
            } else {
                // 下载完成
                AssetBundle assetBundle = (request.downloadHandler as DownloadHandlerAssetBundle).assetBundle;
            }
        }
    }

}

最重要的API

加载本地资源包最快的API:

AssetBundle.LoadFromFile(path) 同步 注意必须是AssetBundle格式 可以压缩 不能加密

AssetBundle.LoadFromFileAsync(path) 异步 注意必须是AssetBundle格式 可以压缩 不能加密

官方文档翻译:

同步地从磁盘上的文件加载一个资源包。

该函数支持任何压缩类型的包。在lzma压缩格式下,数据将被解压到内存中。未压缩格式和块压缩格式可以直接从磁盘读取。

与LoadFromFileAsync相比,这个版本是同步的,在创建AssetBundle对象之前不会返回。

这是加载AssetBundle的最快方法。

《官方文档》 https://docs.unity3d.com/Scri...

下载远程文件最好的API:

UnityWebRequest.Get() 相当于以前的WWW下载 可以是任意格式文件 可以压缩 可以加密

可以通过Get()下载文件后解压缩保存到本地 用LoadFromFileAsync()读取 加快加载速度

下载远程资源包最好的API:

UnityWebRequest.GetAssetBundle() 注意必须是AssetBundle格式 可以压缩 不能加密

各API加载测试:

资源包大小:48.5M 压缩格式:LZMA 测试平台:PC 本地文件

API 加载时间 内存上升 说明
new WWW(path) 49ms 49M 排除误差 内存基本与资源体积一致
UnityWebRequest.Get(path) 48ms 49M 排除误差 内存基本与资源体积一致
AssetBundle.LoadFromFile(path) 3ms 1.1M 加载速度最快 内存最小 只缓存索引
AssetBundle.LoadFromFileAsync(path) 18ms 1.1M 加载速度极快 内存最小 异步版LoadFromFile
AssetBundle.LoadFromMemory(path) 78ms 52M 数据完全缓存在内存里 内存占用最大
AssetBundle.LoadFromMemoryAsync(path) 91ms 51M 数据完全缓存在内存里 异步版LoadFromMemory

总结:

随着Unity版本的迭代,API不断变化以适应更多的需求,管理资源包的API变得越来越复杂了,官方尽量提供一个简单易用的API帮助开发者自动处理这个过程,但是当开发者处理的情况越来越复杂时,就需要自己定制资源包生成管理器和资源包加载管理器了,熟悉官方API才能更好的掌控性能,多看官方样例。

参考资料:

《Unity Assetbundle的加载方式的效率和内存占用》 https://blog.csdn.net/u012740...

《WWW.LoadFromCacheOrDownLoad官方文档》 https://docs.unity3d.com/2018...

《UnityWebRequest.GetAssetBundle官方文档》 https://docs.unity3d.com/2018...


以上所述就是小编给大家介绍的《Unity 加载AssetBundle》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Ajax开发精要

Ajax开发精要

柯自聪 / 电子工业出版社 / 2006 / 45.00

书籍目录: 概念篇 第1章 Ajax介绍 2 1.1 Ajax的由来 2 1.2 Ajax的定义 3 1.3 Web应用程序的解决方案 5 1.4 Ajax的工作方式 7 1.5 小结 8 第2章 B/S请求响应机制与Web开发模式 9 2.1 HTTP请求响应模型 9 2.2 B/S架构的请求响应机......一起来看看 《Ajax开发精要》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

随机密码生成器
随机密码生成器

多种字符组合密码