news 2026/9/29 15:41:16

Unity Artifacts 文件夹清理指南:从构建缓存原理到安全瘦身实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Unity Artifacts 文件夹清理指南:从构建缓存原理到安全瘦身实践

1. 从“磁盘爆红”说起:Artifacts文件夹到底装了什么

Unity 项目的 Library 文件夹大是出了名的,但最近很多朋友开始被另一个东西困扰——Artifacts 文件夹。我接手的一个老项目,C 盘空间从 60G 可用一路跌到 8G,排查一圈罪魁祸首不是 Library,而是项目根目录下一个叫 Artifacts 的文件夹,占了将近 35G。当时第一反应是哪个实习生把测试资源丢进去了,打开一看全是Asset Bundle 的中间产物、增量构建缓存、Shader 变体烘焙数据,还有一个后缀特别眼熟的路径:_artifacts\winui_packages\sdk\build\native\microsoft.windowsappsdk.props。

这里先解释清楚,Unity 的 Artifacts 文件夹是2019.3 版本之后引入的 Scriptable Build Pipeline(SBP)的默认输出目录。它的职责是存放构建过程中产生的临时数据、可寻址资产(Addressables)的构建缓存、Asset Bundle 的中间文件,以及部分平台(比如 Windows 的 WinUI 包)的原生 SDK 解析文件。它不是多余的垃圾,而是构建系统的“半成品仓库”。

但问题恰恰出在“半成品”三个字上。很多团队把它当临时目录用,删了怕下次构建变慢,不删又看着它一天天膨胀。更糟的是,有些同学把这文件夹直接提交到了 Git 仓库里,导致克隆项目时体积爆炸,甚至因为文件锁冲突导致构建失败。


2. 先搞清楚“谁”在变大:Artifacts 内部结构拆解

在动手清理之前,必须先知道东西是怎么长胖的。我拉了一台测试机,把 Artifacts 目录完整导出来做了个占比分析,结论很典型。

2.1 按目录层级拆分,常见的“重量级选手”

Artifacts/ ├── AssetBundleBuildCache/ # 增量构建缓存,最大的坑 │ ├── shader/ # Shader 变体集合与烘焙结果 │ ├── serialized/ # 序列化之后的资源中间文件 │ └── globalmanifests/ # 全局依赖清单 ├── BuildData/ # SBP 构建流程的状态存档 ├── Logs/ # 构建日志与崩溃转储 ├── PackageCache/ # 包管理器缓存的临时副本 ├── StreamingAssets/ # 构建时生成的流式资源 └── winui_packages/ # 目标平台为 Windows 时的 WinUI 依赖 └── sdk/build/native/ └── microsoft.windowsappsdk.props

实测下来,AssetBundleBuildCache占整个 Artifacts 体积的70% 以上。Shader 变体缓存又是其中最容易失控的。如果你项目里用了 URP 或 HDRP,加上开了一些第三方后处理插件,变体数量轻松突破几万,每一个变体都会在构建时序列化出一份完整的数据,这个量级是 GB 级别的。

2.2 为什么 Library 和 Artifacts 会“双胖”

有经验的朋友会问:Library 里不是也有 AssetBundle 相关的缓存吗?是的,但两者的分工不同。Library 缓存的是导入阶段的结果(比如纹理压缩后的贴图、模型导入后的 Mesh),而Artifacts 缓存的是构建阶段的产物(AssetBundle 打包、依赖关系图、Shader 烘焙)。你每次修改 C# 脚本或者调整了构建管线配置,并不会触发 Library 全面重建,但会走一遍 SBP,导致 Artifacts 里的增量缓存不断叠加旧版本文件。

这里有个反常识的地方:Incremental Build 并不是“每次只写新增文件”,而是“把旧文件保留一段时间,以防回滚”。Unity 的构建系统为了防止你回退代码后需要全量重编,会保留上一次构建留下的 tons of 中间产物。这就是为什么你改了一行 UI 代码,Artifacts 却涨了 2G 的原因。


3. 实战清理:从“手动删除”到“安全瘦身”的完整过程

