【教程】开发Unity PackageManager 插件包

在本文笔者将带大家走完 UPM(Unity PackageManager) 插件包的开发流程,在本文你将学会 UPM 插件包的正确构建与调试流程、GitHub发布、插件更新与下载使用。从此Github 将是你的超级在线插件包~

【教程】开发Unity PackageManager 插件包_第1张图片

Tips :Unity 2018.3 及之后版本, Unity Package Manager (UPM) 已经支持 Git 了.
https://forum.unity.com/threads/git-support-on-package-manager.573673/
这个更新使得我们能够快速的安装那些托管在诸如 GitHub,Gitlab,Gitblit 等代码托管服务上的插件包。

这样,只要给个git链接就能安装插件/更新插件了,并且这个工作流可以让插件的开发和维护与用户工程的开发文件完全隔离,做到不污染用户工程又能将插件用于实际开发中,UPM 提供的这种便利在不远的将来将是 Unity developer 的一场狂欢,并且这一天并不遥远。

言归正传,下面我们创建一个 UPM 插件包吧~
本教程中,我们将开发一个名为 “RotateMe” 的插件包,它包含一些用于驱动游戏对象旋转的组件。

本文不涉及远程仓库的创建以及Git 安装

简要步骤

  • 像往常那样开发。
  • 添加 asmdef 文件
  • 添加 package.json 和必要文档
  • 执行"git subtree split" 和tag命令

分支策略

在本教程,我们使用 2 个分支来开发这个插件包。看个人喜好,如有必要可以增加分支(比如:develop 分支)。

  • master 分支: 插件包开发环境,也就是一个正常的Unity工程。
  • upm 分支: 插件包发布的分支,也是供 UMP 读取和安装的分支。

请注意,不能直接往 upm 分支提交,也不要使用 git branch upm 的方式手动创建此分支。

目录结构

UPM包的公共目录结构如下:


【教程】开发Unity PackageManager 插件包_第2张图片

将上述插件包资源使用一个根节点统筹之,这个文件夹建议以插件名来命名,如下:


【教程】开发Unity PackageManager 插件包_第3张图片

怎么样,是不是就像往常开发那样的流程呢?
开发插件包的过程无不透露着熟悉的味道哈。

开发插件包

OK,现在我们在 "master" 分支中开发并调试我们的插件。
首先撰写一个用于驱动物体旋转的示例代码并放在这个文件夹下:
Assets/RotateMe/Scripts/RotateMe.cs
示例代码如下:

using UnityEngine;
public class RotateMe : MonoBehaviour
{
   public float angularVelocity = 10;
   void Update ()
   {
       var rot = Quaternion.AngleAxis (angularVelocity * Time.deltaTime, Vector3.up);
       transform.localRotation = rot * transform.localRotation;
   }
} 

当然,别忘了添加一个 Demo 场景。
要知道 Demo 场景可是一个可交互的手册呢,有了它用户就可以轻松的掌握怎么使用插件咯!


【教程】开发Unity PackageManager 插件包_第4张图片

添加 asmdef 文件

如果要开发包含脚本的插件包,这边建议您添加一个**asmdef **文件的呢,亲~
https://docs.unity3d.com/2018.3/Documentation/Manual/ScriptCompilationAssemblyDefinitionFiles.html

这个 asmdef 文件能将它所在的文件夹及其子文件夹的脚本打到一个独立的程序集中,表象上就是这些个脚本打到了独立的 dll 中了。

简单的说下 asmdef 文件的优势.

  • 更短的编译时间
  • 把"internal"访问修饰符用到了极致(要知道以往的源代码插件,因为与用户脚本编译在了同一个程序集,所以它的 Internal 修饰符并没起到应有的作用,暴露了太多,就是一个掩耳盗铃的迪米特法则罢)
  • 允许使用 unsafe code
  • .dll 文件可以指定特定的程序集引用。

如下图,如果你勾选了 "Test Assembly",程序集只在编辑器下生效而不会出现在打包的程序中。

