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分配各种资源的能力。
缺点:
后一种方法的优点多于缺点。 但是,由于缺少文档,它现在不是很流行,因此我们将对其进行详细介绍。
Unity软件包管理器
Unity软件包管理器(以下称UPM)是一个软件包管理工具。 它是在Unity 2018.1中添加的,仅用于Unity Technologies开发的软件包。 但是,从版本2018.3开始,可以添加自定义程序包。
Unity软件包管理器界面包不属于项目源(资产目录)。 它们位于单独的目录
%projectFolder%/Library/PackageCache
并且不以任何方式影响项目,它们在源代码中仅提及在
packages/manifest.json
文件中。
项目文件系统中的软件包包裹来源
UPM可以使用多种软件包来源:
1.文件系统。优点:
缺点:
- 版本控制的复杂性。
- 与项目一起工作的每个人都需要文件共享。
2. Git存储库。优点:
缺点:
- 您无法通过UPM窗口在版本之间切换。
- 并非适用于所有Git存储库。
3. npm存储库。优点:
- 完全支持UPM功能,用于分发正式的Unity软件包。
缺点:
- 当前,它将忽略除“ -preview”以外的所有字符串版本的软件包。
下面我们看一下UPM + npm的实现。 该捆绑包很方便,因为它允许您使用任何类型的资源和管理程序包版本,并且还完全支持本机UPM界面。
您可以将
Verdaccio用作npm存储库。 它有详细的
文档 ,仅需几个命令即可启动它。
环境设定
首先,您需要安装
node.js。包创建
要创建一个包,您必须将描述它的
package.json
文件放在包含该
package.json
内容的目录中。 您需要执行以下操作:
- 转到我们要打包的项目目录。
- 运行
npm init
命令,并在对话框中输入所需的值。 对于名称,以反向域的格式指定名称,例如com.plarium.somepackage
。 - 为了方便地显示包名称,请将
displayName
属性添加到package.json
并填充它。 - 由于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" }
- 打开Unity并为package.json生成一个.meta文件(如果没有.meta文件,Unity不会看到资产,Unity的软件包仅用于读取)。
包裹寄送
要发送软件包,您需要运行以下命令:
npm publish --registry * *
。
通过Unity软件包管理器安装和更新软件包
要将包添加到Unity项目,您需要:
- 将软件包源信息添加到
manifest.json
文件中。 为此,添加scopedRegistries
属性并指定范围和将在其中搜索特定范围的源地址。
"scopedRegistries": [ { "name": "Main", "url": " ", "scopes": [ "com.plarium" ] } ]
- 转到Unity并打开“程序包管理器”窗口(使用自定义程序包与使用内置程序包没有什么不同)。
- 选择所有软件包。
- 找到所需的软件包并添加。
处理源代码并进行调试
为了使源连接到项目,必须为程序包创建一个
程序集定义 。
使用软件包不会限制调试功能。 但是,在Unity中使用软件包时,如果软件包中发生错误,则无法通过在控制台中单击错误来进入IDE。 这是由于Unity不会将脚本视为单独的文件,因为在使用Assembly Definition时,它们会收集在库中并连接到项目。 使用项目中的源代码时,可以通过单击切换到IDE。
连接了程序包的项目中的脚本:
带有工作断点的软件包脚本:
紧急补丁修复
添加到项目中的Unity软件包是只读的,但是可以在软件包缓存中对其进行编辑。 为此,您必须:
- 转到程序包缓存中的程序包。
- 进行必要的更改。
- 更新
package.json
文件中的版本。 - 将软件包
npm publish --registry * *
发送npm publish --registry * *
。 - 通过UPM界面将软件包版本更新为更正的版本。
包裹进口冲突
导入软件包时,可能会发生以下GUID冲突:
- 包-包。 如果在导入程序包时似乎已经添加的程序包具有具有相同GUID的资产,则导入的程序包中具有匹配GUID的资产将不会添加到项目中。
- 包是一个项目。 如果在导入软件包时,似乎项目中包含具有匹配GUID的资产,则软件包中的资产将不会添加到项目中。 但是,依赖它们的资产将开始使用项目中的资产。
将资产从项目转移到包中
如果在Unity打开的情况下将资产从项目转移到包中,其功能将保留,并且从属资产中的链接将开始使用包中的资产。
重要提示 :当您将资产从项目复制到程序包时,将发生冲突“程序包-项目”,如上节所述。
可能的冲突解决方案
- 导入所有资产以避免冲突时,请根据其自己的算法重新分配GUID。
- 将所有资产添加到一个项目中,并随后将其分为多个包。
- 创建一个包含所有资产的GUID的数据库,并在发送数据包时进行验证。
结论
UPM是用于将共享资源分配给Unity的新解决方案,它可以替代现有方法。 本文所述的建议是根据实际情况提出的。 我们希望您发现它们有用。