Unity热更新学习(一) —— AssetBundle 打包和加载
理论不多说,网上,官方文档都有。 这里有一篇介绍很全面的文章:https://www.cnblogs.com/ybgame/p/3973177.html
示例和注意点记录一下,用到时以便查阅。
一、打包代码(Editor)
我所知道的,有两种打包方法:1、所有打包参数在代码里设置,完全代码控制;2、在编辑器中设置打包参数,代码简便
第一种:
在代码中指定bundle包名,指定包含在该bundle里的所有资源路径
[MenuItem("AssetsBundle/Build Bundle -- 代码中设置参数")]
static void BuildAB()
{
string path = Application.streamingAssetsPath + "/AssetsBundles/"; if (Directory.Exists(path))
Directory.Delete(path, true);
Directory.CreateDirectory(path); AssetBundleBuild[] buildMap = new AssetBundleBuild[]; //指定bundle包名
buildMap[].assetBundleName = "prefab_bundle"; string[] assets = new string[];
assets[] = "Assets/AssetsBundleObj/Cube.prefab"; // 必须是完整的文件名(包括后缀)
assets[] = "Assets/AssetsBundleObj/Sphere.prefab";
//指定bundle包含的资源路径数组
buildMap[].assetNames = assets; buildMap[].assetBundleName = "scene_bundle";
string[] scenes = new string[];
scenes[] = "Assets/_Scenes/Scene.unity";
buildMap[].assetNames = scenes; BuildPipeline.BuildAssetBundles(path, buildMap, BuildAssetBundleOptions.DeterministicAssetBundle, BuildTarget.StandaloneWindows);
}
代码中设置参数
第二种:
先在编辑器中设置参数,选中要打包的对象,设置好包名,后缀。
然后就直接打bundle包了,无需再在代码中处理包名之类的参数。
[MenuItem("AssetsBundle/Build Bundle -- 编辑器中设置参数")]
static void BuildAB2()
{
string path = Application.streamingAssetsPath + "/AssetsBundles/"; if (Directory.Exists(path))
Directory.Delete(path, true);
Directory.CreateDirectory(path); BuildPipeline.BuildAssetBundles(path, BuildAssetBundleOptions.DeterministicAssetBundle, BuildTarget.StandaloneWindows);
}
编辑器中设置参数
二、加载代码(runtime)
通过www方法加载bundle,并把加载出来的资源实例化。
void OnGUI()
{
if (GUILayout.Button("加载预制体Cube"))
{
StartCoroutine(LoadObj("prefab_bundle", "cube.prefab"));//有没有.prefab后缀都正常加载
}
if (GUILayout.Button("加载预制体Sphere"))
{
StartCoroutine(LoadObj("prefab_bundle", "sphere"));
}
}
/// <summary>
/// 加载预制体
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
IEnumerator LoadObj(string bundle_name, string name)
{
string path = "file://" + Application.streamingAssetsPath + "/AssetsBundles/" + bundle_name;
//Debug.LogError(string.Format("obj {0}", path));
WWW www = new WWW(path);
yield return www;
if (www.error == null)
{
AssetBundle bundle = www.assetBundle;
//这里LoadAsset第二个参数 有没有都能正常运行,这个类型到底什么用途还有待研究
GameObject go = Instantiate(bundle.LoadAsset(name, typeof(GameObject))) as GameObject;
//go.transform.parent = transform;
// 上一次加载完之后,下一次加载之前,必须卸载AssetBundle,不然再次加载报错:
// The AssetBundle 'Memory' can't be loaded because another AssetBundle with the same files is already loaded
bundle.Unload(false);
}else
{
Debug.LogError(www.error);
}
}
加载预制体测试
Unity热更新学习(一) —— AssetBundle 打包和加载的更多相关文章
- Unity热更新学习(二) —— ToLua c#与lua的相互调用
tolua 下载地址:http://www.ulua.org/index.html c#调用lua的方法,tolua的官方例子提供了很多种.我初步学了一种在做项目使用的方法.通过DoFile方法执行l ...
- Unity热更新技术整理
一.热更新学习介绍 1.什么是热更新 举例来说: 游戏上线后,玩家下载第一个版本(70M左右或者更大),在运营的过程中,如果需要更换UI显示,或者修改游戏的逻辑,这个时候,如果不使用热更新,就需要重新 ...
- unity热更新方案对比
Unity应用的iOS热更新 • 什么是热更新 • 为何要热更新 • 怎样在iOS 上对Unity 应用进行热更新 • 支持Unity iOS 热更新的各种Lua 插件的对照 什么是热更新 • ...
- 另类Unity热更新大法:代码注入式补丁热更新
对老项目进行热更新 项目用纯C#开发的? 眼看Unity引擎热火朝天,无数程序猿加入到了Unity开发的大本营. 一些老项目,在当时ulua/slua还不如今天那样的成熟,因此他们选择了全c#开发:也 ...
- Unity热更新对比
https://www.jianshu.com/p/f9d90edf4a7c Unity 热更新为啥用Lua 详解 ILRuntime的优势 同市面上的其他热更方案相比,ILRuntime主要有以下优 ...
- Demo示例——Bundle打包和加载
Unity游戏里面的场景.模型.图片等资源,是如何管理和加载的? 这就是本文要讲的资源管理方式--bundle打包和加载. 图片 Unity游戏资源管理有很多方式: (1)简单游戏比如demo,可以直 ...
- Unity热更新 AssetBundle
在游戏开发中,常常需要用到热更新技术.比如:一个手机游戏开发好后,用户安装到手机上.如果此时我们要更新一个新的功能,如果没有热更新,那么需要用户卸载掉手机上的游戏,然后安装新的包,这样做十分麻烦,而且 ...
- unity ab包打包和加载的简单学习示例
闲着没事结合项目看了下unity AssetBundle打包和使用,写了一些测试例子,需要的可以拿去,导入一个空项目即可 链接:https://pan.baidu.com/s/1H85dnMNkRoW ...
- [Unity热更新]tolua# & LuaFramework(一):基础
一.tolua# c#调用lua:LuaState[变量名/函数名] 1.LuaState a.执行lua代码段 DoString(string) DoFile(.lua文件名) Require(.l ...
随机推荐
- iOS ----------字符串处理
//一.NSString/*----------------创建字符串的方法----------------*/ //1.创建常量字符串.NSString *astring = @"This ...
- Python 基于Python从mysql表读取千万数据实践
基于Python 从mysql表读取千万数据实践 by:授客 QQ:1033553122 场景: 有以下两个表,两者都有一个表字段,名为waybill_no,我们需要从tl_waybill_b ...
- loadrunner 脚本录制-Action分类
脚本录制-Action分类 by:授客 QQ:1033553122 Action分类 l . Vuser_init 2. Vuser_end 3. Action 在lr中用户的初始化操作应该存放在V ...
- Android智能指针SP WP使用方法介绍
Android手机操作系统既然是开源的操作系统.那么在具体的文件夹中就会存放着各种相关功能的开源代码.我们在使用的时候可以根据这些源代码进行相应的修改就能轻松的完成我们所需的功能.在这里大家就一起来看 ...
- Win10更新
Turn: https://m.uczzd.cn/webview/news?app=meizubrw-iflow&aid=11529477703533248224&cid=100&am ...
- MyBatis:参数传递 [转]
一.单个参数: public List<XXBean> getXXBeanList(String xxCode); <select id="getXXXBeanList&q ...
- python中自定义模块的引用
在python中,实现能够在任何路径下都可以直接import,就必须将存放函数或类的文件添加到python的搜索路径. 其实很简单,主要步骤就是: import sys sys.path.append ...
- Vue技巧小结(持续更新)
1. 动态生成的input自动focus 背景: input元素在需要时才插入DOM,这时元素用autofocus属性第一次是可以获取焦点,但是如果有第二个,就不再生效,所以得另外的办法. 方法: / ...
- 【Linux基础】history查看历史命令
1.history命令 “history”命令就是历史记录.它显示了在终端中所执行过的所有命令的历史. history //显示终端执行过的命令 history //显示最近10条终端执行过的命令 C ...
- C#基础知识之读取xlsx文件Excel2007
读取Excel 2007的xlsx文件和读取老的.xls文件是一样的,都是用Oledb读取,仅仅连接字符串不同而已. 具体代码实例: public static DataTable GetExcelT ...