【Unity Package Manager】GitHubの自作ツールをUPM対応する方法メモ

# はじめに
GitHubで公開していた自作ツールをUPM対応させる手順を軽くまとめたいと思います。
結論から述べると、GitHubに ```package.json``` を置けば、とりあえずはUPM経由でツールをインストールできるようになります。

公式ドキュメント : カスタムパッケージの作成
https://docs.unity3d.com/ja/2019.4/Manual/CustomPackages.html

## 前提知識
・UPM(Unity Package Manager) の使い方が分かる
・GitHubでリポジトリを公開する方法を知っている (Gitの基本操作が分かる)

## 今回対応したツール
今回対応したツールは以下になります。
https://github.com/rngtm/Unity-VFXToolBox

UPMの ```add package from git URL...``` から以下のURLを叩くとツールがインストールできます。
https://github.com/rngtm/Unity-VFXToolBox.git?path=Assets/VfxToolBox

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/38751c5c-4f54-0919-3026-2f2e87122438.png)


## ツールをUPMで公開する手順
GitHubの自作ツールをUPM対応する**必要最低限**の手順は以下の通りです。

1. 公開したいツール類のルートディレクトリに ```package.json``` を置く
2. UPM から ```{GitHubのリポジトリURL}.git?path={package.jsonのディレクトリ} ``` を指定してパッケージをインストール


パッケージのディレクトリ構成は、公式ドキュメントを参考にすると良いでしょう。
https://docs.unity3d.com/ja/2019.4/Manual/cus-layout.html

## Gitパスの例
```https://github.com/rngtm/Unity-VFXToolBox``` というGitHubリポジトリを考えます。

package.json のパスが ```Assets/VfxToolBox/package.json``` である場合
UPMにて ```https://github.com/rngtm/Unity-VFXToolBox.git?path=Assets/VfxToolBox``` 
というURLを指定することでパッケージをインストールできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/3f93b695-ea76-4ecd-83b7-05a770eda34c.png)

# ツールのディレクトリ構成
今回UPM対応したツールのディレクトリ構造は以下のようになっています。

|パス|データ詳細|
|---|---|
|Assets/VfxToolBox/Editor/|ツールの動作に必要なC#スクリプト。UPMで配布したい|
|Assets/VfxToolBox/Samples/|ツールの動作に必要ではないが、サンプルデータとしてUPMで配布したい|

```
Assets/
+---Preset/
+---Settings/
+---UniversalRP/
\---VfxToolBox/
    +---package.json
    +---Editor/
    |   +---ツールに必要なC#スクリプト類
    \---Samples/
        +---SampleData/
        |   +---Sample001/
        |   |   +---エフェクトのサンプルデータ その1 (マテリアル・テクスチャ・Prefab・シーン)
        |   \---Sample002_Aura/
        |       +---エフェクトのサンプルデータ その2 (マテリアル・テクスチャ・Prefab・シーン)
        \---Shaders
            +---Sample001
            |   +---Sample001に必要なシェ―ダー
            \---Sample002_Aura
                +---Sample002に必要なシェ―ダー
```

## UPMで配布したくないアセット
UPMで配布したくないアセット類は ```package.json``` より上の階層に配置します。
```Assets/Preset``` や ```Assets/Settings``` といったフォルダがありますが、これらは ```package.json``` より上の階層にあるので、UPMでは配布されません。


# 最低限のUPM対応手順
```package.json``` をGitHubに置けば、UPMからパッケージとしてインストールできるようになります。

今回は ```Assets/VfxToolBox/ ``` 以下のアセットをUPMで配布するため、以下のようなpackage.jsonを配置しました。

```Assets/VfxToolBox/package.json
{
    "name": "com.rngtm.vfx-toolbox",
    "displayName": "VFX Toolbox", 
    "version": "1.2.0",               
    "unity": "2021.1",
    "description": "VFX Tools for ParticleSystem.",
    "author": {
        "name": "r-ngtm",
        "url": "https://github.com/rngtm"
    },
    
    "keywords": [
        "shader",
        "particle",
        "vfx"
    ],
    
    "dependencies": {
    },
}
```


# 更新履歴 CHANGELOG.md の追加
```CHANGELOG.md``` を追加することで、パッケージの変更履歴を残しておくことができます。
CHANGELOGは書いておいた方が良いでしょう。

私は以下のような ```CHANGELOG.md``` を書いてみました。 

```CHANGELOG.md
# Changelog

## [1.2.0] - 2021-01-03
### Changes
- Add Aura sample (SampleData001). 

## [1.1.0] - 2021-01-03
### Changes
- Organizing old VFX Samples (SampleData001). 
- Adding aura VFX (SampleData002_Aura).

## [1.0.3] - 2021-01-03
### Changes
- Removing shaders from Sample directory completely. 

## [1.0.2] - 2021-01-03
### Changes
- Removing shaders from Sample directory.

## [1.0.1] - 2021-01-03
### Changes
- Added samples for Unity Package Manager.

## [1.0.0] - 2021-01-03
### This is the first release of *Unity Package vfx-toolbox*.
- Added support for Unity Package Manager.
```

## サンプルデータ

package.jsonにsamplesを記述することで、UPMからサンプルデータをインストールできるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/ebad36dc-b756-b617-0c0f-e03c5fe992b7.png)


### サンプルデータのインストール
Importボタンを押してアセットをインポートすると、Unityプロジェクトへアセット類がインストールされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44288/45c95fc8-8519-a250-0502-711b86b07201.png)

インストールされるサンプルデータは

> Assets / Samples / パッケージ名 / バージョン番号 / サンプルデータ名

というパスになっています。

### サンプルデータの定義
package.jsonには以下の内容を追加することで、サンプルデータを定義することができます。

```json
    "samples": [
        {
            "displayName": "VFX Sample 1",
            "description": "Particle System and Spatial UI Samples.",
            "path": "Samples/SampleData/Sample001"
        },
        {
            "displayName": "VFX Sample 2 - Aura Effect",
            "description": "Aura Effect Sample.",
            "path": "Samples/SampleData/Sample002_Aura"
        }
    ]
```

|属性|詳細|
|---|---|
|displayName|UPM上で表示するサンプルの名前|
|description|サンプルの詳細|
|path|(package.jsonから見た)サンプルデータの相対パス|

パッケージ内のpackage.jsonやサンプルデータのディレクトリ構成は以下のようになっています。

```
VfxToolBox/
+---package.json
\---Samples/
    +---SampleData/
    |   +---Sample001/
    |   |   +---エフェクトのサンプルデータ その1 (マテリアル・テクスチャ・Prefab・シーン)
    |   \---Sample002_Aura/
    |       +---エフェクトのサンプルデータ その2 (マテリアル・テクスチャ・Prefab・シーン)
    \---Shaders
        +---Sample001
        |   +---Sample001に必要なシェ―ダー
        \---Sample002_Aura
            +---Sample001に必要なシェ―ダー
```

## 参考リンク
カスタムパッケージの作成
https://docs.unity3d.com/ja/2019.4/Manual/CustomPackages.html

パッケージマニフェスト
https://docs.unity3d.com/ja/2019.4/Manual/upm-manifestPkg.html

Unity PackageManagerを使う話。
https://www.slideshare.net/TakayoshiOgawa/unity-packagemanager

2020年版 Unity Package Manager の Release Notes 全部抜く
https://zenn.dev/monry/articles/e86eac9f4ee2ea5baaa9