Unity3D中AssetBundle应用
工程中的模型等资源转化为Prefab后,打包成AssetBundle,可以大幅降低资源的空间占有度,并且提高资源加载的效率。
一、AssetBundle的打包
先看下打包Prefab的脚本代码,这段脚本可以将一个或多个选中的Prefab打包成对应名称的.assetbundle文件:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class CreateAssetBundlesMainClass : MonoBehaviour {
[MenuItem("Custom Editor/Create AssetBunldes Main")]
static void CreateAssetBundlesMain()
{
//获取在Project视图中选择的所有游戏对象
Object[] SelectedAsset = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets); //遍历所有的游戏对象
foreach (Object obj in SelectedAsset)
{
string sourcePath = AssetDatabase.GetAssetPath(obj);
//本地测试:建议最后将Assetbundle放在StreamingAssets文件夹下,如果没有就创建一个,因为移动平台下只能读取这个路径
//StreamingAssets是只读路径,不能写入
//服务器下载:就不需要放在这里,服务器上客户端用www类进行下载。
string targetPath = Application.dataPath + "/StreamingAssets/" + obj.name + ".assetbundle";
if (BuildPipeline.BuildAssetBundle(obj, null, targetPath,
BuildAssetBundleOptions.CollectDependencies, BuildTarget.StandaloneWindows64))
{
Debug.Log(obj.name + "资源打包成功");
}
else
{
Debug.Log(obj.name + "资源打包失败");
}
}
//刷新编辑器
AssetDatabase.Refresh(); }
}
以上脚本不用挂在到场景中的游戏对象,只需要保存在Project中就可以。在菜单栏会生成一系列选项(All是打包所有Prefab、Main是打包选定的Prefab、Scene是打包场景;上述代码是打包单个Prefab):

在Project中选中要打包的Prefab,一个或多个,点击Create AssetBundles Main,就可以打包出对应的AB。比如选中了Prefab0和Prefab1再点击Create AssetBundles Main,就会生成出Prefab0.assetbundle和Prefab1.assetbundle,打包出的文件会保存在StreamingAssetes文件夹中:

