Addressable入门篇
配置Addressable
- 在unity2018.2及以上可以在Window->package Manager->中搜索Addressable并安装
- 安装完成后,所有的资源都会有一个可勾选的Addressable
当勾上后就会被Addressable系统管理
- 在Window->asset mangment->addressable->Groups查看和管理资源
AddressableName资源:
默认AddressableName就是资源在Assets下的路径==Path,可以直接F2重命名,这里简称key
Addressale加载资源就是通过这个key
key可以重复,加载单个时,如果key重复,那么加载的就是是第一个,读取多个时,可以加载所有相同可以的资源
labels标签:
每个资源可以设置多个标签,读取资源时,除了通过name读取还可以通过label读取label也可以当key用,可以加载单个和多个,加载顺序和key一样,多个label时加载单个为第一个
- 打资源包(单机本地)
Content Packing&Loading
选择BuildPath->LocalBuildPath:运行地址,LoadPath->LocalLoadPath:读取运行包地址
打包:build->new build->Default build script
打apk包后,加载的资源就是这里
热更(本地模拟):
打开 Window => Asset ManageMent => Addressables => Hosting点Create->Local Hosting Port 填个端口,然后将Enable打勾✔
将RemoteLoadPath改成http://[PrivateIpAddress]:[HostingServicePort]
当资源更新后:
Window => Asset ManageMent => Addressables => Groups 点Tools->Check for Content Update Restrictions
弹出文件框,要求之前的bin文件,有android和window
选择后点Apply Changes 然后点Group窗口的Build->Update a Previous Build
==================================我是分割线===================================
加载API:
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
AsyncOperationHandle:句柄(异步加载时的控制器,里面记录了加载的所有信息,包括状态、进度等)
当包中有多个相同的key或者label时,返回的是第一个
//根据key加载一个资源(这个key可以是AddressableName也可以是label标签)
Addressables.LoadAssetAsync("key");
//根据key实例化一个资源(这个key可以是AddressableName也可以是label标签)
Addressables.InstantiateAsync("key");
//根据key返回多个资源(这个key可以是AddressableName也可以是label标签)
Addressables.LoadAssetsAsync(“key”);
//根据key加载场景(这个key可以是AddressableName也可以是label标签)
Addressables.LoadSceneAsync(“key”)
卸载API:
Addressables.Release()参数是句柄,加载场景也是用的这个句柄
Addressables.ReleaseInstance()参数是通过Addressables.InstantiateAsync返回的实例化对象
该方法会销毁该物体
一些简单的工具方法:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.ResourceManagement.ResourceProviders;
using UnityEngine.SceneManagement;
public class AddressableUtil
{
/// <summary>
/// Addressable加载资源
/// </summary>
/// <typeparam name="T">资源类型</typeparam>
/// <param name="key"></param>
/// <param name="run"></param>
public void LoadObjRun<T>(string key, LoadObj<T> run = null)
{
Addressables.LoadAssetAsync<T>(key).Completed += (obj) =>
{
run?.Invoke(obj.Result);
Addressables.Release(obj);
};
}
/// <summary>
/// 返回操作句柄,自己控制(PercentComplete:完成百分比)
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public AsyncOperationHandle LoadSceneRun(string key)
{
return Addressables.LoadSceneAsync(key);
}
/// <summary>
/// Addressable加载场景
/// </summary>
/// <param name="key"></param>
/// <param name="run"></param>
public void LoadSceneRun(string key, LoadObj<Scene> run = null)
{
Addressables.LoadSceneAsync(key).Completed += (obj) =>
{
run?.Invoke(obj.Result.Scene);
Addressables.Release(obj);
};
}
public delegate void LoadObj<T>(T obj);
}
public static class KUOZ
{
/// <summary>
/// 销毁释放Addressable实例化的游戏对象
/// </summary>
/// <param name="obj"></param>
public static void ReleaseInstance(this GameObject obj)
{
Addressables.ReleaseInstance(obj);
}
}