Addressable是Unity推出的打ab包方案,自动依赖;

不需要手动写AB打包方案,不需要关心依赖;

提供本地远程服务异步加载;

打包粒度可调节;

1.Group

Addressable打包需要先将资源放入Group中,按group来打包,每个group对应一个ScriptableObject配置可调节;

Group可以调节包体是本地加载还是远程服务器加载;

可调节压缩方式,是否缓存,请求超时时间等;

打包粒度:

同一Group可选择一起打包,完全分开打包和按标签打包;

同一标签会打成一个ab包,一个资源可选择多个标签;

这里设置Group中的打包粒度;

2.Build

直接将资源拖进对应的分组;

或在资源Inspector界面勾选addressable,资源会自动根据路径生成一个Name(用于加载);

打包资源点击Build-NewBuild-Default Build;

Update是再打过包的基础上,更新资源,热更新时候用到;

Profiles界面设置本地远程加载资源的路径

Addressable提供了本地服务器hosting界面,设置好端口点enable即可,或者使用其他服务器测试也可;

3.Load

3.1加载方式

根据Name加载

Addressables加载需要上面Group中资源的Name=>参数path;

LoadAssetAsync加载完成后返回handle,可以用于释放资源;

因为异步加载资源无法及时返回加载后的资源,可以使用委托加载完成后,接收或操作资源;

public static AsyncOperationHandle<GameObject> LoadPrefab(string path, Action<GameObject> onComplete, bool isInstantiate = true)
{
var handle = Addressables.LoadAssetAsync<GameObject>(path);
handle.Completed += (obj) =>
{
GameObject go = obj.Result; if (isInstantiate)
{
go = GameObject.Instantiate(go);
go.name = go.name.Substring(0, go.name.Length - 7);
}
onComplete(go);
};
return handle;
} //提供直接实例化函数
Addressables.InstantiateAsync("Assets/Prefabs/Cube.prefab").Completed += (obj) =>
{
// 已实例化的物体
GameObject cubeObj = obj.Result;
};

可以使用async,await方式加载资源,可以直接接收结果;C#async&await&Task

但是webgl可能无法调用,js不支持多线程;

private async void InstantiateCube()
{
GameObject prefabObj = await Addressables.LoadAssetAsync<GameObject>("Assets/Prefabs/Cube.prefab").Task;
GameObject cubeObj = Instantiate(prefabObj); // InstantiateAsync方法
// GameObject cubeObj = await Addressables.InstantiateAsync("Assets/Prefabs/Cube.prefab").Task;
}
根据AssetReference加载

在Inspector界面,将需要加载的文件拖动赋值给AssetReference;

public AssetReference spherePrefabRef;
void Start()
{
spherePrefabRef.LoadAssetAsync<GameObject>().Completed += (obj) =>
{
GameObject spherePrefab = obj.Result;
GameObject sphereObj = Instantiate(spherePrefab);
};
} //通过标签引用,可以批量加载同标签所有资源
AssetLabelReference label; Addressables.LoadAssetsAsync<Texture2D>(textureLabel, (t) =>
{
//每加载完一次会回调一次
Logger.Log(t.name);
});

3.2加载类型

上面Prefab加载已经写了;下面来加载图片,音频和场景;

//图片
Addressables.LoadAssetAsync<Texture2D>("Assets/Textures/a.jpg").Completed += (obj) =>
{
Texture2D tex2D = obj.Result;
img.texture = tex2D;
img.GetComponent<RectTransform>().sizeDelta = new Vector2(tex2D.width, tex2D.height);
}; //textrue2D转sprite
Texture2D tex;
Sprite sp = Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), Vector2.zero); //场景
var handle = Addressables.LoadSceneAsync("Assets/Scenes/GameScene.unity");
if (handle.Status == AsyncOperationStatus.Failed)
{
Debug.LogError("ERROR: " + handle.OperationException.ToString());
yield break;
}
//加载百分比
while (!handle.IsDone)
{
float percentage = handle.PercentComplete;
yield return null;
} //音频
Addressables.LoadAssetAsync<AudioClip>("Assets/Scenes/1.ogg");

3.3资源释放

加载的资源销毁组件后并不会销毁资源;(prefab不用如此释放)

直接释放资源,或者释放handle都可;

Addressables.Release(tex2D);
Addressables.Release(handle);

