1. 缓存管理
Unity Package Manager (UPM) 提供了两种缓存类型:
- Global Cache :全局缓存,存储所有项目的共享包资源,默认路径因操作系统而异(如 macOS 的
~/Library/Unity/cache)。 - App Store Cache :专为 Unity Asset Store 资源设计的缓存,路径可通过
Preferences -> Package Manager -> Cache修改。 - 修改缓存路径时需注意:新路径需具备读写权限,且更改后需重启 Unity 生效。例如,在团队协作中可统一设置为网络存储路径以共享资源。
2. Package Manager API 功能
开发者可通过 UnityEditor.PackageManager 命名空间下的 API 实现以下操作:
- 获取列表 :
Client.List()返回当前项目的所有包及其版本信息。 - 状态查询 :通过
PackageStatus枚举(如Available、Installed、Error)判断包状态。 - 包操作 :
Client.Add("com.unity.2d.sprite")安装指定包;Client.Remove()卸载包。 - 事件监听 :注册
Events(如registeringPackageManagerEvents)可在包加载完成后触发回调,例如自动生成配置文件。
3. 标签说明
- PR 标签 :标记为
Pre-release的包可能存在不稳定功能,需谨慎使用。例如"com.unity.render-pipelines.universal@12.0.0-pr.1"。 - 其他常见标签包括
verified(官方认证)、deprecated(已废弃)。
4. 资源访问规范
-
包内资源需通过
"Packages/包名/路径"格式引用,例如:csharpusing UnityEditor; // 加载图像资源 Texture2D logo = AssetDatabase.LoadAssetAtPath<Texture2D>("Packages/com.company.ui/Assets/Sprites/Logo.png"); -
注意事项:路径区分大小写,且需确保包已正确导入。
5. 配置文件结构
UPM 使用 .toml 格式的配置文件管理设置,分为两级:
-
Project 级 :位于项目根目录的
upmconfig.toml,优先级更高。示例内容:toml[project] cachePath = "D:/UnityCache" -
User 级 :存储在用户目录(如
~/.upmconfig.toml),影响全局行为。典型配置包括代理设置或私有注册表URL。 -
合并规则:相同配置项下,Project 级会覆盖 User 级。
6. 通过Package Manager管理自定义Scope Registry【常用】
通过Edit > Project Settings > Package Manage 管理自定义的scope registry