搬运的原教程中没有涉及到到 AssemblyDefinition 的相互引用关系,笔者在这里补充下:

  1. 建议使用Editor 文件夹汇总所有的编辑器脚本,而将运行时的脚本使用 Runtime 文件夹汇总,参考 TextMeshPro 插件包的结构:


    【教程】开发Unity PackageManager 插件包_第5张图片
  2. 在Editor 和 Runtime 文件夹下各自创建一个 AssemblyDefinition 。
  3. Editor 文件夹下的 AssemblyDefinition 中 Platform 只能选择 Editor,并且 Reference 必须添加上 Runtime 中的那个 AssemblyDefiniion ,依旧参考 TextMeshPro :


    【教程】开发Unity PackageManager 插件包_第6张图片

添加文档

UPM 插件包需要一个 package.json 包体描述文件,保存在如下路径:"Assets/RotateMe/package.json".(插件根节点)

{
"name": "com.coffee.rotate-me",
"displayName": "Rotate Me",
"description": "Rotate the object!",
"version": "1.0.0",
"unity": "2018.3",
"license": "MIT",
"dependencies": {
 }
}

更多详情请见: https://docs.npmjs.com/files/package.json.

README.md, CHANGELOG.md, LICENSE.md 都可选但可以给用户带来更多信息。
将这些文档放在"Assets/RotateMe" 文件夹.
当然也可以放在"Assets/RotateMe/Document~",需要注意的是文件夹名称以~结尾不会显示在Project窗口

完成开发

完成了上面的几步,我们的插件包就算是完成啦。
最终 "master" 分组看起来就像这样:

【教程】开发Unity PackageManager 插件包_第7张图片

(如果你暂时不考虑 UPM ,可将这个文件夹导出成 unitypackage 发布)

发布UPM包

【教程】开发Unity PackageManager 插件包_第8张图片

如果想要发布 UPM 包,我们必须通过如下git 命令把插件包所在的文件夹创建为 subtree。
git subtree split --prefix=Assets/RotateMe --branch upm
这个命令将 "Assets/RotateMe" 目录放到“ upm” 分支。
通过这一步其他目录及文件不会出现在 upm 分支中。
接下来,为这个分支添加一个 tag 并推到远端。
推荐使用 semver作为 tag 的命名规则。

git tag 1.0.0 upm
git push origin upm --tags

大功告成!
这样,我们的 “RotateMe” UPM包就发布好了!
最终,分支图像这样子:


【教程】开发Unity PackageManager 插件包_第9张图片

安装 UPM 包

现在,我们试试把 RotateMe 使用 UPM 安装到其他工程中。

找到 "Packages/manifest.json" 插入如下一行:

{
 "dependencies": {
     "com.coffee.rotate-me": "https://github.com/mob-sakai/RotateMe.git#1.0.0",
     ...
 },
}

回到编辑器 Unity 就能自动加载咱们的插件啦,就像这样:


【教程】开发Unity PackageManager 插件包_第10张图片

或者使用 UpmGitExtension来安装。

版本更新

  • 在 "master" 分支开发和调试然后在 package.json 更新版本信息
  • 执行 "git subtree split"
  • 添加 tag 然后 push。

如此简单~

你也可以把已经存在的仓库使用同样的操作将其适配 UPM 。

总结

仅需几步,就能将 git 仓库直接变得支持 UPM。
如果 Github 上的Unity 工程都支持 UPM 那会有多棒!?
现在,就把你工程的 UPM 支持搞起来吧~

本教程测试用的仓库如下,不受限使用。
https://github.com/mob-sakai/RotateMe

扩展阅读

  • Unity - Manual : Git URLs - Unity手册:git 链接格式
  • UpmGitExtension
  • semver

本文由笔者搬运并翻译自 Tutorial: How to develop a package for UnityPackageManager

你可能感兴趣的:(【教程】开发Unity PackageManager 插件包)