用途:在编辑器之外以无头方式管理 Unity UPM 包,包括添加、移除、升级和查询,适合 CI 或终端中非交互式安装,以及在依赖某包前验证其 ID 是否存在、列出可用版本。它补充 unity-cli 技能——CLI 没有包管理命令,所有包操作都走编辑器的 C# API。
主要能力:使用 UnityEditor.PackageManager.Client 的 Client.AddAndRemove 在一次 UPM 解析中完成整组包的添加与移除,比逐个 Client.Add 更快、更不易出错;用 @<version> 固定或升级版本,不带版本则解析最新兼容版本;用 Client.SearchAll() 或 Client.Search("<id>") 查询注册表。不要手工编辑 Packages/manifest.json,Client API 能正确解析依赖与兼容版本。
使用方式:把安装脚本写到 Assets/Editor/ProjectBootstrap/PackageInstaller.cs(必须位于 Editor/ 目录),用 -executeMethod ProjectBootstrap.PackageInstaller.Install 调用。Client.AddAndRemove 是异步的,请求只在后续 EditorApplication.update 中完成,因此不能使用 unity run(其默认注入 -quit,会在方法返回时立即退出编辑器,导致包未安装)。应直接以 -batchmode 启动编辑器二进制且不加 -quit,由脚本轮询完成后自行调用 EditorApplication.Exit(code)。示例命令:"$UNITY_BIN" -batchmode -projectPath "$PROJECT" -executeMethod "$METHOD" -logFile -。退出码 0 成功、1 UPM 错误、2 超时。查询脚本同理,写入 PackageSearch.cs 并以 -executeMethod ProjectBootstrap.PackageSearch.SearchAll 调用。
导入与保存:脚本或工具写入新的 .cs/asset 文件后,需让 Unity 导入以生成 .meta 文件,且每个 .cs/asset 必须与其 .meta 一起提交。ProjectSaver.SaveAll 是同步的,可安全通过 unity run 运行。
适用场景:在已有或新建项目中添加/移除/升级包、在 CI 中非交互式配置项目包、验证包 ID 或版本、决定游戏实际需要哪些包。
限制:安装脚本必须放在 Editor/ 下,不会进入构建;安装过程不能使用 -quit;UPM 解析与下载可能较慢,脚本设有超时;编辑器日志需通过 -logFile - 读取,而非 unity logs。具体包选择映射与注册表查询方式见 references/select-packages.md,资料未提供其内容。