Unity加载AB包

简介: 在 Unity 中加载 AssetBundle(AB 包)涉及文件定位、反序列化和内存管理。本地路径可通过 `Application.dataPath` 或 `Application.persistentDataPath` 获取,结合文件名定位 AB 包。远程 URL 则通过网络请求下载。代码示例展示了从本地和远程加载 AB 包的方法,使用 `UnityWebRequest` 和 `WWW` 类进行资源加载和实例化。

在 Unity 中加载 AssetBundle(AB 包)的原理涉及多个关键步骤,包括 AB 包文件的定位与读取、资源的反序列化以及内存管理等
本地路径:如果 AB 包存储在本地磁盘,开发者需要明确其具体的文件路径。在 Unity 里,可使用Application.dataPath(应用数据路径)、Application.persistentDataPath(可持久化数据路径)等获取本地目录,再结合 AB 包文件名来定位文件。例如,对于存储在持久化数据路径下的 AB 包,可通过以下方式获取完整路径:
csharp
string assetBundlePath = Path.Combine(Application.persistentDataPath, "myAssetBundle");
远程 URL:当 AB 包存放在远程服务器时,需要提供其对应的 URL 地址。借助 Unity 的网络请求功能,可从该 URL 下载 AB 包文件。

两种加载代码如下:

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

public class Load_AB : MonoBehaviour
{
    private void Start()
    {
        StartCoroutine(LoadWWW());
        StartCoroutine(FromWebRequest());
    }
    private IEnumerator FromWebRequest()
    {
        string path = @"http://192.168.1.80:8088/unity/model.ab";
        UnityWebRequest webRequest = UnityWebRequestAssetBundle.GetAssetBundle(path);
        yield return webRequest.SendWebRequest();
        AssetBundle assetBundle = DownloadHandlerAssetBundle.GetContent(webRequest);
        //object obj = assetBundle.LoadAsset("Image");
        //Instantiate((GameObject)obj, FindObjectOfType<Canvas>().transform);
        object[] objects = assetBundle.LoadAllAssets();
        foreach (var item in objects)
        {
            Instantiate((GameObject)item, FindObjectOfType<Canvas>().transform);
        }
        yield return null;
    }

    private WWW Loadab;

    private IEnumerator LoadWWW()
    {
        Loadab = new WWW("http://192.168.1.80:8088/unity/model.ab");  // 路径可以根据自己需求来修改
        yield return Loadab;
        if (Loadab.error != null)
        {
            Debug.Log(Loadab.error);
        }
        else
        {
            object[] objects = Loadab.assetBundle.LoadAllAssets();
            foreach (var item in objects)
            {
                Instantiate((GameObject)item, FindObjectOfType<Canvas>().transform);
            }
        }
    }
}
相关文章
|
10月前
|
存储 算法 API
Unity打包AB包
在 Unity 中,AssetBundle(AB 包)用于存储和管理游戏资源,支持动态加载。开发者需为资源标记 AssetBundle 名称,Unity 会自动处理依赖关系并进行序列化。资源被打包成二进制格式,并可选择压缩算法(如 LZMA 或 LZ4)。通过 BuildPipeline API 可控制打包过程,包括设置目标平台(如 WebGL、PC)。示例代码展示了如何使用 BuildPipeline.BuildAssetBundles 方法打包 AB 包并输出到 StreamingAssets 文件夹中。
|
图形学 缓存 算法
掌握这五大绝招,让您的Unity游戏瞬间加载完毕,从此告别漫长等待,大幅提升玩家首次体验的满意度与留存率!
【8月更文挑战第31天】游戏的加载时间是影响玩家初次体验的关键因素,特别是在移动设备上。本文介绍了几种常见的Unity游戏加载优化方法,包括资源的预加载与异步加载、使用AssetBundles管理动态资源、纹理和模型优化、合理利用缓存系统以及脚本优化。通过具体示例代码展示了如何实现异步加载场景,并提出了针对不同资源的优化策略。综合运用这些技术可以显著缩短加载时间,提升玩家满意度。
1655 6
|
API C# 图形学
Unity3D学习笔记9——加载纹理
Unity3D学习笔记9——加载纹理
169 2
|
存储 JSON 关系型数据库
【unity实战】制作unity数据保存和加载系统——大型游戏存储的最优解
【unity实战】制作unity数据保存和加载系统——大型游戏存储的最优解
786 2
|
定位技术 图形学 开发者
【Unity实战】切换场景加载进度和如何在后台异步加载具有庞大世界的游戏场景,实现无缝衔接(附项目源码)
【Unity实战】切换场景加载进度和如何在后台异步加载具有庞大世界的游戏场景,实现无缝衔接(附项目源码)
1907 1
|
存储 JSON 图形学
【unity实战】制作unity数据保存和加载系统——小型游戏存储的最优解
【unity实战】制作unity数据保存和加载系统——小型游戏存储的最优解
518 0
|
缓存 API 图形学
【Unity 3D】AssetBundle打包、上传、加载、卸载详解及演示(附源码)
【Unity 3D】AssetBundle打包、上传、加载、卸载详解及演示(附源码)
845 0
|
存储 图形学 Android开发
Unity——资产包(Asset Bundles)
Unity——资产包(Asset Bundles)
629 0
|
编译器 图形学 Windows
【unity细节】中文乱码和老包升级的情况
【unity细节】中文乱码和老包升级的情况
342 0
|
图形学
Unity热更新——AB包的基本操作
Unity热更新——AB包的基本操作
904 1