【Unity 3D】AssetBundle打包、上传、加载、卸载详解及演示(附源码)

简介: 【Unity 3D】AssetBundle打包、上传、加载、卸载详解及演示(附源码)

需要源码及依赖请点赞关注收藏后评论区留言私信~~~

AssetBundle最重要的操作就是AssetBundle打包 下载 加载以及卸载 下面就来了解一下AssetBundle的常用操作

1:AssetBundle打包

AssetBundle打包主要用到下面两个API

BuildAssetBundles(string outputPath,AssetBundleBuild[] builds,

BuildAssetBundleOptions assetBundleOptions,BuildTarget targetPlatform);

BuildAssetBundles(string outputPath,BuildAssetBundleOptions assetBundleOptions,BuildTatget targetPlarform);

下面新建一个PackBundles.cs脚本 放入Editor文件夹中 代码如下

using System.Collections.Generic;
using System.IO;
using UnityEditor;
public class PackBundles : Editor
{
    //选定资源打包
    [MenuItem("PackBundles/PackBundles")]
    static void PutBundleAssetes()
    {
        //初始化一个AssetBundleBuild表
        List<AssetBundleBuild> buildMap = new List<AssetBundleBuild>();
        AssetBundleBuild build = new AssetBundleBuild();
        //设置AssetBundleBuild的名字和资源路径
        build.assetBundleName = "tempImg.unity3d";
        build.assetNames = new[] { "Assets/Textures/tempImg.jpg" };
        //添加进表
        buildMap.Add(build);
        //将这些资源包放在一个名为ABs的目录下        
        string assetBundleDirectory = "Assets/ABs";
        //如果目录不存在,就创建一个目录        
        if (!Directory.Exists(assetBundleDirectory))
        {
            Directory.CreateDirectory(assetBundleDirectory);
        }
        //资源打包
        BuildPipeline.BuildAssetBundles(assetBundleDirectory, buildMap.ToArray(), BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);
    }
}

全部资源打包

进行全部资源打包前需要先设置每个需要打包的资源的属性 然后我们修改PackBundles.cs脚本 实现添加选定资源打包盒全部资源打包功能

