Unity PackageManagerを使って自作パッケージをプロジェクトに追加できるようにする

自作した機能をUnity PackageManager(以降はUPM)で追加と削除できるようにして使い回しのスピードを上げてみようと思います。
使いまわしたい機能とgithubのレポジトリがあることが前提です。
ここでは、高さフォグ機能のURP RendererFeatureとVolumeのコードとシェーダーをUPMで追加/削除できるようにします。

Githubレポジトリ
https://github.com/jnhtt/height-fog-urp-volume

Window > PackageManager > Add package from git url … > https://github.com/jnhtt/height-fog-urp-volume.git?path=Assets/HeightFog

Unity PackageManager対応

  • フォルダ構成
  • package.json の記載内容
  • asmdef

フォルダ構成

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

今回のHeightFogの場合は以下の通り。

説明 備考
package.json パッケージマニフェスト
README.md ドキュメント
CHANGELOG.md 変更履歴
LICENSE.md ライセンス表記。他の人に使ってもらう場合は必須
Runtime ランタイム機能。要アセンブリ https://docs.unity3d.com/ja/current/Manual/cus-asmdef.html
Samples~ サンプルデータ PackageManagerからサンプルをインポートする

Unity公式
https://docs.unity3d.com/ja/current/Manual/cus-layout.html

package.json

難しいことは特になく、公式のドキュメントに従って書くだけです。
注意としては、samplesのpathはSamples~で始まるようにしてください。

Unity公式
https://docs.unity3d.com/ja/current/Manual/upm-manifestPkg.html

asmdef

Runtimeフォルダ内にasmdefを作成して、Assembly Definitin Refererncesに必要なasmdefを追加します。
asmdefが無いとUPM経由でimportするとエラーになります。
zipでプロジェクトに追加する場合は、不要ですが今回の意図には一致しないのでasmdefを作成してください。
今回は、URP Renderer FeatureとVolumeが必要なので以下を追加しました。

  • Unity.RenderPipelines.Core.Runtime
  • Unity.RenderPipelines.Universal.Runtime

Unity公式
https://docs.unity3d.com/ja/2022.3/Manual/cus-asmdef.html

GUIDが重複してエラーになる場合

エラーが出たアセットの.metaのGUIDを1文字変更してください。
デフォルトで作成されるSampleSceneを使い回すとこのエラーが出ます。