Unity Addressable 实现Build时自定义剔除资源组

核心原理

重写BuildScriptBase的ProcessGroup,让其在需要剔除的时候返回string.Empty或null即可

代码实现

先写一个Schema来给需要管理的Group上标记

csharp 复制代码
using UnityEditor.AddressableAssets.Settings;

public class BuildExclusionSchema : AddressableAssetGroupSchema
{
    public enum FilterType { 
        Normal,
        TestOnly,
        ReleaseOnly,
    }
    public FilterType filterType = FilterType.Normal;
    public bool ShouldExclude() { 
        if(filterType == FilterType.Normal)return false;
        if (filterType == FilterType.TestOnly) return !CommonData.isTest;
        if (filterType == FilterType.ReleaseOnly) return CommonData.isTest;
        return false;
    }
}

随便写的,具体自己的项目里想怎么改怎么改

然后是核心,自定义一个AA的BuildMode

这里直接继承默认的BuildScriptPackedMode

csharp 复制代码
using UnityEditor.AddressableAssets.Build.DataBuilders;
using UnityEditor.AddressableAssets.Settings;
using UnityEngine;
[CreateAssetMenu(fileName = "BuildScriptPackedFilterMode.asset", menuName = "Addressables/Custom Build/Filter Build Script")]
public class BuildScriptPackedFilterMode : BuildScriptPackedMode {
    public override string Name => "Filter Build Script";
    protected override string ProcessGroup(AddressableAssetGroup assetGroup, AddressableAssetsBuildContext aaContext) {
        var customFilter = assetGroup.GetSchema<BuildExclusionSchema>();
        if (customFilter != null && customFilter.ShouldExclude()) {
            Debug.Log($"[AA Filter Build] 剔除资源组: {assetGroup.name}");
            return null;
        }
        else { 
            return base.ProcessGroup(assetGroup, aaContext);
        }
    }
}

记得重写Name属性,在各种面板上显示时都要用的

准备工作

先给对应的Group添加对应的Schema

选择对应的模式

然后创建刚刚自定义的Build Script的asset资源并加进AA的Setting里

这样,就可以在AA的Build栏下看见我们自定义的BuildScript了

点击执行

注意事项

build会触发recompile所以控制台里的 clear on compile要是勾选了,对应的log就会被清掉导致看不见。

AA有很多个自带的Build Script,而且Build游戏和使用Update a Previous Build都会执行Build Script,如何确保它执行的是我们想要的Script呢?

首先,AA有一个active Index,保存了上次手动执行的Build Script的下标,在debug窗口就能看见
这是我执行了Filter Build,所以下标是3,也就是最后我加进去的那个

那么很简单了,要么你把自带的都移除出Builders,只剩一个就好了,要么别乱点其他的Build,完事

相关推荐
一种时光19 小时前
Unity 获取当前播放的动画,判断是否是某个动画
unity·游戏引擎
速冻鱼Kiel21 小时前
Lyra的相机系统
笔记·ue5·游戏引擎·虚幻
不绝1911 天前
Unity入门 :场景叠加/预制体资源包/脚本资源/生命周期函数/Inspector页面
unity·游戏引擎
在路上看风景1 天前
20. 资源和脚本的绑定关系
unity
yj爆裂鼓手1 天前
unity对象池
unity·c#
在路上看风景1 天前
3.7 SRP Batcher
unity
快乐觉主吖1 天前
Unity方便修改产品名和包名的小工具
unity·游戏引擎
孟无岐1 天前
【Laya】HttpRequest 网络请求
网络·typescript·游戏引擎·游戏程序·laya
JIes__2 天前
Unity(二)——MonoBehavior中的重要内容
unity·游戏引擎