3.4PlayMode:

第一个不使用AB加载,开发时候用;

第二个模拟ab加载;

第三个会根据LoadPath去加载真实的AB包读取资源,必须先Build;

4.热更新

Addressables更新流程:

CheckForCatalogUpdates ->检测更新;

UpdateCatalogs -> 下载Catalogs文件;

GetDownloadSizeAsync ->获取更新资源大小;

DownloadDependenciesAsync->下载更新资源;

中途断网强退,使用AsyncOperationHandle的Status判断;

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.AddressableAssets.ResourceLocators;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.UI; public class CheckUpdateAndDownload : MonoBehaviour
{
public Text updateText; void Start()
{
StartCoroutine(UpdateAddressable());
} private IEnumerator UpdateAddressable()
{
AsyncOperationHandle<IResourceLocator> initHandle = Addressables.InitializeAsync();
yield return initHandle; // 检测更新
var checkHandle = Addressables.CheckForCatalogUpdates(true);
yield return checkHandle;
if (checkHandle.Status != AsyncOperationStatus.Succeeded)
{
Debug.LogError("CheckForCatalogUpdates Error\n" + checkHandle.OperationException.ToString());
yield break;
} if (checkHandle.Result.Count > 0)
{
var updateHandle = Addressables.UpdateCatalogs(checkHandle.Result, true);
yield return updateHandle; if (updateHandle.Status != AsyncOperationStatus.Succeeded)
{
Debug.LogError("UpdateCatalogs Error\n" + updateHandle.OperationException.ToString());
yield break;
} // 更新列表迭代器
List<IResourceLocator> locators = updateHandle.Result;
foreach (var locator in locators)
{
List<object> keys = new List<object>();
keys.AddRange(locator.Keys);
// 获取待下载的文件总大小
var sizeHandle = Addressables.GetDownloadSizeAsync(keys.GetEnumerator());
yield return sizeHandle;
if (sizeHandle.Status != AsyncOperationStatus.Succeeded)
{
Debug.LogError("GetDownloadSizeAsync Error\n" + sizeHandle.OperationException.ToString());
yield break;
} long totalDownloadSize = sizeHandle.Result;
updateText.text = updateText.text + "\ndownload size : " + totalDownloadSize;
Debug.Log("download size : " + totalDownloadSize);
if (totalDownloadSize > 0)
{
// 下载
var downloadHandle = Addressables.DownloadDependenciesAsync(keys, true);
while (!downloadHandle.IsDone)
{
if (downloadHandle.Status == AsyncOperationStatus.Failed)
{
Debug.LogError("DownloadDependenciesAsync Error\n" + downloadHandle.OperationException.ToString());
yield break;
}
// 下载进度
float percentage = downloadHandle.PercentComplete;
Debug.Log($"已下载: {percentage}");
updateText.text = updateText.text + $"\n已下载: {percentage}";
yield return null;
}
if (downloadHandle.Status == AsyncOperationStatus.Succeeded)
{
Debug.Log("下载完毕!");
updateText.text = updateText.text + "\n下载完毕";
}
}
}
}
else
{
updateText.text = updateText.text + "\n没有检测到更新";
}
}
}

