之前大家使用热更的时候都使用的是unity3d自带的assetbundle(AB)包,但是说实话对于使用来说还是存在着非常大的问题的
- 打包需要通过写代码
- 依赖关系,比较麻烦
现在有一个特别好的东西可以解决unity之前AB包的一个问题,那就是我们今天介绍的Addressables
此博文主要是对AA的已解介绍,如果需要热更方案的,可以移步到[Unity 热更方案] 使用Addressable进行打包管理, 使用AssetBundle进行包的加载管理.进行沟通
资源引入
此处我们引入两个资源,第一个Addressables
另一个为Asset Bundle Browser
Addressables
在Unity Registry
的里面找到Addressables
下载并引入
Asset Bundle Browser
此工具为辅助使用,属于可选项,不一定非要安装,按照下方官方说明进行引入.
设置说明
路径说明
打开AddressAbleds Profiles
页面,其中存在三个元素,Profile
,Variable
,Build and Load Variables
.
一般情况我们没必要创建Profile
使用默认的即可
对于Variable
来说也没什么必要,我们比较关注的是Build and Load Variables
,因为它决定了打包和加载的路径.
下图为一个打开window的方法.
设置运行模式或者说加载方式
下图为运行模式设置页面
第一个为直接使用资源,没有外部加载的过程
第二个是模拟外部加载,但是实际上还是走的内部资源
第三个为外部加载,此处有个比较严重的问题,如果你打包的平台和本平台不统一,可能会导致shader失效导致的模型变红的问题.
打包我们标记好的资源
加载这个资源
using UnityEngine;
using UnityEngine.AddressableAssets;
public class samplesuse : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
LoadAE();
}
public void LoadAE()
{
Addressables.LoadAssetAsync<GameObject>("Assets/Cube.prefab").Completed += LoadCubeCompleted;
}
private void LoadCubeCompleted(UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle<GameObject> obj)
{
Addressables.InstantiateAsync("Assets/Cube.prefab");
Instantiate(obj.Result);
}
}
四个样本(我自己写的内容居然忘记是干什么的了)
Addressables Utility
加载引用资源
Disable AssetImport on Build
build不允许使用引入资源
Import Groups Tool
引入资源
Prefab Spawner
预制体孵化器,可以直接孵化addressable的预制体,并且可以调整生成时间,存活时间,等参数.
热更例子
是否可以跨项目加载
可以加载gameobject,但是脚本无法加载
代码
using UnityEngine;
using UnityEngine.AddressableAssets;
public class loadotherae : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
string url = @"E:\WorkStations\Unity\addressenble\Library\com.unity.addressables\aa\Windows\catalog.json";
Addressables.LoadContentCatalogAsync(url).Completed += (arg) =>
{
Addressables.LoadAssetAsync<GameObject>("Assets/Cube.prefab").Completed += LoadCubeCompleted;
};
}
private void LoadCubeCompleted(UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle<GameObject> obj)
{
Addressables.InstantiateAsync("Assets/Cube.prefab");
Instantiate(obj.Result);
}
}
https://docs.unity.cn/Packages/com.unity.addressables@1.18/manual/MultiProject.html