Unity软件包管理器

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软件包管理器


Unity软件包管理器(以下称UPM)是一个软件包管理工具。 它是在Unity 2018.1中添加的,仅用于Unity Technologies开发的软件包。 但是,从版本2018.3开始,可以添加自定义程序包。


Unity软件包管理器界面

包不属于项目源(资产目录)。 它们位于单独的目录%projectFolder%/Library/PackageCache并且不以任何方式影响项目,它们在源代码中仅提及在packages/manifest.json文件中。


项目文件系统中的软件包

包裹来源


UPM可以使用多种软件包来源:

1.文件系统。

优点:

  • 实施速度。
  • 无需第三方工具。

缺点:

  • 版本控制的复杂性。
  • 与项目一起工作的每个人都需要文件共享。

2. Git存储库。

优点:

  • 只需要一个Git仓库。

缺点:

  • 您无法通过UPM窗口在版本之间切换。
  • 并非适用于所有Git存储库。

3. npm存储库。

优点:

  • 完全支持UPM功能,用于分发正式的Unity软件包。

缺点:

  • 当前,它将忽略除“ -preview”以外的所有字符串版本的软件包。

下面我们看一下UPM + npm的实现。 该捆绑包很方便,因为它允许您使用任何类型的资源和管理程序包版本,并且还完全支持本机UPM界面。

您可以将Verdaccio用作npm存储库。 它有详细的文档 ,仅需几个命令即可启动它。

环境设定


首先,您需要安装node.js。

包创建


要创建一个包,您必须将描述它的package.json文件放在包含该package.json内容的目录中。 您需要执行以下操作:

  1. 转到我们要打包的项目目录。
  2. 运行npm init命令,并在对话框中输入所需的值。 对于名称,以反向域的格式指定名称,例如com.plarium.somepackage
  3. 为了方便地显示包名称,请将displayName属性添加到package.json并填充它。
  4. 由于npm是面向js的,因此该文件包含我们不需要的属性,以及Unity不使用的scripts 。 最好将它们删除,以免使包装说明混乱。 该文件应如下所示:

     { "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文件(如果没有.meta文件,Unity不会看到资产,Unity的软件包仅用于读取)。

包裹寄送


要发送软件包,您需要运行以下命令: npm publish --registry * *

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


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

  1. 将软件包源信息添加到manifest.json文件中。 为此,添加scopedRegistries属性并指定范围和将在其中搜索特定范围的源地址。

     "scopedRegistries": [ { "name": "Main", "url": "   ", "scopes": [ "com.plarium" ] } ] 
  2. 转到Unity并打开“程序包管理器”窗口(使用自定义程序包与使用内置程序包没有什么不同)。
  3. 选择所有软件包。
  4. 找到所需的软件包并添加。


处理源代码并进行调试


为了使源连接到项目,必须为程序包创建一个程序集定义

使用软件包不会限制调试功能。 但是,在Unity中使用软件包时,如果软件包中发生错误,则无法通过在控制台中单击错误来进入IDE。 这是由于Unity不会将脚本视为单独的文件,因为在使用Assembly Definition时,它们会收集在库中并连接到项目。 使用项目中的源代码时,可以通过单击切换到IDE。

连接了程序包的项目中的脚本:


带有工作断点的软件包脚本:


紧急补丁修复


添加到项目中的Unity软件包是只读的,但是可以在软件包缓存中对其进行编辑。 为此,您必须:

  1. 转到程序包缓存中的程序包。


  2. 进行必要的更改。
  3. 更新package.json文件中的版本。
  4. 将软件包npm publish --registry * *发送npm publish --registry * *
  5. 通过UPM界面将软件包版本更新为更正的版本。

包裹进口冲突


导入软件包时,可能会发生以下GUID冲突:

  1. 包-包。 如果在导入程序包时似乎已经添加的程序包具有具有相同GUID的资产,则导入的程序包中具有匹配GUID的资产将不会添加到项目中。
  2. 包是一个项目。 如果在导入软件包时,似乎项目中包含具有匹配GUID的资产,则软件包中的资产将不会添加到项目中。 但是,依赖它们的资产将开始使用项目中的资产。

将资产从项目转移到包中


如果在Unity打开的情况下将资产从项目转移到包中,其功能将保留,并且从属资产中的链接将开始使用包中的资产。

重要提示 :当您将资产从项目复制到程序包时,将发生冲突“程序包-项目”,如上节所述。

可能的冲突解决方案


  1. 导入所有资产以避免冲突时,请根据其自己的算法重新分配GUID。
  2. 将所有资产添加到一个项目中,并随后将其分为多个包。
  3. 创建一个包含所有资产的GUID的数据库,并在发送数据包时进行验证。

结论


UPM是用于将共享资源分配给Unity的新解决方案,它可以替代现有方法。 本文所述的建议是根据实际情况提出的。 我们希望您发现它们有用。

Source: https://habr.com/ru/post/zh-CN445432/


All Articles