AssetBundle打包与加载

2024-03-13 14:04
文章标签 加载 打包 assetbundle

本文主要是介绍AssetBundle打包与加载,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

官方文档
参照视频

1.AssetBundle打包

1.1设置资源的命名和后缀

命名只支持小写
在这里插入图片描述

1.2创建Editor文件夹,在里面创建编辑器打包AssetBundle的脚本

using UnityEditor;
using System.IO;public class CreateAssetBundles  {[MenuItem("Assets/Build AssetBundles")]static void BuildAllAssetBundles(){string dir = "AssetBundles";if( Directory.Exists(dir)==false){Directory.CreateDirectory(dir);}BuildPipeline.BuildAssetBundles(dir, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);}
}

压缩方式:
BuildAssetBundleOptions.None:使用LZMA算法压缩,压缩包下,但加载时间长
BuildAssetBundleOptions.UncompressedAssetBundle:不压缩,包大,加载快
BuildAssetBundleOptions.ChunkBasedCompression:使用LZ4压缩,压缩率没有LZMA高,但是我们可以加载指定资源而不用解压全部
注意:使用LZ4压缩,可以获得可以跟不压缩相媲美的加载速度,而且比不压缩文件要小

1.3选择菜单Assers-》点击Build AssetBundles 进行打包

在这里插入图片描述
得到打包后的文件
在这里插入图片描述

2.AssetBundle加载方式

原则上在使用资源之前需要先加载材质包,再创建prefab,防止材质丢失。share.unity3d为cubewallf的材质贴图包,share.unity3d和cubewall.unity3d加载先后顺序不影响

加载方式1:本地加载 AssetBundle.LoadFromFile

AssetBundle ab = AssetBundle.LoadFromFile("AssetBundles/share.unity3d");AssetBundle ab = AssetBundle.LoadFromFile("AssetBundles/cubewall.unity3d");GameObject wallPrefab = ab.LoadAsset<GameObject>("CubeWall");Instantiate(wallPrefab);

加载方式2: 内存中加载(异步) AssetBundle.LoadFromMemoryAsync

IEnumerator LoadFromMemoryAsync(string path){AssetBundleCreateRequest createRequest = AssetBundle.LoadFromMemoryAsync(File.ReadAllBytes(path));yield return createRequest;AssetBundle bundle = createRequest.assetBundle;var prefab = bundle.LoadAsset<GameObject>("MyObject");Instantiate(prefab);}

内存中加载(同步) AssetBundle.LoadFromMemory

AssetBundle ab=AssetBundle.LoadFromMemory(File.ReadAllBytes(path));

加载方式3:网络加载 UnityWebRequestAssetBundle

IEnumerator InstantiateObject()
{string uri = "file:///" + Application.dataPath + "/AssetBundles/" + assetBundleName; UnityEngine.Networking.UnityWebRequestAssetBundle request = UnityEngine.Networking.UnityWebRequestAssetBundle.GetAssetBundle(uri, 0);yield return request.SendWebRequest();AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(request);GameObject cube = bundle.LoadAsset<GameObject>("Cube");GameObject sprite = bundle.LoadAsset<GameObject>("Sprite");Instantiate(cube);Instantiate(sprite);
}

(弃用)网络加载2 LoadFromCacheOrDownload(string url, int version);