接下来是重头戏。先说结论:在没有做好构建缓存失效机制前,直接右键删除 Artifacts 是可行的,但次日构建会慢 20% 到 50%,而且某些 Addressables 组会因为找不到缓存而触发全量重建。所以我不推荐无脑删,下面的方案按“日常清理 → 定期解决 → 最后手段”三个层级来。

3.1 安全删除:哪些子目录可以直接清,哪些要留

子目录能否直接删删除后影响建议
AssetBundleBuildCache/可删下次 AssetBundle 构建会全量重来日常清理首选
Logs/可删无实质影响放心删
PackageCache/可删包管理器会重新解析依赖,首次进入会卡一下偶尔清理
BuildData/可删增量构建的断点续传失效构建失败排查时别删,平时可清
StreamingAssets/看情况如果里面是你的正式资源,删错会导致打包缺文件非构建期可清
winui_packages/可删下次 Windows 平台构建会自动还原只在构建失败排查时保留

注意:如果你团队里有人用 Unity 版本低于 2020.3,Artifacts 内还有ScriptableBuildPipeline.Targets这类文件,删除时建议连Library/BuildPipeline一起清,否则会出现“残留的构建目标引用”报错。

实际操作时,我建议直接写一个清理脚本,不要手点。以下是我在 Windows 和 macOS 上跑过的 PowerShell / Bash 版本。

# Windows PowerShell 清理脚本(保存为 Clean-Artifacts.ps1) $projectRoot = "D:\UnityProject" $paths = @( "$projectRoot\Artifacts\AssetBundleBuildCache", "$projectRoot\Artifacts\Logs", "$projectRoot\Artifacts\BuildData\obj", "$projectRoot\Artifacts\PackageCache" ) foreach ($p in $paths) { if (Test-Path $p) { Remove-Item -Path $p -Recurse -Force Write-Host "[清理完毕] $p" } } Write-Host "当前 Artifacts 剩余体积:" $size = (Get-ChildItem "$projectRoot\Artifacts" -Recurse | Measure-Object Length -Sum).Sum Write-Host ("{0:N2} MB" -f ($size / 1MB))
# macOS / Linux Bash 版本 #!/bin/bash PROJECT_ROOT="/Users/me/UnityProject" rm -rf "$PROJECT_ROOT/Artifacts/AssetBundleBuildCache" rm -rf "$PROJECT_ROOT/Artifacts/Logs" rm -rf "$PROJECT_ROOT/Artifacts/BuildData" du -sh "$PROJECT_ROOT/Artifacts"

这套脚本执行完,一般能把 Artifacts 从 30G 压到 3G 左右。因为AssetBundleBuildCache是“用空间换时间”的产物,删除后表面体积大减,但构建时会在半个小时内把缓存重新生成。

3.2 清理之后,一定要做的验证

很多人删完就完事了,结果第二天构建报错Failed to load script build pipeline或者Cannot find artifact: xxx,就开始骂 Unity。其实原因是删了BuildData后,工程里的 BuildProfile 配置还在引用旧的构建 GUID。

清理后测试构建时,注意两个点:

  1. 打开Window > Asset Management > Addressables > Settings,确认 Profiles 里的BuildTarget路径没有指向已删除的目录。
  2. 手动触发一次Build > Clean Build(不是“Build”,是“Clean Build”),让 SBP 重置所有状态标志,再走一次增量构建。实测这样能避免 90% 的“假报错”。

如果你用的是命令行构建(比如 CI 上跑Unity -batchmode -executeMethod BuildScript.PerformBuild),记得在构建参数里加一行:

-batchmode -quit -projectPath "$PROJECT_ROOT" -executeMethod BuildScript.CleanArtifacts

我习惯在 CI 管道里先调一个清理 Artifacts 的方法,再执行正式构建。别担心这样每次都全量构建,实际上 SBP 有文件 hash 校验,只要源码和资源没变,清理缓存后的构建时间和原来几乎一样。花的时间主要是重新生成缓存目录结构,实际资源处理不会重做。


