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 ...
随机推荐
- Android为TV端助力 handler传递消息机制
当工作线程给主线程发送消息时,因为主线程是有looper的,所以不需要初始化looper,注意给谁发消息就关联谁的handler,此时用的就是主线程的handler handler会把消息发送到Mes ...
- Centos 7下VMware三台虚拟机Hadoop集群初体验
一.下载并安装Centos 7 传送门:https://www.centos.org/download/ 注:下载DVD ISO镜像 这里详解一下VMware安装中的两个过程 网卡配置 是Add ...
- CsQuery获取IDomObject元素的完整CSS选择器
一.方法说明 通过IDomObject元素,获取完整的CSS选择器,过滤HTML和BODY元素,自动将class.id添加到选择器上,优先添加class,无class再添加id.如: <html ...
- c/c++ 用前序和中序,或者中序和后序,创建二叉树
c/c++ 用前序和中序,或者中序和后序,创建二叉树 用前序和中序创建二叉树 //用没有结束标记的char*, clr为前序,lcr为中序来创建树 //前序的第一个字符一定是root节点,然后去中序字 ...
- emacs 利用 auto-complete 自动补齐
emacs 利用 auto-complete 自动补齐 1,首先导入melpa,在文件~/.emacs中添加下面代码 (require 'package) (package-initialize) ( ...
- Linux 中数组的使用
Linux中数组本人可能用的相对较少,但是会经常遇见,也容易忘记,就顺便记录下来吧 数值类型的数组:一对括号表示数组,数组中元素之间使用“空格”来隔开 arr=(1 2 3 4 5) 字符串类型数组: ...
- [Hive_add_4] Hive 命令行客户端 Beeline 的使用
0. 说明 Hive 命令行客户端 beeline 的使用,建立在启动 Hadoop 集群和启动 hiveserver2 的基础之上 1. 使用指南 在确保集群启动和 hiveserver2 启动的 ...
- 数据挖掘---Pandas的学习
Pandas介绍(panel + data + analysis) 为什么使用Pandas 便捷的数据处理能力 读取文件方便 封装了Matplotlib.Nu ...
- ELK收集tomcat状态日志
1.先查看之前的状态日志输出格式:在logs/catalina.out这个文件中 最上面的日志格式我们可能不太习惯使用,所以能输出下面的格式是最好的,当然需要我们自定义日志格式,接下来看看如何修改 2 ...
- GitHub-暂存区与版本回退
参考博文:廖雪峰Git教程 1. 工作区和暂存区 Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念. 1.1. 工作区(Working Directory) 就是你在电脑里能看到的目录 ...