自定义AssetDatabaseMode的扩展

CustomAssetDatabasePlayMode创建

playMode是在Editor下使用的,用于指定加载的模式的,所以我们需要在Editor下创建就可以了

/// <summary>
/// 自定义assetdatabase模式
/// </summary>
[CreateAssetMenu(fileName = "CustomDatabasePlayMode.asset",
	menuName = "Addressables/Content Builders/Use custom database")]
public class CustomAssetDatabasePlayMode : BuildScriptBase
{
}

CustomAssetDatabasePlayMode 设置

BuildScriptBase有几个很重要的属性和方法需要覆盖重写的,下面简单说几个

  • Name

这个是必须要重写的,只有重写了名称才能在菜单中更好定位

public override string Name => "Use custom database";
  • CanBuildData

因为需要的是在play中使用,并不是打包资源使用的,所以按照以下指定

public override bool CanBuildData<T>()
{
	return typeof(T).IsAssignableFrom(typeof(AddressablesPlayModeBuildResult));
}
  • BuildDataImplementation

在这个mode启动的时候,addressable会执行此方法,

protected override TResult BuildDataImplementation<TResult>(AddressablesDataBuilderInput builderInput)
{
    return default;
}

其他的请参考 link

addressable在Editor的启动流程

graph TB;
    A[Play Unity]
    B[BuildScriptBase]
    C[BuildScriptBase buidData]
    C1[create setting.json]
    C2[create catalog.json]
    D[AddressableImp]
    E[load Setting.json]
    F[parse setting.json]
    G[load catalog.json]
    H[End]
    A-->B
    B-->C
    C-->D
    D-->E
    E-->F
    F-->G
    G-->H
    C-->C1
    C-->C2

通过上述的流程图我们知道,Addressable在运行时是需要要两个文件setting.jsoncatalog.json的,这两个文件大致说明如下:

setting.json

addressable第一时间解释的文件,记录以下内容

  • catalog.json路径;
  • catalog的解释器,provider一般是ContentCatalogProvider

setting.json 的读取是 优先从PlayerPrefsAddressables.kAddressablesRuntimeDataPath中读取,其次就是从RuntimePath + "/settings.json"

加载setting.json后,将其解释为ResourceManagerRuntimeData类型;

更加详细的内容可以去查阅AddressableResourceManagerRuntimeData

读取完成后就开始加载catalog.json

catalog.json

其内容和以前assetbundlemanifest.xml意义差不多,记录一下内容

  • 加载使用的key
  • 内容解释器,所有的provider
  • 资源依赖

加载catalog.json后,将其解释为ContentCatalogData类型; 更加详细的内容可以去查阅AddressableContentCatalogData

CustomAssetDatabasePlayMode的详细扩展

通过上面的普及,对于BuildScriptBase需要构建的几个文件都清楚了,那么下面就开始构建这两个文件;

setting.json 的创建

由于setting.jsonResourceManagerRuntimeData类型,所以在BuildDataImplementation方法里添加一下方法

protected override TResult BuildDataImplementation<TResult>(AddressablesDataBuilderInput builderInput)
{
    var settingJson = new ResourceManagerRuntimeData();
}

创建完成settingJosn对象后,需要对其进行一些简单的设置

  • 平台设定
settingJson.BuildTarget = builderInput.Target.ToString();
  • Profile
// 因为是editor,直接开启
settingJson.ProfileEvents = true;
  • Catalog.json位置
var PathFormat = "{0}/Library/com.unity.addressables/{1}.json";
var catalogPath = string.Format(PathFormat, "file://{UnityEngine.Application.dataPath}/../", "catalog");
settingJson.CatalogLocations.Add(new ResourceLocationData(new []{ResourceManagerRuntimeData.kCatalogAddress}, catalogPath, typeof(ContentCatalogProvider), typeof(ContentCatalogData)));
  • 保存Setting.json
var settingsPath = string.Format(PathFormat, Path.Combine(Application.dataPath, "/../"), "setting");
WriteFile(settingsPath, JsonUtility.ToJson(settingJson), builderInput.Registry);

然后我们启动unity后,会发现在Library/com.unity.addressables下多了一个setting.json的文件

上文已经提到过Setting.json是优先从PlayerPrefs中找它的路径的,所以我们在Editor下需要简单设置一下,使得在editor下也能直接读取我们指定的文件

var runtimeSettingsPath = string.Format(PathFormat, "file://{UnityEngine.Application.dataPath}/../", "settings");
PlayerPrefs.SetString(Addressables.kAddressablesRuntimeDataPath, runtimeSettingsPath);

上文经常使用到的file://{UnityEngine.Application.dataPath}是addressable内用的相对路径

catalog.json 的创建

由于catalog.jsonContentCatalogData类型,所以在BuildDataImplementation方法里添加一下方法

List<ContentCatalogDataEntry> locations = new List<ContentCatalogDataEntry>();
var catalog = new ContentCatalogData(locations, ResourceManagerRuntimeData.kCatalogAddress);
  • locations

locations里存放的是所有的需要addressable进行key引导(需要加载的)资源,其里面的元素类型是ContentCatalogDataEntry,ContentCatalogDataEntry后面会讲到;

  • ResourceManagerRuntimeData.kCatalogAddress

unity默认给的名称,这里需要注意和setting.json里的对应

  • 保存
var catalogPath = string.Format(PathFormat, Path.Combine(Application.dataPath, "../"),"catalog");
WriteFile(catalogPath, JsonUtility.ToJson(catalog), builderInput.Registry);

setting.json;

进行到这一步的时候,运行unity已经能在Library/com.unity.addressables下看到catalog.json文件了,那么现在我们需要往locations里填充需要导出的资源数据了;因为资源的数据都存放在AddressableGroup下,所以我们要开始说说Group要怎么处理了

Group的处理

添加时间监听