ScopeRegistry 格式
|------------|--------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| name | String | 范围名称,在用户界面中显示。Package Manager 窗口在包详细信息视图中显示此名称。 例如 "name": "Tools"。 |
| url | String | 与 npm 兼容的注册表服务器的 URL。 例如:"url": "https://mycompany.example.com/tools-registry" 注意 :并非所有注册表提供程序都与 Unity 的 Package Manager 兼容。确保您要添加的包注册表服务器实现 /-/v1/search 或 /-/all 终端。 |
| scopes | 字符串数组 | 数组,可以是具体的包名 或者 命名空间,不支持模糊匹配,比如com.example.* 例如, "scopes": [ "com.example", "com.example.tools.physics" ] Warning: Unity doesn't support npm's scope notation. |
cs
{
"scopedRegistries": [
{
"name": "General",
"url": "https://example.com/registry",
"scopes": [
"com.example", "com.example.tools.physics"
]
},
{
"name": "Tools",
"url": "https://mycompany.example.com/tools-registry",
"scopes": [
"com.example.mycompany.tools"
]
}
],
"dependencies": {
"com.unity.animation": "1.0.0",
"com.example.mycompany.tools.animation": "1.0.0",
"com.example.tools.physics": "1.0.0",
"com.example.animation": "1.0.0"
}
}
7. packages-lock.json文件
通过packages-lock.json文件,来管理版本依赖、解决冲突,对项目清单或可变包清单的任何修改(嵌入式或者从本地文件夹安装) 可能会迫使 Package Manager 重新计算已解析的包版本
8. manifest.json 【常用】
Unity 项目根文件夹下的 Packages 文件夹中找到名为 manifest.json 的项目清单文件。
|------------------------|---------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| dependencies | 对象 | 项目所需的包的集合。这仅包括直接依赖项(间接依赖项列在包清单中)。每个条目都将包名称映射到项目所需的最低版本: { "dependencies": { "com.my-package": "2.3.1", "com.my-other-package": "1.0.1-preview.1", etc. } } 指定版本号表示您希望 Package Manager 从包注册表下载包(即包的来源是注册表)。但是,除了使用版本,您还可以指定一个本地文件夹或 tarball 文件的路径或 Git URL。 注意 :您不需要指定嵌入式包,因为 Package Manager 会在您项目的 Packages 文件夹中找到并自动加载它们。如果包清单中有同名称的嵌入式包,Package Manager 会忽略任何条目。 |
| enableLockFile | Boolean | 启用锁定文件以确保以确定性方式解析依赖项。默认情况下设置为 true。有关更多信息,请参阅使用锁定文件。 |
| registry | String | 这个属性是仅供内部使用 。 注意 :如果除了 Unity 的注册表之外,您还想连接到包注册表服务器,请使用范围注册表。 |
| resolutionStrategy | String | 基于语义版本控制规则升级间接依赖项。默认情况设置为 lowest。有关更多信息,请参阅下面的设置解析策略。 |
| scopedRegistries | 对象数组 | 指定除了默认注册表之外的自定义注册表。这样允许您托管自己的包。 请参阅范围注册表了解更多详细信息。 |
| testables | 字符串数组 | 列出要在 Unity 测试框架中加载其测试的包的名称。有关更多信息,请参阅向包添加测试。 注意 :不需要指定嵌入式包,因为 Unity 测试框架默认它们是可测试的。 |
| useSatSolver | Boolean | 启用基于 SAT 的求解器依赖项解析算法。默认情况下设置为 true。 如果将此属性设置为 false,Package Manager 则使用已弃用的基于深度的策略。 |
9. 嵌入式包【重要】
项目packages文件夹下出现的包,都是嵌入式包,都会跟打进App内,所以不用的可以去掉
10. Library > Package Cache 和 Packages 的关系【重要】
package下的是可修改的,内嵌的。library下的是只读的。
11. 从本地引入Package 或者 tarball 形式引入【常用】
javascript
{
"dependencies": {
"my_package_a": "file:../github/my_package_folder",
"my_package_b": "file:../Downloads/my_package_tarball.tgz"
}
}
12. 创建自定义包【常用】
12.1 包名
一个包有两个名称:正式名称和显示名称,前者用于注册包,后者是用户在 Editor 中看到的面向用户的名称
12.2 包布局【常用】
下面是自定义包的建议包布局:
XML
<root>
├── package.json
├── README.md
├── CHANGELOG.md
├── LICENSE.md
├── Third Party Notices.md
├── Editor
│ ├── [company-name].[package-name].Editor.asmdef
│ └── EditorExample.cs
├── Runtime
│ ├── [company-name].[package-name].asmdef
│ └── RuntimeExample.cs
├── Tests
│ ├── Editor
│ │ ├── [company-name].[package-name].Editor.Tests.asmdef
│ │ └── EditorExampleTest.cs
│ └── Runtime
│ ├── [company-name].[package-name].Tests.asmdef
│ └── RuntimeExampleTest.cs
├── Samples~
│ ├── SampleFolder1
│ ├── SampleFolder2
│ └── ...
└── Documentation~
└── [package-name].md
| 位置 | 描述 |
|---|---|
package.json |
包清单,定义了包的依赖项和其他元数据。 |
README.md |
开发者包文档。通常来说,这是文档,可帮助那些想要修改包或想要在包主源代码仓库中推送更改的开发者。 |
CHANGELOG.md |
对于包更改的描述,按照相反的时间顺序列示。最好使用标准格式,比如保留变更日志 (Keep a Changelog)。 |
LICENSE.md |
包含包许可证文本。通常,Package Manager 将从所选的 SPDX 列表网站复制文本。 |
Editor/ |
特定于 Editor 平台的 Assets 文件夹。与 Assets 下的 Editor 文件夹不同,这只是一个约定,不会影响资源导入管线。请参阅程序集定义和包以在此文件夹中正确配置特定于 Editor 的程序集。 |
Runtime/ |
特定于运行时平台的 Assets 文件夹。这只是一个约定,不会影响资源导入管线。请参阅程序集定义和包以在此文件夹中正确配置运行时程序集。 |
Tests/ |
用来存储包中所有包含的测试的文件夹。 |
Tests/Editor/ |
特定于 Editor 平台的测试文件夹。请参阅程序集定义和包以在此文件夹中正确配置特定于 Editor 的测试程序集。 |
Tests/Runtime/ |
特定于运行时平台的测试。请参阅程序集定义和包以在此文件夹中正确配置运行时测试程序集。 |
Samples~/ |
用来存储包中所有包含的示例的文件夹。 |
Documentation~ |
用来存储包中所有包含的文档的文件夹。 |
cs
Unity 会忽略以 ~ 字符结尾的所有文件夹名称的内容,并且不会使用 .meta 文件跟踪它们。
但是,您需要为 Editor、Runtime 和 Tests 文件夹及其内容包含 .meta 文件,
以便它们正常运行
12.3 向包添加测试程序集【重要】
https://docs.unity3d.com/cn/current/Manual/cus-tests.html
| 属性 | 类型 | 描述 |
|---|---|---|
| name | String | 程序集的名称(不含文件扩展名)。 |
| references | 字符串数组 | 对 Editor 和 Runtime 程序集的引用。程序集定义文件需要不同的引用,具体取决于它是用于 Editor 测试还是 Runtime 测试: - 对于 Editor 测试,请添加对包的 Editor 和 Runtime 程序集的引用。 - 对于 Runtime 测试,仅添加对包的 Runtime 程序集的引用。 |
| optionalUnityReferences | 字符串数组 | 该 Unity 引用列表必须包含**"TestAssemblies"**才能将该程序集标记为测试程序集。这样会在程序集定义中添加对 unit.framework.dll 和 UnityEngine.TestRunner.dll 库的引用。 |
| includePlatforms | 字符串数组 | 对于 Editor 测试,此平台列表必须包含**"Editor"**平台。 |
12.4 为资源包创建示例【重要】
https://docs.unity3d.com/cn/current/Manual/cus-samples.html
12.5 Package.json
https://docs.unity3d.com/cn/current/Manual/upm-manifestPkg.html
javascript
{
"name": "com.[company-name].[package-name]",
"version": "1.2.3",
"displayName": "Package Example",
"description": "This is an example package",
"unity": "2019.1",
"unityRelease": "0b5",
"documentationUrl": "https://example.com/",
"changelogUrl": "https://example.com/changelog.html",
"licensesUrl": "https://example.com/licensing.html",
"dependencies": {
"com.[company-name].some-package": "1.0.0",
"com.[company-name].other-package": "2.0.0"
},
"keywords": [
"keyword1",
"keyword2",
"keyword3"
],
"author": {
"name": "Unity",
"email": "unity@example.com",
"url": "https://www.unity3d.com"
}
}