打包所有Prefab的代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor; public class CreateAssetBundlesALLClass : MonoBehaviour { [MenuItem("Custom Editor/Create AssetBunldes ALL")]
static void CreateAssetBundlesALL()
{ Caching.ClearCache(); string Path = Application.dataPath + "/StreamingAssets/ALL.assetbundle"; Object[] SelectedAsset = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets); foreach (Object obj in SelectedAsset)
{
Debug.Log("Create AssetBunldes name :" + obj);
} //这里注意第二个参数就行
if (BuildPipeline.BuildAssetBundle(null, SelectedAsset, Path,
BuildAssetBundleOptions.CollectDependencies, BuildTarget.StandaloneWindows64))
{
AssetDatabase.Refresh();
}
else
{ }
}
}
选中Prefab0和Prefab1再点击Create AssetBundles All,就会将Prefab0和Prefab1合在一起打包为一个文件——ALL.assetbundle。
二、AssetBundle的加载
下面是加载AB的脚本,这个文件需要挂在到场景中的游戏对象上才能有效。
using UnityEngine;
using System.Collections; public class RunScript : MonoBehaviour
{
public static string PathURL; private void OnEnable()
{
PathURL = "file://" + Application.dataPath + "/StreamingAssets/";
} void OnGUI()
{
if (GUILayout.Button("Load One Assetbundle"))
{
StartCoroutine(LoadMainGameObject(PathURL + "Prefab0.assetbundle"));
//StartCoroutine(LoadMainGameObject(PathURL + "Prefab1.assetbundle"));
} if (GUILayout.Button("Load All Assetbundle"))
{
StartCoroutine(LoadALLGameObject(PathURL + "ALL.assetbundle"));
} } //读取一个资源 private IEnumerator LoadMainGameObject(string path)
{
WWW bundle = new WWW(path); yield return bundle; //加载到游戏中
yield return Instantiate(bundle.assetBundle.mainAsset); bundle.assetBundle.Unload(false);
//AssetBundle.Unload(false):释放AssetBundle文件内存镜像
//AssetBundle.Unload(true):释放AssetBundle文件内存镜像同时销毁所有已经Load的Assets内存对象 } //读取全部资源 private IEnumerator LoadALLGameObject(string path)
{
WWW bundle = new WWW(path); yield return bundle; //通过Prefab的名称把他们都读取出来
Object obj0 = bundle.assetBundle.LoadAsset("Prefab0");
Object obj1 = bundle.assetBundle.LoadAsset("Prefab1"); //加载到游戏中
yield return Instantiate(obj0);
yield return Instantiate(obj1);
bundle.assetBundle.Unload(false);
} }
游戏运行后脚本使游戏左上角生成两个加载按钮,点击后会从之前保存AB的路径将其加载进来,如点击Load ALL Assetbundle,就会加载ALL.assetbundle,从而把两个Prefab都加载进来:

加载脚本中使用了协程,主要原因是为了将AB的下载和Prefab的加载分离到两个逻辑帧中进行,避免下载和读取的冲突。使用yield return,可以起到检查当前返回的异步对象是否能够顺利进入到下一帧的作用。

附一张AB的生命周期图:

Unity3D中AssetBundle应用的更多相关文章
- Unity3D 中材质球(Material)预制体打包成AB(AssetBundle)出现材质丢失问题的解决方案
关于Unity3D中打AB(AssetBundle)资源包,默认是不连Shader一同打包进去的,所以得自行添加,添加方式比较简单,不需要往项目中添加Shader,只是点选一下就可以了,具体实现方式如 ...
- Unity3d中使用assetbundle
1.导出assetbundle: ①单个资源导出成assetbundle: ②多个资源导出成一个assetbundle: 2.读取assetbundle: ①加载到内存: ②解压为具体资源. 1.导出 ...
- Unity3D之Assetbundle
原地址: Unity3D之Assetbundle 有几个地方需要注意下 1.如何解决资源重复加载的问题 2.初始化了就直接出现在场景中了 感觉怪怪的 3.标红的地方要注意下 prefab上挂载的脚 ...
- 在Unity3d中解析Lua脚本的方法
由于近期项目中提出了热更新的需求,因此本周末在Lua的陪伴下度过.对Lua与Unity3d的搭配使用,仅仅达到了一个初窥门径的程度,记录一二于此.水平有限,欢迎批评指正. 网络上关于Lua脚本和Uni ...
- Unity3D中的线程与协程
线程 Unity3D是以生命周期主线程循环进行游戏开发. Unity3D中的子线程无法运行Unity SDK(开发者工具包,软件包.软件框架)跟API(应用程序编程接口,函数库). 限制原因:大多数游 ...
- 【Unity3d游戏开发】Unity3D中的3D数学基础---向量
向量是2D.3D数学研究的标准工具,在3D游戏中向量是基础.因此掌握好向量的一些基本概念以及属性和常用运算方法就显得尤为重要.在本篇博客中,马三就来和大家一起回顾和学习一下Unity3D中那些常用的3 ...
- Unity3D中可中途释放的单例
Unity3D中可中途释放的单例 使用静态类,静态变量的坏处是从程序加载后就一直占用内存,想要释放比较麻烦,可是之前使用的单例,没有提供释放的方法,那是不是也同静态的一样直到程序结束菜释放?那单例的好 ...
- 图文详解Unity3D中Material的Tiling和Offset是怎么回事
图文详解Unity3D中Material的Tiling和Offset是怎么回事 Tiling和Offset概述 Tiling表示UV坐标的缩放倍数,Offset表示UV坐标的起始位置. 这样说当然是隔 ...
- unity3d中 刚体(Rigidbody) 碰撞体(Collider) 触发器(Is Trigger)
刚体(Rigidbody)的官方(摘自Unity3d的官方指导书<Unity4.x从入门到精通>)解释如下: Rigidbody(刚体)组件可使游戏对象在物理系统的控制下来运动,刚体可 ...
随机推荐
- fopen特殊模式r+, w+, a+辨析
fopen模式分两大类,即 TEXT模式:r, w, a, r+, w+, a+ BIN模式:rb, wb, ab, r+b, w+b, a+b 模式 读指针初始位置 写指针初始位置 模式用途 详细说 ...
- 2018/12/22:centos中转换目录时/root的影响
今天在将一个压缩包复制到/root下,并解压.从表面看我试在根目录下,但是就是不能进入生成的目录,提示no such file or diraction.最后我加上/root又好了,奇怪 编译环境:输 ...
- HTTP 学习心得
一.什么是HTTP? 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议.所有的WWW文件都必须遵守这个标准.设计HTTP最初的目的 ...
- 云笔记项目-Spring事务学习-传播SUPPORTS
接下来测试事务传播属性SUPPORTS Service层 Service层将方法的事务传播属性设置为SUPPORTS LayerT层代码 package LayerT; import javax.an ...
- Git安装配置和提交本地代码至Github,修改GitHub上显示的项目语言
1. 下载安装git Windows版Git下载地址: https://gitforwindows.org/ 安装没有特别要求可以一路Next即可,安装完成后可以看到: 2. 创建本地代码仓库 打开G ...
- Excel vba:批量生成超链接,添加边框,移动sheet等
Excel vba 操作 批量生成sheet目录并添加超链接 Sub Add_Sheets_Link() 'Worksheets(5)为清单目录页 '在sheet页上生成sheet页名字并超链接 To ...
- innodb 体系结构(后台进程)
一.后台进程(innodb 1.0.x以前的) 1.master thread master thread具有最高的线程优先级别,其内部由多个循环(loop)组成:主循环(loop).后台循环(bac ...
- QVariant类
QVariant类: #include "widget.h" #include <QApplication> #include <QDebug> int m ...
- 【redis 学习系列】API的理解与使用(二)
3.哈希 几乎所有的语言都支持了哈希(hash)类型.在Redis中,哈希类型是指键值本身又是一个键值对结构,形如:value = {{field, value} ... {field, value} ...
- canvas 的HTML属性
(一) width/height 默认值与单位 Canvas 标签只有两个属性—— width\height,作为一种替换元素,它默认大小为300×150像素. canvas的单位只能是是px,值只 ...