看到这篇文章的小伙伴,建议先去阅读一下官方手册:
https://docs.unity3d.com/2017.4/Documentation/Manual/AssetBundles-Workflow.html
内容非常详细,易懂。小编今天只是个人总结一下,希望能帮助到小伙伴们(ˉ▽ ̄~)
一、简介
我们在开发游戏的时候,经常提及到热更新,那么热更新是什么呢,官方解释来一波(ˉ▽ ̄~)
- 热更新是一种各大手游等众多App常用的更新方式。简单来说,就是在用户通下载安装APP之后,打开App时遇到的即时更新。
是不是简单明了,那么热更新主要更新什么呢,1.代码 2.资源
今天小编来研究一下资源更新 O(∩_∩)O 以下内容仅是个人总结的简单的方法,后期如果出现Bug 可以给小编留言哦(ˉ▽ ̄~) 目前测试木问题的啦~
二、内容
1.编辑器设置如下图:
- 点击预制体之后,编辑器右下角会有这个设置,自行命名(New一个)只给你需要更新的资源预制体修改即可~ 支持多选修改,小编建议把与预制体相关的依赖文件也一起打包。否则可能会出现丢包的现象。
- 小编起的名字是 all
- 然后 新建一个Editor文件夹
2.代码环节
官方代码如下:
using UnityEditor;
using System.IO;
public class CreateAssetBundles
{
[MenuItem("Assets/Build AssetBundles")]
static void BuildAllAssetBundles()
{
string assetBundleDirectory = "Assets/AssetBundles";
if(!Directory.Exists(assetBundleDirectory))
{
Directory.CreateDirectory(assetBundleDirectory);
}
BuildPipeline.BuildAssetBundles(assetBundleDirectory,
BuildAssetBundleOptions.None,
BuildTarget.StandaloneWindows);
}
}
官方代码是可以直接用的,下面我要说的是个人总结的一些功能,方便大家根据项目需求来进行打包。
- API说明:
BuildPipeline.BuildAssetBundles(assetBundleDirectory, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows);
参数分别为:地址,压缩方式和压缩指定的平台,不同的平台有不同的显示。
下面是其他几种加载方式:
- 第一种: 体积小,加载慢的方式
[MenuItem("Assets/Build AssetBundles(体积小,加载慢)")]
private static void BuildABsToWin64_LZMA()
{
//在Assets下设定一个文件价用于存储ab资源
string path = Application.dataPath + "/AssetBundles";
//path 路径 可以将需要打包的资源放到Resources文件夹中也很方便
if(!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
//打包ab资源
BuildPipeline.BuildAssetBundles(path, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
Debug.Log("AssetBundle资源打包完成");
}
- 第二种:体积大,加载快的方式
[MenuItem("Assets/Build AssetBundles不压缩(体积大,加载快)")]
private static void BuildABsToWin64_UnComper()
{
//在assets下设定一个文件价用于存储ab资源
string path = Application.dataPath + "/AssetBundles";
if(!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
//打包ab资源
BuildPipeline.BuildAssetBundles(path, BuildAssetBundleOptions.UncompressedAssetBundle, BuildTarget.StandaloneWindows64);
Debug.Log("AssetBundle资源打包完成");
}
- 第三种:体积中等,加载中等的方式
[MenuItem("Assets/Build AssetBundles(体积中,加载中)")]
private static void BuildABsToWin64_LZ4()
{
//在assets下设定一个文件价用于存储ab资源
string path = Application.dataPath + "/AssetBundles";
if(!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
//打包ab资源
BuildPipeline.BuildAssetBundles(path, BuildAssetBundleOptions.ChunkBasedCompression, BuildTarget.StandaloneWindows64);
Debug.Log("AssetBundle资源打包完成");
}
- 根据需求选择一种打包方式之后,编辑器Assets下面会出现BuildAssetBundles选项,根据你选择的一种打包方式来进行打包,进度条加载完毕后,如果没有出现AssetBundles文件夹,记得Refresh刷新一下就可以了,打包成功(ˉ▽ ̄~)
- 打包成功之后的效果如下:
3.加载资源环节
-
打包完之后,如果是要在Awake中加载,那么运行程序后,资源就会开始自动加载。根据个人需要,放在加载场景之前还是程序运行时都可以的。
-
说明一下,小编这里用的是WWW加载方式,根据个人习惯吧。
-
除此之外还有,使用LoadFormFile加载 / 异步加载、使用LoadFromMemoryAsync加载 、使用LoadFromCacheOrDownload加载、使用UnityWebRequest加载 等等~~搜索引擎上输入会给你答案,,非常详细,今天主要是整体功能的实现,小编个人实践觉得WWW加载就很不错。
-
附上代码:
private WWW Loadab;
private void Awake()
{
StartCoroutine("loadWWW");
}
IEnumerator loadWWW()
{
Loadab = new WWW(Application.dataPath + "/AssetBundles/all");
yield return Loadab;
GameObject go = Instantiate(Loadab.assetBundle.LoadAsset<GameObject>("名字")) ;
//设置生成物体的位置就可以看到了
go.transform.SetParent();
}
- 到这里就加载完毕了,给耐心看完的小伙伴点个赞(ˉ▽ ̄~)
三、总结
总的来说,无论是打包还是加载资源包,方法很多,找到适合自己的方法就可以,功能都能实现,如果项目有硬性需求,就需要合理选择方法。
欢迎留言转载,后期会更新加载依赖项,以及其他一些功能的完善~~谢谢~(ˉ▽ ̄~)