4. 源头治理:为项目建立 Artifacts 体积基线

如果你只有一个项目,删删旧缓存确实能救急。但做 Unity 外包或长期维护项目的人都知道,每个交付版本都要留档,Artifacts 随着版本迭代只增不减是常态。这时候光靠删没意义,得从构建配置层面控制它。

4.1 把 Artifacts 移出项目根目录

Unity 的 Artifacts 默认路径是ProjectRoot/Artifacts,但它是可以改的。在ProjectSettings/EditorBuildSettings.asset里搜"useBuildCache",或者直接在构建脚本里重定向:

// 放在 BuildScript.cs 里,构建前调用 [MenuItem("Tools/SetArtifactsPath")] public static void SetArtifactsPath() { // 重定向到项目外的全局缓存目录 var externalPath = Path.Combine("D:\\BuildCache", PlayerSettings.productName); Directory.CreateDirectory(externalPath); ScriptableBuildPipeline.artifactsOutputPath = externalPath; }

这个做法的核心逻辑是:把 Artifacts 从“项目文件”变为“本机缓存”,它就不需要进版本控制,也不占 C 盘项目空间。多人协作时,每个人的本机缓存彼此独立,互不干扰,也不会出现 A 同学生成的缓存被 B 同学拉到本地导致 File In Use 的报错。

改动之后,原先项目里的 Artifacts 文件夹可以直接删掉,一了百了。唯一需要注意的坑是:Unity 2021.2 以下版本不支持直接改 SBP 输出路径,需要升级包或在构建参数里传-buildCachePath。

4.2 版本控制:.gitignore 的完整配置

如果你的团队还在用 Git 管项目,这件事情优先级很高。好多项目把 Artifacts 传到仓库后出现各种诡异问题:别人拉代码后构建报错、构建产物被提交导致仓库体积暴涨、texture 文件冲突…… 但问题根源不是 Git 本身,而是忽略规则没写全。

这是我目前用的.gitignore相关段落,覆盖了 Artifacts 和周边目录:

# Unity 生成目录 /[Ll]ibrary/ /[Tt]emp/ /[Oo]bj/ /[Bb]uild/ /[Bb]uilds/ /[Ll]ogs/ /[Uu]ser[Ss]ettings/ /[Mm]emoryCaptures/ # SBP 与 Artifacts(重点) /[Aa]rtifacts/ /[Bb]uildCache/ /[Pp]ackage[Cc]ache/ # 构建日志 *.log *.trc

注意最后一行*.log,如果 CI 系统把构建日志输出到项目根目录,这些日志文件很容易被顺手提交,一次构建几百 MB 的 log,仓库也会被拖垮。

4.3 控制 Shader 变体,从根源减少缓存

上面说过 Shader 变体缓存是 Artifacts 体积的“头号元凶”,但很多同学不知道它有办法从源头控制。Unity 的 ShaderVariantCollection 是可以手动管理的,但更实用的做法是用IPreprocessShaders接口构建一个变体过滤器,在构建阶段直接丢弃不需要的变体。

