Unity 是一个已经存在相当长一段时间并且不断发展的平台。 然而,当同时处理多个项目时,您在使用公共源(.cs)、库(.dll)和其他资源(图像、声音、模型、预制件)时仍然会遇到困难。 在本文中,我们将讨论针对 Unity 此类问题的本机解决方案的经验。
共享资源分配方式
对于不同的项目使用共享资源的方法不止一种,但每种方法都有其优点和缺点。
1. 复制——我们“手工”在项目之间复制资源。
优点:
- 适用于所有类型的资源。
- 没有依赖性问题。
- 资产 GUID 没有问题。
缺点:
- 巨大的存储库。
- 不存在版本控制的可能性。
- 难以跟踪共享资源的更改。
- 难以更新共享资源。
2.
优点:
- 您可以使用来源。
- 您可以分配资产。
- 没有依赖性问题。
缺点:
- 需要有 Git 经验。
- Git 对二进制文件不太友好 - 你必须连接 LFS。
- 存储库的访问控制。
- 版本升级和降级困难。
- GUID 冲突是可能的,并且 Unity 没有明确的行为来解决它们。
3. NuGet - 通过 NuGet 包分发共享库。
优点:
- 方便地处理不依赖于 Unity 的项目。
- 方便的版本控制和依赖性解析。
缺点:
- Unity 无法使用开箱即用的 NuGet 包(在 GitHub 上,您可以找到适用于 Unity 的 NuGet 包管理器,它修复了此问题,但存在一些细微差别)。
- 分配其他类型资产的困难。
4. Unity 包管理器 - 通过 Unity 的本机解决方案分配共享资源。
优点:
- 用于处理包的本机接口。
- 防止由于 GUID 冲突而覆盖包中的 .meta 文件。
- 版本控制的可能性。
- 能够为 Unity 分发所有类型的资源。
缺点:
- GUID 冲突仍然可能发生。
- 没有实施文档。
后一种方法优点多于缺点。 然而,由于缺乏文档,它现在还不是很流行,因此我们将详细讨论它。
统一包管理器
Unity Package Manager (UPM) 是一个包管理工具。 它是在 Unity 2018.1 中添加的,仅用于 Unity Technologies 开发的软件包。 但是,从版本 2018.3 开始,可以添加自定义包。
Unity 包管理器界面
这些包不会最终出现在项目源(Assets 目录)中。 它们位于单独的目录中 %projectFolder%/Library/PackageCache
并且不会以任何方式影响项目,它们在源代码中唯一提及的是在文件中 packages/manifest.json
.
项目文件系统中的包
包来源
UPM 可以使用多种包源:
1、文件系统。
优点:
- 实施速度。
- 不需要第三方工具。
缺点:
- 版本控制困难。
- 参与该项目的每个人都需要对文件系统进行共享访问。
2.Git 存储库。
优点:
- 您所需要的只是一个 Git 存储库。
缺点:
- 您无法通过 UPM 窗口在版本之间切换。
- 不适用于所有 Git 存储库。
3.npm 存储库。
优点:
- 完全支持UPM功能并用于分发官方Unity包。
缺点:
- 目前忽略除“-preview”之外的所有字符串版本的包。
下面我们来看看UPM+npm的实现。 该捆绑包很方便,因为它允许您使用任何类型的资源并管理包版本,并且还完全支持本机 UPM 界面。
您可以将其用作 npm 存储库
设置环境
首先你需要安装
创建包
要创建包,您需要放置文件 package.json
,它将描述它,到包含此包内容的目录。 您需要执行以下操作:
进入我们要打包的项目目录。
运行 npm init 命令并在对话框中输入所需的值。 对于名称,请以反向域格式指定名称,例如 com.plarium.somepackage。
为了方便显示包名,可以在package.json中添加displayName属性并填写。
由于npm是面向js的,因此该文件包含我们不需要的main和scripts属性,Unity也不会使用这些属性。 最好删除它们,以免使包描述变得混乱。 该文件应如下所示:
- 进入我们要打包的项目目录。
- 运行 npm init 命令并在对话框中输入所需的值。 对于名称,请以反向域格式指定名称,例如 com.plarium.somepackage。
- 为了方便显示包名,可以在package.json中添加displayName属性并填写。
- 由于npm是面向js的,因此该文件包含我们不需要的main和scripts属性,Unity也不会使用这些属性。 最好删除它们,以免使包描述变得混乱。 该文件应如下所示:
{ "name": "com.plarium.somepackage", "displayName": "Some Package", "version": "1.0.0", "description": "Some Package Description", "keywords": [ "Unity", "UPM" ], "author": "AUTHOR", "license": "UNLICENSED" }
- 打开 Unity 并生成 package.json 的 .meta 文件(Unity 看不到没有 .meta 文件的资源,Unity 的包以只读方式打开)。
发送包裹
要发送包,您需要运行以下命令: npm publish --registry *адрес до хранилища пакетов*
.
通过 Unity 包管理器安装和更新包
要将包添加到 Unity 项目,您需要:
- 添加到文件
manifest.json
有关包来源的信息。 为此,您需要添加属性scopedRegistries
并指出范围和将搜索特定范围的源地址。"scopedRegistries": [ { "name": "Main", "url": "адрес до хранилища пакетов", "scopes": [ "com.plarium" ] } ]
- 转到 Unity 并打开“包管理器”窗口(使用自定义包与使用内置包没有什么不同)。
- 选择所有包。
- 找到您需要的包并添加它。
使用源代码和调试
为了将源连接到项目,您需要创建
使用包不会限制您的调试选项。 但是,在 Unity 中使用包时,如果包中发生错误,则无法通过单击控制台中的错误来转到 IDE。 这是因为 Unity 不会将脚本视为单独的文件,因为在使用程序集定义时,它们会被收集到库中并包含在项目中。 使用项目中的源时,可以单击 IDE。
具有连接包的项目中的脚本:
带有工作断点的包中的脚本:
紧急修复包
添加到项目中的 Unity 包是只读的,但可以在包缓存中进行编辑。 为此,您需要:
- 转到包缓存中的包。
- 进行必要的更改。
- 更新文件中的版本
package.json
. - 发送包裹
npm publish --registry *адрес до хранилища пакетов*
. - 通过 UPM 界面将软件包版本更新为更正后的版本。
包导入冲突
导入包时可能会出现以下GUID冲突:
- 包——包。 如果在导入包时发现已添加的包包含具有相同 GUID 的资产,则导入包中具有匹配 GUID 的资产将不会添加到项目中。
- 一个包就是一个项目。 如果在导入包时发现项目包含具有匹配 GUID 的资产,则该包中的资产将不会添加到项目中。 但是,依赖于它们的资产将开始使用项目中的资产。
将资产从项目转移到包
如果在 Unity 打开时将资源从项目传输到包,则其功能将被保留,并且依赖资源中的链接将开始使用包中的资源。
这一点很重要:将资源从项目复制到包时,会出现上一节中描述的“包 - 项目”冲突。
冲突的可能解决方案
- 导入所有资产时使用我们自己的算法重新分配 GUID,以消除冲突。
- 将所有资源添加到一个项目中,然后将它们分成包。
- 创建包含所有资产 GUID 的数据库,并在发送包时进行验证。
结论
UPM 是一种在 Unity 中分配共享资源的新解决方案,它可以成为现有方法的一个有价值的替代方案。 文章中描述的建议基于真实案例。 我们希望您发现它们很有用。
来源: habr.com