【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
随机推荐
- MongoDB 学习笔记(1)
数据库 一个mongodb中可以建立多个数据库. MongoDB的默认数据库为"db",该数据库存储在data目录中. MongoDB的单个实例可以容纳多个独立的数据库,每一个都有 ...
- Android App卡顿慢优化之解决内存抖动及内存泄漏
前面一篇博客说到了,内存抖动的第二种情况,就是必须在短时间内创建对象,但是要控制数量:这个问题目前可以使用对象池的方法解决. 3)Object Pools 在程序里面经常会遇到的一个问题是短时间内创建 ...
- 【Qt】StackedWidget
一个简单的堆栈窗体类: 左側列表框会出现不同的选项,右側显示所选的不同的窗口 #include<QHBoxLayout> #include "stackdlg.h" S ...
- 复杂对象类型的WebService高级部分
从客户端除了传递字符串以外还可以传递复杂对象(对象必须序列化了),List,Map,数组和文件. (1)定义一个对象实现了serializable 接口package cn.com.chenlly.s ...
- java中基础数据类型的应用
1.float 与 double float是单精度类型,占用4个字节的存储空间 double是双精度类型,占用8个字节的存储空间 1)当你不声明的时候,默认小数都用double来表示,所以如果要 ...
- mybatis与mysql中的Date和String之间转换
在javaweb开发过程中,难免会使用日期类型,在持久化时java的日期格式可以是String,Date.mysql格式可以是varchar,datetime.他们之间如何进行相互转化? 1 java ...
- HTC T329手机如何删除系统自带的软件?HTC一键解锁、获取ROOT权限、豌豆荚删除系统软件
手头一部HTC T329T手机,机上默认装载的软件实在太多了,居然占用了4页.用360手机卫士并不能删除系统软件(不能获取ROOT权限).查网上查询,总结要删除系统软件步骤如下(本人不刷机,只是想删除 ...
- 安装/移除 MySQL 服务
MySQL Community Server 下载:https://dev.mysql.com/downloads/mysql/ 以下内容使用的版本为:mysql-5.7.17-win32.zip 1 ...
- LVL类及接口使用介绍(License Verification Library )
原文:http://android.eoe.cn/topic/android_sdk LVL Classes and Interfaces-LVL类和接口 Table 1 lists all of t ...
- 云服务设置多台tomcat开机自启动
紧接此篇文章:http://www.cnblogs.com/leechenxiang/p/7091731.html 1. 修改profile,添加红框内6行代码 vim /etc/profile 代码 ...