【Unity】AssetBundle的使用——打包/解包
最近参考了各位大神的资源,初步学习了Unity的资源管理模式,包括在编辑器管理(使用AssetDatabase)和在运行时管理(使用Resources和AssetBundle)。在此简单总结运行时用AssetBundle动态打包/解包资源的方法,方便自己回顾。
关于AssetBundle有很多的细节问题,在此先作个笔记,等更多的问题搞清楚了/有了新的理解,再接着补充/修改。
创建编辑器菜单项,用于打包AssetBundle
using UnityEngine;
using System.Collections;
using System.Collections.Generic; // 需要使用List集合
using UnityEditor; // 创建编辑器菜单项需要导入这个文件
public class CreateMenuItem { // 不需要继承Mono
[MenuItem("My MenuItem/Build AssetBundle")]
public static void BuildBundle()
{
List<AssetBundleBuild> list = new List<AssetBundleBuild>(); // 多个资源可以打入一个包中,不确定个数时,可用List集合一个一个添加
AssetBundleBuild b = new AssetBundleBuild();
b.assetBundleName = "1.unity3d"; // 用于加载该资源,相当于这个资源在AssetBundleBuild中的ID,因为AssetBundleBuild中可能有多个资源
b.assetNames = new string[] { "Assets/Resources/Images/1.jpg" }; // 这个AssetBundleBuild里包含的哪些资源
list.Add(b);
// 该方法不会自动生成文件夹,所以若指定的文件夹不存在,则打包失败
BuildPipeline.BuildAssetBundles("Assets/Bundles", list.ToArray(), BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
}
}
打包成功后,在目标文件夹下多了如下4个文件:
关于制作编辑器菜单项
- 需要把该脚本放在Editor目录下,建议在Assets根目录下新建“Editor”文件夹。
- 需要导入UnityEditor文件。
- 菜单项的类不用继承MonoBehaviour。
- 需要使用MenuItem特性。
- 点击菜单项触发的函数是static静态的。
关于打包AssetBundle
- assetBundleName : 该资源打入包后的名字,解包时可用该名字访问到该资源。
- assetNames : 要被打包的资源当前的相对路径。
- 打包函数:BuildPipeline.BuildAssetBundles()。
- 打包函数要求传入AssetBundleBuild[]数组,因为一个AssetBundle压缩包中可以被加入多个资源,可以使用动态数组List来替代(不用指定数组长度),使用集合的Add()方法将资源一个一个加入包中。
- 关于参数BuildAssetBundleOptions,以前常用的选项BuildAssetBundleOptions.CollectDependencies和BuildAssetBundleOptions.CompleteAssets都已过时,官方文档解释是这两种选项现在都默认会被执行。关于这个参数我没有过多的探究,这里暂时选用了BuildAssetBundleOptions.None。
- 方法的最后一个参数BuildTarget指定打包到哪个平台下,这里我用PC测试选择BuildTarget.StandaloneWindows64。
- 打包方法中填的目标文件夹路径如果不存在,该方法不会创建该文件夹,打包失败。
- 这里只是简单的打包一个资源,没有涉及打包多个资源时,不同资源有共通引用别的资源的问题,学习中。
加载/解包AssetBundle
public class LoadAssetBundle : MonoBehaviour {
void Start () {
StartCoroutine(Load());
}
// 加载AssetBundle压缩包是个异步过程,需要开启协程
IEnumerator Load()
{
// 步骤一:获取AssetBundle压缩包
// WWW www = new WWW("http://myserver/myBundle.unity3d"); // 从远端服务器下载
// WWW www = new WWW("File://" + Application.streamingAssetsPath + "1.unity3d"); // 手机上从本机加载
WWW www = new WWW("File:///D:/Unity Projects/Learn Asset Manage/Assets/Bundles/1.unity3d"); // 从PC本机加载,是三个杠
yield return www;
AssetBundle build = www.assetBundle;
Debug.Log(build); // 测试是否非空
// 步骤二:解包获取资源
/*
// 异步加载,分帧操作
AssetBundleRequest request = build.LoadAssetAsync("Assets/Prefabs/airplane.prefab", typeof(GameObject)); // 名字和类型是打包时确定的
yield return request;
GameObject go = request.asset as GameObject;
*/
// 同步加载,速度更快,但可能会阻塞主线程
GameObject go = build.LoadAsset<GameObject>("Assets/Prefabs/airplane.prefab");
Instantiate(go, new Vector3(0, 0, 0), Quaternion.identity);
// 完成后释放原始镜像文件
www.Dispose();
}
}
注意点:
- 加载AssetBundle压缩包是个异步过程,需要开启协程。
- 压缩包的获取方式有三种:从远端服务器、手机上本地加载、PC上本地加载。想要在手机上加载本地AssetBundle,需要将所需资源包存放在自创建的名为“StreamingAssets”的文件夹中,该资源才能发布到真机上。参考Streaming Assets
- 解AssetBundle包可以使用异步或同步加载方式,前者分帧操作加载稍慢,后者加载更快但可能阻塞主线程。
- 解压完成后可以通过www.Dispose()方法将原WWW的压缩包镜像文件释放。
【Unity】AssetBundle的使用——打包/解包的更多相关文章
- Mtk Android 打包解包*.img
打包/解包 boot.img, system.img, userdata.img, or recovery.img [DESCRIPTION] MTK codebase编译出来的image必须使用MT ...
- 基于RTP的H264视频数据打包解包类
from:http://blog.csdn.net/dengzikun/article/details/5807694 最近考虑使用RTP替换原有的高清视频传输协议,遂上网查找有关H264视频RTP打 ...
- Java之集合初探(二)Iterator(迭代器),collections,打包/解包(装箱拆箱),泛型(Generic),comparable接口
Iterator(迭代器) 所有实现了Collection接口的容器都有一个iterator方法, 用来返回一个实现了Iterator接口的对象 Iterator对象称作迭代器, 用来方便的实现对容器 ...
- xpack文件打包解包代码库
Github ###概述 xpack是一个文件资源打包工具及类库,可以对多文件进行打包解包. 其使用文件名的hash作为索引,建立hash索引表以加速文件查找. ###特性 支持hashid自动解冲突 ...
- (转)基于RTP的H264视频数据打包解包类
最近考虑使用RTP替换原有的高清视频传输协议,遂上网查找有关H264视频RTP打包.解包的文档和代码.功夫不负有心人,找到不少有价值的文档和代码.参考这些资料,写了H264 RTP打包类.解包类,实现 ...
- Ruby中星号打包解包操作
Ruby中可以使用一个星号*和两个星号**完成一些打包.解包操作,它们称为splat操作符: 一个星号:以数组为依据进行打包解包(参考文章) 两个星号:以hash为依据进行打包解包(参考文章) 两个星 ...
- 07.进程管理+作业控制+文件查找与压缩+文件压缩与打包+tar打包解包+NFS
进程管理 程序放在磁盘上叫文件,把它复制到内存,并在cpu运行,就叫进程, 进程多少也反映当前运行程序的多少 进程在系统中会为每个进程生成一个进程号,在所有的进程中有一个特殊进程即init进程, 它是 ...
- linux 配置网卡、远程拷贝文件、建立软硬链接、打包/解包、压缩/解压缩、包操作、yum配置使用、root密码忘记
目录 一.配置网卡 二.xshell连接 三.远程拷贝文件 四.建立软硬连接 五.打包/解包和压缩/解压缩 六.包操作 七.配置yum源 配置yum源 配置阿里云源 常用命令 yum其他命令 八.重置 ...
- linux 打包/解包
zip: 压缩(递归) zip -r x.zip x 解压(覆盖所有) unzip -o x.zip tar: 打包 tar -czvf x.tar x 解包 tar -xzvf x.tar
随机推荐
- Android应用截图方法
在Android应用开发过程中,可能会遇到需要对整个界面或者某一部分进行截图的需求.Android中对View的截图也有很多中方式: 使用DrawingCache 直接调用View.draw Draw ...
- Java 9 揭秘(1. 入门介绍)
文 by / 林本托 在第一部分中,主要讲解如下内容: JDK 9 包含了哪些内容 运行代码的系统要求 如何安装 NetBeans 1 JDK 介绍 JDK 9是Java开发工具包的第九个主要版本,计 ...
- Ajax接收并显示后台传来的list集合内的数据信息
最近在学习Ajax做一个留言系统的时候碰到需要将list集合从后台传到前台ajax接收并显示的情况,在网上搜了很多,但很多情况都不是和我遇见的情况一样的,现在,直接贴出我的问题及解决方法. 后台代码: ...
- scala中json与对象的转换
遇到的问题 因为要把spark从es读出来的json数据转换为对象,开始想用case class定义类型,通过fastjson做转换.如下 case class Book (author: Strin ...
- sprintboot 发布
http://blog.csdn.net/hguisu/article/details/51072683
- MAME模拟器使用简单教程
平时比较喜欢玩小时候的街机游戏,一开始用Winkawas,后来改用MAME,原因无他,mame是开源软件,更新更稳定可靠,但是它也有几个问题,记录一下. 1.MAME官网:www.mamedev.or ...
- nginx configure fastdfs + SSL
./configure \ --prefix=/usr/local/nginx \ --with-http_stub_status_module \ --with-http_ssl_module \ ...
- 【IOS学习】之四、协议,委托,分类粗解
何为协议,何为委托,何为分类(类别)? 委托 即 代理 delegate: 他是 (接口的实现类)类似c中的回调. 把某个对象要做的事情委托给别的对象去做. 那么别的对象就是这个对 ...
- [Windows Azure] Virtual Machine and Cloud Service Sizes for Windows Azure
Virtual machine size CPU cores Memory OS disk space–cloud services OS disk space–virtual machines Ma ...
- (原创)拨开迷雾见月明-剖析asio中的proactor模式(二)
在上一篇博文中我们提到异步请求是从上层开始,一层一层转发到最下面的服务层的对象win_iocp_socket_service,由它将请求转发到操作系统(调用windows api),操作系统处理完异步 ...