统一包管理器

Unity 是一个已经存在相当长一段时间并且不断发展的平台。 然而,当同时处理多个项目时,您在使用公共源(.cs)、库(.dll)和其他资源(图像、声音、模型、预制件)时仍然会遇到困难。 在本文中,我们将讨论针对 Unity 此类问题的本机解决方案的经验。

统一包管理器

共享资源分配方式

对于不同的项目使用共享资源的方法不止一种,但每种方法都有其优点和缺点。

1. 复制——我们“手工”在项目之间复制资源。

优点:

  • 适用于所有类型的资源。
  • 没有依赖性问题。
  • 资产 GUID 没有问题。

缺点:

  • 巨大的存储库。
  • 不存在版本控制的可能性。
  • 难以跟踪共享资源的更改。
  • 难以更新共享资源。

2. Git 子模块 — 通过外部子模块分配共享资源。

优点:

  • 您可以使用来源。
  • 您可以分配资产。
  • 没有依赖性问题。

缺点:

  • 需要有 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 存储库 韦尔达乔。 有详细的 文件,并且只需要几个命令来运行它。

设置环境

首先你需要安装 的node.js.

创建包

要创建包,您需要放置文件 package.json,它将描述它,到包含此包内容的目录。 您需要执行以下操作:

进入我们要打包的项目目录。

运行 npm init 命令并在对话框中输入所需的值。 对于名称,请以反向域格式指定名称,例如 com.plarium.somepackage。
为了方便显示包名,可以在package.json中添加displayName属性并填写。

由于npm是面向js的,因此该文件包含我们不需要的main和scripts属性,Unity也不会使用这些属性。 最好删除它们,以免使包描述变得混乱。 该文件应如下所示:

  1. 进入我们要打包的项目目录。
  2. 运行 npm init 命令并在对话框中输入所需的值。 对于名称,请以反向域格式指定名称,例如 com.plarium.somepackage。
  3. 为了方便显示包名,可以在package.json中添加displayName属性并填写。
  4. 由于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"
    }

  5. 打开 Unity 并生成 package.json 的 .meta 文件(Unity 看不到没有 .meta 文件的资源,Unity 的包以只读方式打开)。

发送包裹

要发送包,您需要运行以下命令: npm publish --registry *адрес до хранилища пакетов*.

通过 Unity 包管理器安装和更新包

要将包添加到 Unity 项目,您需要:

  1. 添加到文件 manifest.json 有关包来源的信息。 为此,您需要添加属性 scopedRegistries 并指出范围和将搜索特定范围的源地址。
    
    "scopedRegistries": [
       {
         "name": "Main",
         "url": "адрес до хранилища пакетов",
         "scopes": [
           "com.plarium"
         ]
       }
     ]
    
  2. 转到 Unity 并打开“包管理器”窗口(使用自定义包与使用内置包没有什么不同)。
  3. 选择所有包。
  4. 找到您需要的包并添加它。

统一包管理器

使用源代码和调试

为了将源连接到项目,您需要创建 装配定义 对于包裹。

使用包不会限制您的调试选项。 但是,在 Unity 中使用包时,如果包中发生错误,则无法通过单击控制台中的错误来转到 IDE。 这是因为 Unity 不会将脚本视为单独的文件,因为在使用程序集定义时,它们会被收集到库中并包含在项目中。 使用项目中的源时,可以单击 IDE。

具有连接包的项目中的脚本:

统一包管理器
带有工作断点的包中的脚本:

统一包管理器

紧急修复包

添加到项目中的 Unity 包是只读的,但可以在包缓存中进行编辑。 为此,您需要:

  1. 转到包缓存中的包。

    统一包管理器

  2. 进行必要的更改。
  3. 更新文件中的版本 package.json.
  4. 发送包裹 npm publish --registry *адрес до хранилища пакетов*.
  5. 通过 UPM 界面将软件包版本更新为更正后的版本。

包导入冲突

导入包时可能会出现以下GUID冲突:

  1. 包——包。 如果在导入包时发现已添加的包包含具有相同 GUID 的资产,则导入包中具有匹配 GUID 的资产将不会添加到项目中。
  2. 一个包就是一个项目。 如果在导入包时发现项目包含具有匹配 GUID 的资产,则该包中的资产将不会添加到项目中。 但是,依赖于它们的资产将开始使用项目中的资产。

将资产从项目转移到包

如果在 Unity 打开时将资源从项目传输到包,则其功能将被保留,并且依赖资源中的链接将开始使用包中的资源。

这一点很重要:将资源从项目复制到包时,会出现上一节中描述的“包 - 项目”冲突。

冲突的可能解决方案

  1. 导入所有资产时使用我们自己的算法重新分配 GUID,以消除冲突。
  2. 将所有资源添加到一个项目中,然后将它们分成包。
  3. 创建包含所有资产 GUID 的数据库,并在发送包时进行验证。

结论

UPM 是一种在 Unity 中分配共享资源的新解决方案,它可以成为现有方法的一个有价值的替代方案。 文章中描述的建议基于真实案例。 我们希望您发现它们很有用。

来源: habr.com

添加评论