PackageManager

Unity Package Manager(简称UPM)是Unity官方的包管理工具,用于安装、更新、移除引擎官方功能包和第三方包。现代Unity工程中大量功能都以包的形式提供,因此Package Manager是日常开发中绕不开的工具。

包和manifest.json

在Unity中,包(Package)是一种分发引擎功能的单元,它通常包含若干脚本、资源和一个package.json描述文件,其中声明了包名、版本、依赖等。Unity将越来越多的功能从引擎本体中剥离成独立的包,这样引擎核心保持精简,功能包可以独立迭代更新。

工程依赖了哪些包,记录在工程根目录Packages/manifest.json文件中,典型的内容例子如下。

{
  "dependencies": {
    "com.unity.inputsystem": "1.7.0",
    "com.unity.cinemachine": "2.9.7",
    "com.unity.textmeshpro": "3.0.9",
    "com.unity.ugui": "1.0.0",
    "com.unity.modules.physics2d": "1.0.0"
  }
}
  • dependencies中每一项是包标识符: 版本号,官方包标识符统一以com.unity.开头
  • com.unity.modules.*结尾的是引擎内置模块(例如物理、音频、UI 等),默认全部启用,一般不需要动
  • 我们通过Package Manager窗口做的所有安装、移除、版本切换操作,最终都会反映到这个文件中
  • Packages/目录必须提交版本库,克隆工程后打开时,Unity会根据manifest.json自动下载恢复所有包,无需手动逐个安装

Package Manager工具使用

我们可以通过菜单Window -> Package Manager打开包管理器窗口。

  • 来源下拉框(Packages: ...):切换当前浏览的包来源。Unity Registry浏览官方包;In Project查看本工程已安装的包;My Assets浏览从Asset Store购买的资产;Built-in查看引擎内置模块
  • 搜索框:按名称搜索包
  • 左上角的+按钮:高级安装入口,支持从Git URL、本地tarball、本地目录、包名(Add package by name)安装

在列表中选中一个包后,右侧详情面板会显示包的介绍、文档链接和可用操作。

  • Install:安装当前选中版本的包
  • Remove:从工程中移除该包
  • 版本切换:详情面板底部的Version History中,我们可选择其他版本执行升级或降级。升级前建议先看包的Changelog,跨大版本升级可能有API破坏性变更

注意:

  1. 部分包安装时会要求重启编辑器或修改工程设置,例如安装Input System时会提示“是否启用新输入系统并禁用旧输入系统”,确认后编辑器会自动重启,这是正常现象
  2. 某些包带有示例内容,详情面板Samples页签中可点击Import将示例导入到工程的Assets/Samples/下,学习新包时非常有用
  3. 包之间存在依赖关系,安装一个包可能自动连带安装它依赖的其他包,移除被依赖的包时会收到提示

Scoped Registry作用域注册表

默认情况下Package Manager只从Unity官方注册表拉取包。但社区中一些流行的开源包可能发布在OpenUPM等第三方注册表上,这需要通过Scoped Registry机制接入。打开Edit -> Project Settings -> Package Manager,在Scoped Registries中添加一项注册表配置(通常包括名称、URL、作用域),保存后,Package Manager搜索匹配作用域的包时就会同时查询该注册表了。

UPM其它注意事项

  • 包缓存在工程目录的Library中:下载的包会解压到Library/PackageCache/,这是缓存而非源文件,不要手动修改其中内容,想修改某个包的源码,应把它复制到Packages/目录下转为Embedded包
  • 锁定依赖版本:正式项目中建议固定每个包的版本号,不要随意升级到最新版,避免引入未评估过的变更,升级包这种操作应单独提交,便于出问题后回退定位
  • 离线环境:包的下载依赖网络,且缓存在用户目录全局共享(%LOCALAPPDATA%\Unity\cache),同一版本重复安装不会重复下载
作者:Gacfox
版权声明:本网站为非盈利性质,文章如非特殊说明均为原创,版权遵循知识共享协议CC BY-NC-ND 4.0进行授权,转载必须署名,禁止用于商业目的或演绎修改后转载。