Unity-Adressable打包热更的更多相关文章

  1. Unity 代码编译成dll 更新dll实现热更代码

    Unity 代码编译成dll 更新dll实现热更代码 实现流程 代码编译成DLL DLL打包成AssetBundle 加载AssetBundle 加载代码程序集 获取指定类 使用反射赋值 C#代码编译 ...

  2. Unity热更方案汇总

    http://www.manew.com/thread-114496-1-1.html   谈到目前的代码热更方案:没什么特别的要求   <ignore_js_op>    toLua(效 ...

  3. unity 热更方案对比

    现在一般使用的方案有:tulua&ulua.xlua.ILRuntime 对比: tulua&ulua 方案成熟,稳定第三方库支持 xlua 之前是为了热更修复线上bug的,腾讯发起的 ...

  4. 客户端热更新框架之UI热更框架设计(上)

    什么是热更新,为什么需要热更新?          热更新是目前各大手游等众多App常用的更新方式.简单来说就是在用户通过App Store下载App之后,打开App时遇到的即时更新.对于手游客户端来 ...

  5. Unity官方发布热更新方案性能对照

    孙广东  2016.3.11 Unity应用的iOS热更新 作者:丁治宇 Unity TechnologiesChina Agenda •  什么是热更新 •  为何要热更新 •  怎样在iOS 上对 ...

  6. Unity3D热更新之LuaFramework篇[08]--热更新原理及热更服务器搭建

    前言 前面铺垫了这么久,终于要开始写热更新了. Unity游戏热更新包含两个方面,一个是资源的更新,一个是脚本的更新. 资源更新是Unity本来就支持的,在各大平台也都能用.而脚本的热更新在iOS平台 ...

  7. 实现iOS图片等资源文件的热更新化(三):动态的资源文件夹

    简介 此文,将尝试动态从某个不确定的文件夹中加载资源文件.文章,会继续完善自定义的 imageNamed 函数,并为下一篇文章铺垫. 这么做的意义 正如我们经常所说的那样,大多数情景知道做事的意义往往 ...

  8. Unity资源打包学习笔记(一)、详解AssetBundle的流程

    转载请标明出处:http://www.cnblogs.com/zblade/ 本文参照unity官网上对于assetBundle的一系列讲解,主要针对assetbundle的知识点做一个梳理笔记,也为 ...

  9. Unity实现c#热更新方案探究(三)

    转载请标明出处:http://www.cnblogs.com/zblade/ 前面两篇文章从头到尾讲解了C#热更新的一些方案,从程序域来加载和卸载DLL,到使用ILRuntime来实现安卓和IOS平台 ...

随机推荐

  1. 学习openldap03

    ldap统一认证架构 一.ldap目录服务介绍什么是目录服务?  目录是一类为了浏览和搜索数据而设计的特殊的数据库.例如,为人所熟知的微软公司的活动目录(active directory)就是目录数据 ...

  2. 学习 Haproxy (一)

    haproxy是一个开源的.高性能的基于tcp和http应用代理的HA的.LB服务软件,它支持双机热备.HA.LB.虚拟主机.图形界面查看状态信息等功能,其配置简单.维护方便,而且后端RS的healt ...

  3. Netty学习摘记 —— 初步认识Netty核心组件

    本文参考 我在博客内关于"Netty学习摘记"的系列文章主要是对<Netty in action>一书的学习摘记,文章中的代码也大多来自此书的github仓库,加上了一 ...

  4. Leetcode刷题之螺旋矩阵

    矩阵之螺旋矩阵 总体思路: 注意遍历顺序 每次遍历一圈时候不要多加元素 Leetcode54螺旋矩阵 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素. ...

  5. Apollo代码学习(七)—MPC与LQR比较

    前言 Apollo中用到了PID.MPC和LQR三种控制器,其中,MPC和LQR控制器在状态方程的形式.状态变量的形式.目标函数的形式等有诸多相似之处,因此结合自己目前了解到的信息,将两者进行一定的比 ...

  6. 一个命令完成[打包+同步七牛cdn+上传服务器]

    webpack+gulp+qshell+npm-scripts实现一个命令完成[打包+同步cdn+上传服务器] 说明 由于我们用的七牛云存储,所以cdn也是走的七牛,所以并不适用于其他的cdn,但是思 ...

  7. 王下邀月熊_Chevalier的前端每周清单系列文章索引

    感谢 王下邀月熊_Chevalier 分享的前端每周清单,为方便大家阅读,特整理一份索引. 王下邀月熊大大也于 2018 年 3 月 31 日整理了自己的前端每周清单系列,并以年/月为单位进行分类,具 ...

  8. 讲清楚之 javascript 参数传值

    讲清楚之 javascript 参数传值 参数传值是指函数调用时,给函数传递配置或运行参数的行为,包括通过call.apply 进行传值. 在实际开发中,我们总结javascript参数传值分为基本数 ...

  9. java静态方法和实例方法的区别

    静态方法(方法前冠以static)和实例方法(前面未冠以static)的区别  调用静态方法或说类方法时,可以使用类名做前缀,也可以使用某一个具体的对象名:通常使用类名.static方法只能处理sta ...

  10. EMS邮箱数据库常用命令(二)

    1.查询邮箱数据库的使用空间 查询Exchange环境中所有邮箱数据库. 键入以下命令 Get-MailboxDatabase -Status | FL name,DatabaseSize 命令执行后 ...