工程中的模型等资源转化为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应用的更多相关文章

  1. Unity3D 中材质球(Material)预制体打包成AB(AssetBundle)出现材质丢失问题的解决方案

    关于Unity3D中打AB(AssetBundle)资源包,默认是不连Shader一同打包进去的,所以得自行添加,添加方式比较简单,不需要往项目中添加Shader,只是点选一下就可以了,具体实现方式如 ...

  2. Unity3d中使用assetbundle

    1.导出assetbundle: ①单个资源导出成assetbundle: ②多个资源导出成一个assetbundle: 2.读取assetbundle: ①加载到内存: ②解压为具体资源. 1.导出 ...

  3. Unity3D之Assetbundle

    原地址: Unity3D之Assetbundle 有几个地方需要注意下 1.如何解决资源重复加载的问题 2.初始化了就直接出现在场景中了  感觉怪怪的 3.标红的地方要注意下  prefab上挂载的脚 ...

  4. 在Unity3d中解析Lua脚本的方法

    由于近期项目中提出了热更新的需求,因此本周末在Lua的陪伴下度过.对Lua与Unity3d的搭配使用,仅仅达到了一个初窥门径的程度,记录一二于此.水平有限,欢迎批评指正. 网络上关于Lua脚本和Uni ...

  5. Unity3D中的线程与协程

    线程 Unity3D是以生命周期主线程循环进行游戏开发. Unity3D中的子线程无法运行Unity SDK(开发者工具包,软件包.软件框架)跟API(应用程序编程接口,函数库). 限制原因:大多数游 ...

  6. 【Unity3d游戏开发】Unity3D中的3D数学基础---向量

    向量是2D.3D数学研究的标准工具,在3D游戏中向量是基础.因此掌握好向量的一些基本概念以及属性和常用运算方法就显得尤为重要.在本篇博客中,马三就来和大家一起回顾和学习一下Unity3D中那些常用的3 ...

  7. Unity3D中可中途释放的单例

    Unity3D中可中途释放的单例 使用静态类,静态变量的坏处是从程序加载后就一直占用内存,想要释放比较麻烦,可是之前使用的单例,没有提供释放的方法,那是不是也同静态的一样直到程序结束菜释放?那单例的好 ...

  8. 图文详解Unity3D中Material的Tiling和Offset是怎么回事

    图文详解Unity3D中Material的Tiling和Offset是怎么回事 Tiling和Offset概述 Tiling表示UV坐标的缩放倍数,Offset表示UV坐标的起始位置. 这样说当然是隔 ...

  9. unity3d中 刚体(Rigidbody) 碰撞体(Collider) 触发器(Is Trigger)

      刚体(Rigidbody)的官方(摘自Unity3d的官方指导书<Unity4.x从入门到精通>)解释如下: Rigidbody(刚体)组件可使游戏对象在物理系统的控制下来运动,刚体可 ...

随机推荐

  1. 同时安装 Python 2 与Python 3 的方法及pip模块的下载安装

    Python虽然功能强大,上手容易,但版本问题却是个烦人的问题. Python 2.x 和 Python 3.x 版本之间存在很大的不兼容. 同时安装Python2.x和Python3.x 1. 在P ...

  2. 【第二组】Hunter——beta版发布文档

    软件测试报告 一.bug情况汇总 尚需解决以及难以解决的: 登录时会有卡顿,需要加入加载进度条(会添加的) 商城和背包功能尚未实现(需要修复) 美工水平太差,让人没有使用的欲望(大概接下来就专门做这个 ...

  3. Day06 - Ruby三种存取限制:Public,Protected,Private

    前情提要: 在第五天的最后,我们提到了一句话“相同的class的实体也无法使用别人的singleton method”. 在今天,我们把焦点放在Ruby的method,继续了解存取限制:) Ruby经 ...

  4. docker搭建gitlab服务器(Centos7)

    系统环境:CentOS Linux release 7.6.1810 (Core) git版本:gitlab/gitlab-ce 一.安装和启动docker 见HTTPRUNNERMANAGER安装部 ...

  5. centos7 安装memcached

    (1)编译安装Memcached 1.51.1 安装依赖包libevent# yum -y install epel-release# yum -y install libevent libevent ...

  6. codecombat之地牢关卡Python代码

    1.地牢 # 向宝石进发. # 小心撞墙! # 在下面输入你的代码. self.moveRight() self.moveDown() self.moveRight() 2.深藏的宝石 # 利用你的移 ...

  7. Exp4 恶意代码分析 20165110

    Exp4 恶意代码分析 20165110 一.实践目标 1.是监控你自己系统的运行状态,看有没有可疑的程序在运行. 2.是分析一个恶意软件,就分析Exp2或Exp3中生成后门软件:分析工具尽量使用原生 ...

  8. python字符串处理内置方法一览表

    python字符串处理内置方法一览表   序号 方法及描述 1 capitalize()将字符串的第一个字符转换为大写 2 center(width, fillchar) 返回一个指定的宽度 widt ...

  9. Mybatis之批量操作

    首先批量操作的优点是:大大的提高查询的效率. 举个简单的例子:如果在程序中遍历来执行sql的话,这种情况就是有多少行数据就要执行多少条sql,这样导致的效率将是非常低. 如下可能需要40s inser ...

  10. 20165315 2018-2019-2 《网络对抗技术》Exp0 Kali安装 Week1

    20165315 2018-2019-2 <网络对抗技术>Exp0 Kali安装 Week1 一.安装过程 1.基本配置 创建一个新的自定义vm 选择创建自定虚拟机 操作系统选择" ...