IEnumerator Start(){while (!Caching.ready)yield return null;using (var www = WWW.LoadFromCacheOrDownload("https://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;}}

API2:LoadFromCacheOrDownload(string url, int version, uint crc); crc表示校验完整性,crc在.mainifest文件里
在这里插入图片描述

3.通过Manifest文件得到某个包的依赖

AssetBundles.manifest 里面包含所有包对应的依赖
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/44e22eec07d7485fb7acc569b00c1cf2.png
代码:

AssetBundle manifestAB = AssetBundle.LoadFromFile("AssetBundles/AssetBundles");//固定为AssetBundles
AssetBundleManifest manifest = manifestAB.LoadAsset<AssetBundleManifest>("AssetBundleManifest");//固定为“AssetBundleManifest”
string[] strs = manifest.GetAllDependencies("cubewall.unity3d");
foreach (string name in strs) {print(name);//share.unity3dAssetBundle.LoadFromFile("AssetBundles/"+ name); //加载cubewall.unity3d的依赖包
}

4.AssetBundle的卸载

  • 卸载可以减少内容的使用
  • 不当的卸载,有可能导致丢失(材质丢失bug红等)
  • AssetBundle.Unload(true) 卸载所有资源,即使有资源被使用着,推荐这个方法,卸载前确保依赖的包不被其他物体使用了。可以在切换场景是loading scene阶段去卸载
  • AssetBundle.Unload(false) 卸载所有没有被使用的资源,一般不用这个方法,会导致某些资源不被卸载,导致内存被滥用
  • 个别资源的卸载 1.通过Resources.UnloadUnusedAssets 2.场景切换的时候,自动调用Resources.UnloadUnusedAssets

5.Unity AssetBundle Browser Tool

使用文档
github下载地址
在这里插入图片描述
在这里插入图片描述

这篇关于AssetBundle打包与加载的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/805117

相关文章

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

浅析Spring如何控制Bean的加载顺序

《浅析Spring如何控制Bean的加载顺序》在大多数情况下,我们不需要手动控制Bean的加载顺序,因为Spring的IoC容器足够智能,但在某些特殊场景下,这种隐式的依赖关系可能不存在,下面我们就来... 目录核心原则:依赖驱动加载手动控制 Bean 加载顺序的方法方法 1:使用@DependsOn(最直

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

Spring如何使用注解@DependsOn控制Bean加载顺序

《Spring如何使用注解@DependsOn控制Bean加载顺序》:本文主要介绍Spring如何使用注解@DependsOn控制Bean加载顺序,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录1.javascript 前言2. 代码实现总结1. 前言默认情况下,Spring加载Bean的顺

springboot加载不到nacos配置中心的配置问题处理

《springboot加载不到nacos配置中心的配置问题处理》:本文主要介绍springboot加载不到nacos配置中心的配置问题处理,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录springboot加载不到nacos配置中心的配置两种可能Spring Boot 版本Nacos

Python程序打包exe,单文件和多文件方式

《Python程序打包exe,单文件和多文件方式》:本文主要介绍Python程序打包exe,单文件和多文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python 脚本打成exe文件安装Pyinstaller准备一个ico图标打包方式一(适用于文件较少的程

使用Python获取JS加载的数据的多种实现方法

《使用Python获取JS加载的数据的多种实现方法》在当今的互联网时代,网页数据的动态加载已经成为一种常见的技术手段,许多现代网站通过JavaScript(JS)动态加载内容,这使得传统的静态网页爬取... 目录引言一、动态 网页与js加载数据的原理二、python爬取JS加载数据的方法(一)分析网络请求1

Maven项目打包时添加本地Jar包的操作步骤

《Maven项目打包时添加本地Jar包的操作步骤》在Maven项目开发中,我们经常会遇到需要引入本地Jar包的场景,比如使用未发布到中央仓库的第三方库或者处理版本冲突的依赖项,本文将详细介绍如何通过M... 目录一、适用场景说明​二、核心操作命令​1. 命令格式解析​2. 实战案例演示​三、项目配置步骤​1

IDEA下"File is read-only"可能原因分析及"找不到或无法加载主类"的问题

《IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题》:本文主要介绍IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题,具有很好的参... 目录1.File is read-only”可能原因2.“找不到或无法加载主类”问题的解决总结1.File

Spring Boot项目打包和运行的操作方法

《SpringBoot项目打包和运行的操作方法》SpringBoot应用内嵌了Web服务器,所以基于SpringBoot开发的web应用也可以独立运行,无须部署到其他Web服务器中,下面以打包dem... 目录一、打包为JAR包并运行1.打包为可执行的 JAR 包2.运行 JAR 包二、打包为WAR包并运行