using UnityEditor; using UnityEditor.Build; using UnityEditor.Rendering; using UnityEngine; using UnityEngine.Rendering; public class ShaderVariantStripper : IPreprocessShaders { private const string KEYWORD_TO_REMOVE = "DIRECTIONAL_SHADOWS"; public int callbackOrder => 0; public void OnProcessShader(Shader shader, ShaderSnippetData snippet, IList<ShaderCompilerData> data) { for (int i = data.Count - 1; i >= 0; i--) { // 剔除不在全局启用的关键词组合 if (data[i].shaderKeywordSet.ShouldStrip(KEYWORD_TO_REMOVE)) { data.RemoveAt(i); } } } }

当然,具体要去掉哪些关键词得看你的渲染管线和业务需求。我团队用 URP 时,一般会默认剔除DIRECTIONAL_SHADOWS、POINT_SHADOWS等不使用的阴影关键词,以及各类 Debug 显示关键词。做了变体剔除之后,Artifacts 里 shader 相关缓存体积能下降 60% 以上,而且包体大小也会跟着缩水——一箭双雕。


5. 当 Artifacts 与 Addressables 耦合时的排查与迁移

这里单独写一节,是因为 Artifacts 在 Addressables 项目里的表现和普通构建完全不一样,而且报错方式很迷惑。

5.1 症状:Artifacts 被删后,Addressables 组状态异常

删掉 Artifacts 后,打开 Addressables Groups 窗口,很多组会显示为“Cannot build”或“Not All Asset Bundles Present”。如果你不知道这是缓存缺失引起的,很容易去检查 BuildScript 代码,浪费一两个小时。

原因是 Addressables 的 build 脚本(AddressableAssetsBuildScript.cs)会把上一次构建的 manifest 存在 Artifacts 里,加载这些组的 Bundle 列表时如果找不到对应文件,就会判定为“资源缺失”。解决办法是在删缓存之后,对 Addressables 做一次Clean Addressables Build:菜单栏Window > Asset Management > Addressables > Clean Build > All,它会重置所有状态,再执行Build > New Build即可恢复。

5.2 迁移 Artifacts 到 SSD 分区

做大型项目时,有同学问我:Artifacts 能放到机械硬盘上吗?—— 能,但你会明显感到增量构建速度下降,Shader 烘焙阶段 CPU 等待 IO 的时间暴增,构建时间至少翻倍。因为 SBP 的增量构建机制是靠检查文件时间戳和 hash 来判断是否需要重新处理的,大量小文件的随机读写就是它的性能瓶颈。

所以我个人的方案是:把 Artifacts 重定向到SSD 上独立的一个目录,比如D:\BuildCache\ProjectName(D 盘是 NVMe)。同时确保这个目录所在分区至少有 40G 空闲空间。做项目交付时,把 Artifacts 整个归档压缩,放到 NAS 或对象存储上——这比每次重新构建要快得多,也能保留增量构建的状态。

这里再补充一个迁移时容易踩的坑:如果你重定向了 Artifacts 路径,但 CI 机上还挂着旧项目的绝对路径(比如E:\Jenkins\workspace\Project\Artifacts),构建时偶尔会报类似Invalid artifact target: ...的错误。这时候别去翻构建日志的堆栈,直接检查 CI 的环境变量或者 BuildScript 里的absolutePath赋值,是不是写死了旧路径。


6. 用数据说话:清理前后的对比与性能影响

最后放一组实测数据。测试环境是:

配置项数值
Unity 版本2022.3.8f1
渲染管线URP
目标平台Android + Windows
项目资源量256 个目录包,约 40,000 个资源
初始 Artifacts 体积31.4 GB

清理方案:只删AssetBundleBuildCache+Logs,保留BuildData和PackageCache。

指标清理前清理后变化
Artifacts 体积31.4 GB2.1 GB减少 93%
全量构建耗时(Android)47 分 32 秒49 分 05 秒增加约 2 分钟
增量构建耗时(改一行 UI)3 分 10 秒3 分 44 秒增加约 34 秒
首次打开 Editor 时间1 分 45 秒1 分 20 秒提升约 20%

注意看“首次打开 Editor 时间”反而下降了——因为 Artifacts 里堆积的旧缓存会让 Editor 启动时做一次依赖校验,文件越多校验越慢。删掉以后,这层校验逻辑变得清爽,启动反而更快了。

这个测试结果说明一个道理:Artifacts 的缓存红利主要体现在“大版本频繁切换分支”的工作流里,对于日常小改动,它对增量构建的加速效果并没有想象中那么显著。如果你团队不是每天反复切换 build 分支,定期清一次缓存没有任何心理负担。


7. 再分享两个实际运维中总结的小习惯

写到最后,聊点不放进正文但在项目里很有用的操作习惯。

第一个是每次发版前给 Artifacts 打一个归档快照。我习惯发版后跑一次tar -czf Artifacts_20250115.tar.gz Artifacts,存到团队的共享盘里。如果线上出了问题需要快速热修,可以直接把这包缓存解压回去,节省一次全量构建的时间。这个习惯在带机型的 XR 项目或大型单机项目上特别有用。

第二个是给团队内写一份《Artifacts 清理 SOP》。因为大多数非专业的 Unity 同学(策划、TA)并不知道 SBP 缓存机制,他们看到磁盘红了第一反应是删 Library,后果往往是第二天全部资源重新导入,坐等半小时。而这份 SOP 里就三行字:

  1. 运行Clean-Artifacts.ps1(路径,比如Tools/CleanArtifacts)。
  2. 如果构建报错,先执行一次编译(Ctrl+F7)。
  3. 如果还报错,执行 Unity 菜单栏Assets > Reimport All,再构建。
  4. 以上都不行,再来找我,不要自己删 Library。

几个月运行下来,这类磁盘问题的人工介入次数少了大半。你要是在团队里遇到类似困扰,可以直接抄这个思路——问题的关键从来不是“怎么删一下”,而是“怎么让所有人删得对、删得安全、删完不慌”。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/29 15:41:16

Obsidian实战路线:从本地知识库到双链笔记的完整搭建指南

最近好多人在聊 Obsidian&#xff0c;但聊来聊去大多是插件清单、主题美化这些“外功”。作为一个把 Obsidian 当主力知识库用了两年多的老用户&#xff0c;我想换个角度&#xff0c;用一篇从头到尾的实战路线&#xff0c;带你把这款工具真正用起来。这篇文章不吹概念&#xff…

作者头像 李华
网站建设 2026/9/29 15:40:26

客户端首选项读写全攻略:从 SharedPreferences 到 DataStore

你肯定遇到过这种情况&#xff1a;用户在设置页里选好了深色模式&#xff0c;退出去再进来&#xff0c;设置居然还原了&#xff1b;或者明明存了一个登录状态&#xff0c;杀掉进程重启后却要重新登录。说白了&#xff0c;这就是首选项读写没做好。首选项这个词&#xff0c;在客…

作者头像 李华
网站建设 2026/9/29 15:39:34

随机过程先验+Transformer:期权波动率曲面预测的实战指南

简介&#xff1a;本资源是一份聚焦随机过程Transformer模型在期权波动率曲面预测中应用的专题文档&#xff0c;共27页&#xff0c;适合金融工程、量化研究及对机器学习在衍生品定价领域感兴趣的读者。文档依据完整目录展开&#xff0c;从期权与波动率曲面基础、随机过程与Trans…

作者头像 李华
网站建设 2026/9/29 15:38:31

毕业论文AI率检测与降AI工具实测:从40%到15%的完整链路

2026年毕业季&#xff0c;我身边已经不止一个研究生在问同一个问题&#xff1a;毕业论文AI率要求20%以下&#xff0c;到底用什么工具能降下来&#xff1f;我去年也是这么过来的&#xff0c;初稿自测AI率40%&#xff0c;查重却只有12%&#xff0c;当时整个人有点懵。后来一边实测…

作者头像 李华
网站建设 2026/9/29 15:38:05

AI智能体落地物流运营:顺丰案例拆解大模型工作流与人工兜底

简介&#xff1a;顺丰运营环节的智能体应用&#xff0c;是物流行业数字化转型的重要样本。这份PPT以顺丰科技实践为蓝本&#xff0c;系统梳理智慧供应链的底层能力&#xff0c;涵盖覆盖全国的航空、陆运、铁运及多式联运网络&#xff1b;并结合天网、地网等资源布局&#xff0c…

作者头像 李华
网站建设 2026/9/29 15:37:51

进口阀门选型指南:品牌分类、工况匹配与避坑策略

进口阀门这四个字&#xff0c;在设备采购和工程项目圈子里一直是既让人安心又让人头疼的话题。安心的地方在于&#xff0c;大家都默认进口件更稳——同样的介质和工况&#xff0c;国产阀用两三年开始内漏&#xff0c;进口阀五年后还能保持接近出厂时的流量曲线&#xff1b;头疼…

作者头像 李华