Unity自定义Package创建_01

811 阅读7分钟

Unity Package Manager 是 Unity 官方的包管理系统。具备以下功能:

  • 允许 Unity 快速轻松地分发新功能以及更新现有功能。
  • 为用户提供一个发现和共享可重用组件的平台。
  • 将 Unity 提升为可扩展的开放平台。

使用 Package Manager 可以定义项目依赖项,解析包依赖关系,根据需要下载和添加包,以及将内容集成到项目中。

包可以包含以下内容:

  • C# 脚本
  • 程序集
  • 原生插件
  • 模型、纹理、动画和音频剪辑以及其他资源。

注意:Package Manager 不支持包中的流媒体资源。而应使用 Addressables 包。

每个包还包含一个包清单文件,其中包含诸如包名称、其版本、其依赖项列表以及其存储库 URL 之类的信息。

要创建新包,请执行以下操作:

1.使用下列其中一种方法来为包创建一个空 shell:

* [设置嵌入式包](#EmbedMe)。
* [设置本地包](#LocalMe)。

2.实现您的工具、库以及您的包所需的任何资源。 3.确保包的布局遵循 Unity 包的布局约定

<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

许多官方的 Unity 包也实现这种结构。

位置描述
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~用来存储包中所有包含的文档的文件夹。

Unity 会忽略以 ~ 字符结尾的所有文件夹名称的内容,并且不会使用 .meta 文件跟踪它们。但是,您需要为 EditorRuntime 和 Tests 文件夹及其内容包含 .meta 文件,以便它们正常运行。有关 .meta 文件以及 Unity 如何使用它们进行跟踪的更多信息,请参阅资源工作流程

4.向包添加测试

测试对于确保包在不同情况下能够按预期工作至关重要:

* 将所有 Editor 测试写入 `Tests/Editor` 中。 
* 将所有 Playmode 测试写入 `Tests/Runtime` 中。

5.重命名并更新程序集定义文件

必须将包内的脚本与程序集定义文件 (.asmdef) 关联。在 Unity 中,程序集定义文件等效于 .NET 生态系统中的 C# 项目。必须在程序集定义文件中设置对其他程序集(无论是在同一包中还是在外部包中)的显式引用。请参阅程序集定义以了解更多详细信息。

请使用以下约定来命名和存储程序集定义文件,确保编译的程序集文件名遵循 .NET Framework 设计指南 (.NET Framework Design Guidelines)

  • 将特定于 Editor 的代码存储在根 Editor 程序集定义文件中:

    Editor/[YourCompany].[YourPackageName].Editor.asmdef

  • 将特定于运行时的代码存储在根运行时程序集定义文件中:

    Runtime/[YourCompany].[YourPackageName].Runtime.asmdef

  • 为 Editor 和运行时脚本配置相关的测试程序集:

    Tests/Editor/[YourCompany].[YourPackageName].Editor.Tests.asmdef

    Tests/Runtime/[YourCompany].[YourPackageName].Runtime.Tests.asmdef

 { "name": "[YourCompany].[YourPackageName]", 
 "references": [ "[YourCompany].[YourPackageName].Tools",
 "[YourCompany].[YourPackageName].Planes", 
 "Unity.RenderPipelines.HighDefinition.Runtime" ], 
 "includePlatforms": [],
 "excludePlatforms": [], 
 "allowUnsafeCode": false, 
 "overrideReferences": false, 
 "precompiledReferences": [], 
 "autoReferenced": true, 
 "defineConstraints": [], 
 "versionDefines": 
  [ 
   { "name": "com.unity.render-pipelines.high-definition", 
     "expression": "7.1.0", 
     "define": "HDRP_7_1_0_OR_NEWER" 
   }, 
   { "name": "com.unity.modules.particlesystem", 
     "expression": "1.0.0", 
     "define": "USING_PARTICLE_SYSTEM" 
   } 
  ], 
 "noEngineReferences": false }

6.如果有示例,将示例添加到包。

**注意**:包只能包含示例,不过,如果使用相同的布局和 JSON 结构,也可以将示例作为工具或模板包的一部分包含在内。

7.可以在 LICENSE.md 和 THIRD PARTY NOTICES.md 文件中包含许可证和第三方声明

对于未共享的包,这是可选的操作,但对于共享的包,强烈建议这样做,以免用户滥用您的包或违反任何第三方许可证的要求。 
**提示**:您可以在包的 package.json 清单文件中使用 [licensesUrl](upm-manifestPkg.html#licensesUrl) 属性提供一个指向外部网页(承载该包的许可和第三方声明)的链接。

8.为包撰写文档

**提示**:您可以在包的 package.json 清单文件中使用 [documentationUrl](upm-manifestPkg.html#documentationUrl) 属性提供一个指向外部网页(承载该包的文档)的链接。

9.共享包。

创建新的嵌入式包

如果要在项目文件夹内创建自定义包,请遵循以下说明。

  1. Open the Unity Hub, and create an empty project on your computer.

    也可以使用计算机上的现有项目,然后将包嵌入在项目下从本地文件夹安装包。但是,创建新项目的做法会降低包内容出错的几率。

2.使用计算机的文件管理器(例如 Windows 文件资源管理器或 macOS Finder),导航到项目文件夹,然后找到 Packages 子文件夹。

3.使用与包名称匹配的名称在 Packages 文件夹内为包创建一个新的子文件夹。例如,如果包名为 com.example.mypackage,则子文件夹也应名为 com.example.mypackage

**注意**:如果包中包含资源,这尤为重要,因为 [AssetDatabase 查找资源路径](../ScriptReference/AssetDatabase.LoadAssetAtPath.html)
需要与 `Packages/<your-package-name>/Assets` 匹配,无论实际文件夹的名称是什么。

4.打开所选的文本编辑器,然后创建一个名为 package.json 的 JSON 文件。

5.将这个文件保存在您创建的新包根文件夹下面。

  1. Fill out all required and recommended fields in the package manifest (package.json) file.

重新打开 Unity 时,新包会显示在 Package Manager 窗口中和 Project 窗口中,可以在其中查看和修改包内容。如果在 Project 窗口中选择 package.json 文件,则也可以直接在 Inspector 窗口中修改其内容。

创建新的本地包

如果要在项目文件夹外创建自定义包,请遵循以下说明:

1.使用计算机的文件管理器(例如 Windows 文件资源管理器或 macOS Finder),为包创建一个文件夹。

如果已经为包创建了一些内容,则也可以使用现有位置。

2.确保您的文件夹结构的布局遵循 Unity 包的包布局约定。例如,如果具有 Editor 库和 Runtime 库,请确保将它们存储在 Editor 和 Runtime 文件夹下。

3.打开所选的文本编辑器,然后创建一个名为 package.json 的 JSON 文件。

4.将这个文件保存在包根文件夹下。

  1. Fill out all required and recommended fields in the package manifest (package.json) file.

6.在 Unity 中,创建一个新项目或打开一个现有项目。

7.打开 Packages 窗口,然后使用刚刚创建的 package.json 文件,按照安装本地包的说明操作。

新包会显示在 Package Manager 窗口中和 Project 窗口中,可以在其中查看和修改包内容。如果在 Project 窗口中选择 package.json 文件,则也可以直接在 Inspector 窗口中修改其内容。