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,完事

相关推荐
旧物有情16 小时前
游戏开发常用架构 #MVP,MVC
游戏·unity·架构·mvc
勇踏前人未索之境18 小时前
Unity打包运行于鸿蒙手机
unity·智能手机·harmonyos
玖玥拾19 小时前
Unity 3D 笔记(十一)UI 框架进阶:栈弹窗交互、BasePanel 基类虚方法、DoTween 界面动画
笔记·3d·unity
郝学胜-神的一滴21 小时前
中级OpenGL教程 023:Assimp模型加载全解——从源码到架构的骈文探秘
c++·unity·游戏引擎·cmake·unreal engine·opengl
xcLeigh2 天前
Unity基础:GameObject与Component——Unity核心架构思想彻底理解
unity·教程·component·gameobject
郝学胜-神的一滴2 天前
中级OpenGL教程 022:探秘三维世界的血脉传承——物体父子关系与矩阵递归奥义
c++·线性代数·unity·矩阵·游戏引擎·unreal engine·opengl
weixin_424294673 天前
Unity的测试Edit Mode和Play Mode,有什么区别?
unity
Python私教3 天前
我用 AI 做出了第一个 Godot 贪吃蛇
人工智能·游戏引擎·godot
玖玥拾3 天前
Unity 3D 笔记(八)ScrollRect 滚动视图、NavMesh 自动寻路系统
笔记·3d·unity