addressable扩展play和build mode

BuildScriptBase

BuildScriptBase是给Editor使用的,并不是打包后在目标平台上用的。

大体流程

先看看BuildScriptBase的大体流程图,这样后面讲代码还能知道怎么回事!

graph TB;
	A[BuildScriptBase]
	B(BuildDataImplementation)
	C(ClearCachedData)
	D[end]
	E[ProcessAllGroups]
	F[ProcessGroup]
	G[CanBuildData]
	A--build/play menu click-->G;
	G--yes-->B;
	G--no-->D;
    A--clear menu click-->C;
    C-->D;
	B--manual call-->E;
	E-->F;
	F-->D;

继承BuildScriptBase需要重写一下几个方法

Name

通过修正这个名称展示在settings

png

CanBuildData

该方法是判定是否是build的时候使用的,在addressable的时候,会传入AddressablesPlayerBuildResult给扩展类型

AddressablesPlayModeBuildResult代表的是play mode

一般是通过下面的这种方式来判定

// build
return typeof(T).IsAssignableFrom(typeof(AddressablesPlayerBuildResult));
// play
return typeof(T).IsAssignableFrom(typeof(AddressablesPlayModeBuildResult));

BuildDataImplementation

该方法是执行打包(启动该mode)的时候,具体执行的操作;

ProcessAllGroups

处理所有的Groups

ProcessGroup

处理指定的Groups

ClearCachedData

该方法是执行本地发布资源清理时调用的

IsDataBuilt

未知

Play Mode Script

addressable play模式使用的是BuildScriptBase作为基类的,最简单的构建大致如下

using UnityEditor.AddressableAssets.Build;
using UnityEngine;
using UnityEditor.AddressableAssets.Build.DataBuilders;

namespace WDFramework
{
	/// <summary>
	/// 自定义的editor模式下的play扩展模式
	/// </summary>
	[CreateAssetMenu(fileName = "AstralPackedPlayMode.asset", menuName = "Addressables/Content Builders/Use Astral Build (requires built groups)")]
	public class AstralPackedPlayMode : BuildScriptBase
	{
		/// <summary>
		/// 名称,这个必须要定义,否则会在settings里展示未定义
		/// </summary>
		public override string Name
		{
			get
			{
				return "Use Astral Build (requires built groups)";
			}
		}
		/// <summary>
		/// addressable通过判定T是不是AddressablesPlayModeBuildResult来分辨是play还是build
		/// </summary>
		/// <typeparam name="T">类型</typeparam>
		/// <returns>是不是build数据</returns>
		public override bool CanBuildData<T>()
		{
			// play必须是AddressablesPlayModeBuildResult
			return typeof(T).IsAssignableFrom(typeof(AddressablesPlayModeBuildResult));
		}
	}
}

如何应用

Build ScriptPlay Mode Script的使用方式是差不多的,首先我们需要在AddressableAssetsData/DataBuilders(你也可以放在其他assetDatabase能找到的地方,但建议还是放在这里)中创建它们的asset

png

创建完成后

png

然后在AddressableAssetSettings -> Build and Play Mode Scripts里添加新创建的asset即可

png

然后我们打开Addressable Group就能在Play Mode ScripBuild中看到我们定义的mode了

png png

Build Script

addressable build模式使用的是BuildScriptBase作为基类的,最简单的构建大致如下

using UnityEditor.AddressableAssets.Build;
using UnityEditor.AddressableAssets.Build.DataBuilders;
using UnityEngine;

namespace WDFramework
{
	/// <summary>
	/// 自定义的editor模式下build的扩展模式
	/// </summary>
	[CreateAssetMenu(fileName = "AstralPacked.asset", menuName = "Addressables/Content Builders/Astral Build Script")]
	public class AstralPackedMode : BuildScriptBase
	{
		/// <summary>
		/// 名称,这个必须要定义,否则会在settings里展示未定义
		/// </summary>
		public override string Name
		{
			get
			{
				return "Astral Build Script";
			}
		}
		/// <summary>
		/// addressable通过判定T是不是AddressablesPlayerBuildResult来分辨是play还是build
		/// </summary>
		/// <typeparam name="T">类型</typeparam>
		/// <returns>是不是build数据</returns>
		public override bool CanBuildData<T>()
		{
			return typeof(T).IsAssignableFrom(typeof(AddressablesPlayerBuildResult));
		}
	}
}

应用的方式已经在上文中说明,这里就不在多做说明了。