using System.Collections.Generic;
using System.IO;
using UnityEditor;
public class PackBundles : Editor
{
    //选定资源打包
    [MenuItem("PackBundles/PackBundles")]
    static void PutBundleAssetes()
    {
        //初始化一个AssetBundleBuild表
        List<AssetBundleBuild> buildMap = new List<AssetBundleBuild>();
        AssetBundleBuild build = new AssetBundleBuild();
        //设置AssetBundleBuild的名字和资源路径
        build.assetBundleName = "tempImg.unity3d";
        build.assetNames = new[] { "Assets/Textures/tempImg.jpg" };
        //添加进表
        buildMap.Add(build);
        //将这些资源包放在一个名为ABs的目录下        
        string assetBundleDirectory = "Assets/ABs";
        //如果目录不存在,就创建一个目录        
        if (!Directory.Exists(assetBundleDirectory))
        {
            Directory.CreateDirectory(assetBundleDirectory);
        }
        //资源打包
        BuildPipeline.BuildAssetBundles(assetBundleDirectory, buildMap.ToArray(), BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);
    }
    //全部打包
    [MenuItem("PackBundles/AllPackBundles")]
    static void PutBundleAssetesAll()
    {
        //将这些资源包放在一个名为ABs的目录下        
        string assetBundleDirectory = "Assets/ABs";
        //如果目录不存在,就创建一个目录        
        if (!Directory.Exists(assetBundleDirectory))
        {
            Directory.CreateDirectory(assetBundleDirectory);
        }
        BuildPipeline.BuildAssetBundles(assetBundleDirectory, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
    }
}

在菜单栏中选择PackBundles->AllPachBundles命令 可以在Project视图中看到ABs文件夹中生成的AssetBundle文件 可以看到打包出来的文件有一个特点,就是每个AssetBundle资源包都会有一个后缀名为.manifest的文件

2:Manifest文件

Manifest文件其实是AssetBundle资源文件的依赖关系以及对包的信息的记录文件,根据这个文件可以获取某个包的依赖关系,或者判断所获取包的大小,效验码是否是正常的 将这个文件使用文本编辑器打开后 可以看到文件内容

CRC: 效验码 通过其检查包是否完整

Assets:表示包里包含多少资源

Dependencies:表示包有哪些依赖

3:AssetBundle文件上传

接下来使用IIS搭建本地服务器

1:在Windows中打开如下界面

2:打开IIS 新建网站 设置网站名称 端口号以及物理路径 将物理路径设置为存放AssetBundle资源文件的路径

3:设置IIS属性

4:将生成的AssetBundle文件放入设置的物理路径的文件夹中 然后删除后缀名为.meta的文件

4:AssetBundle加载

AssetBundle的加载方式有以下四种

AssetBundle.LoadFromFile:从本地加载

AssetBundle.LoadFromMemory 从内存加载

WWW.LoadFromCacheOrDownload 加载后放在缓存备用

UnityWebRequest 从服务器加载

下面新建一个脚本用于加载AssetBundle文件

using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
public class LoadBundles : MonoBehaviour
{
    void Start()
    {
        StartCoroutine(Load());
    }
    IEnumerator Load()
    {
        //从远程服务器上进行下载和加载
        string url = "http://localhost:8090/cube.unity3d";
        UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(url);
        //等待文件下载完毕
        yield return request.SendWebRequest();
        AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(request);
        //加载AssetBundle资源
        AssetBundleRequest ABrequest = bundle.LoadAssetAsync("Cube.prefab", typeof(GameObject));
        //根据资源生成文件
        Instantiate(ABrequest.asset as GameObject, new Vector3(0f, 0f, 0f), Quaternion.identity);
        yield return ABrequest;
        //释放资源
        request.Dispose();
    }
}

5:AssetBundle卸载

AssetBundle的卸载方式同样有四种 新建测试脚本代码如下

using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
public class LoadBundles : MonoBehaviour
{
    void Start()
    {
        StartCoroutine(Load());
    }
    IEnumerator Load()
    {
        //从远程服务器上进行下载和加载
        string url = "http://localhost:8090/cube.unity3d";
        UnityWebRequest request = UnityWebRequestAssetBundle.GetAssetBundle(url);
        //等待文件下载完毕
        yield return request.SendWebRequest();
        AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(request);
        //加载AssetBundle资源
        AssetBundleRequest ABrequest = bundle.LoadAssetAsync("Cube.prefab", typeof(GameObject));
        //根据资源生成文件
        GameObject go = Instantiate(ABrequest.asset as GameObject, new Vector3(0f, 0f, 0f), Quaternion.identity);
        yield return ABrequest;
        //释放资源
        request.Dispose();
        //卸载资源 包含所有Load创建出来的对象
        bundle.Unload(true);
        //卸载资源 除了Load创建出来的对象
        bundle.Unload(false);
        //释放已加载的资源Object
        Resources.UnloadAsset(go);
        //卸载所有没有被场景引用的资源对象
        Resources.UnloadUnusedAssets();
    }
}

6:AssetBundle打包工具

我们可以使用Unity AssetBundle Browser Tool插件 来查看AssetBundle 帮助打包AssetBundle和查看AssetBundle内容

创作不易 觉得有帮助请点赞关注收藏~~~

相关文章
|
4月前
|
图形学 缓存 算法
掌握这五大绝招,让您的Unity游戏瞬间加载完毕,从此告别漫长等待,大幅提升玩家首次体验的满意度与留存率!
【8月更文挑战第31天】游戏的加载时间是影响玩家初次体验的关键因素,特别是在移动设备上。本文介绍了几种常见的Unity游戏加载优化方法,包括资源的预加载与异步加载、使用AssetBundles管理动态资源、纹理和模型优化、合理利用缓存系统以及脚本优化。通过具体示例代码展示了如何实现异步加载场景,并提出了针对不同资源的优化策略。综合运用这些技术可以显著缩短加载时间,提升玩家满意度。
316 5
|
4月前
|
API C# 图形学
Unity3D学习笔记9——加载纹理
Unity3D学习笔记9——加载纹理
52 2
|
4月前
|
图形学 数据安全/隐私保护 iOS开发
Unity与IOS⭐Xcode打包,上架TestFlight的完整教程
Unity与IOS⭐Xcode打包,上架TestFlight的完整教程
|
6月前
|
存储 JSON 关系型数据库
【unity实战】制作unity数据保存和加载系统——大型游戏存储的最优解
【unity实战】制作unity数据保存和加载系统——大型游戏存储的最优解
194 2
|
6月前
|
图形学
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)(上)
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)
265 2
|
6月前
|
存储 JSON 图形学
【unity实战】制作unity数据保存和加载系统——小型游戏存储的最优解
【unity实战】制作unity数据保存和加载系统——小型游戏存储的最优解
203 0
|
6月前
|
图形学
【推荐100个unity插件之19】武器拖尾特效插件——Pocket RPG Weapon Trails(2d 3d通用)
【推荐100个unity插件之19】武器拖尾特效插件——Pocket RPG Weapon Trails(2d 3d通用)
128 0
|
6月前
|
图形学
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)(下)
【制作100个unity游戏之29】使用unity复刻经典游戏《愤怒的小鸟》(完结,附带项目源码)(下)
101 0
|
6月前
|
存储 JSON 关系型数据库
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版13(完结,附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版13(完结,附带项目源码)
123 0
|
6月前
|
图形学
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版12(附带项目源码)
【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版12(附带项目源码)
82 0