【Unity：PackageManager】自作Packageの作成と追加

自作Packageの作成とプロジェクトへの追加
ドキュメントや記事はあるんだけど古かったりイマイチわからなかったりするので
（多分）わかりやすいようにがんばってまとめてみる

検証：Unity2020.1

GitHub、SourceTree使ってます

# 自作Package作成
## 1. GitHubにリポジトリ作成
　適当に新規リポジトリ作る
　https\://github.com/username/sample_package.git

　※結果的にリポジトリはPublic/Privateどちらもパッケージ追加できたが
　　Privateは自分自身がSSHkey登録してるからできてるだけかも（普通に落とせたらダメな気がするし）

## 2. プロジェクト作成
　1のリポジトリをSourceTreeでクローンする
　そこにUnityの新規プロジェクト作る

　例：クローンした「sample_package」に同名の「sample_package」でプロジェクト作成
　　sample_package
　　┗ sample_package
　　　┣ Assets
　　　┣ ...
　　　┣ Packages
　　　┣ ...

## 3. Packagesに自作Packageフォルダ追加
　フォルダ階層はなんでもいいんですがPackages配下に入れておくとUnityエディタ上でファイルの設定ができるので多分推奨な気がする

　例：Assetsフォルダと同じ階層にPackagesフォルダがあるので適当に自作パッケージ名のフォルダ追加
　sample_package
　　┗ sample_package
　　　┣ Packages
　　　　┣ sample ←追加
　　　　┣ manifest.json
　　　　┣ packages-lock.json

## 4. package.json追加
　先ほど作ったsampleフォルダ配下に「package.json」ファイルを作成
　sample_package
　　┗ sample_package
　　　┣ Packages
　　　　┣ sample
　　　　　┣ package.json ←追加

```C#:package.json
{
  "name": "com.sample.samplepackage",
  "displayName": "SamplePackage",
  "version": "0.1.0",
  "unity": "2020.1",
  "description": "description.",
  "author": {
    "name": "SamplePackage"
  }
}
```
色々とパラメータはあるみたいだけどとりあえず最低限必要そうなものだけ記載
Unity上で設定もできます（Packagesフォルダ以下に含まれている必要がある）
![package_manager_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216261/c1e2eff8-345b-80e5-50b6-b5691b5fe2cd.png)


## 5. アセンブリファイル追加
　package.jsonと同じフォルダに
　「Runtime」「Editor」フォルダを追加
　その中にアセンブリファイルと適当にスクリプトを追加
　　sample_package
　　┗ sample_package
　　　┣ Packages
　　　　┣ sample
　　　　　┣ package.json
　　　　　┣ Runtime ←追加
　　　　　　┣ SampleRuntime.cs ←追加
　　　　　　┣ Sample.SamplePackage.asmdef ←追加
　　　　　┣ Editor ←追加
　　　　　　┣ SampleEditor.cs ←追加
　　　　　　┣ Sample.SamplePackage.Editor.asmdef ←追加

例として「Runtime」「Editor」を追加してますが、ランタイムのみ、エディタのみとかであればそれぞれ不要です
それ以外のアセット（テクスチャとかシーンとか）もpackage.jsonのフォルダ以下に追加すればパッケージに含まれます
ちなみに、アセンブリファイル（.asmdef）があればフォルダ名はなんでもいいです
が、Unity公式のパッケージがそういう命名規則でやってるので揃えるのがわかりやすくて無難

```C#:Sample.SamplePackage.asmdef
{
    "name": "Sample.SamplePackage",
    "references": [],
    "includePlatforms": [],
    "excludePlatforms": []
}
```

```C#:Sample.SamplePackage.Editor.asmdef
{
    "name": "Sample.SamplePackage.Editor",
    "references": [
        "Sample.SamplePackage"
    ],
    "optionalUnityReferences": [],
    "includePlatforms": [
        "Editor"
    ],
    "excludePlatforms": [],
    "allowUnsafeCode": false,
    "overrideReferences": false,
    "precompiledReferences": [],
    "autoReferenced": true,
    "defineConstraints": [],
    "versionDefines": []
}
```

「references」がそこそこ重要で
他のパッケージに依存してる場合はここに追記しないといけない
あえてエディタのアセンブリに「Sample.SamplePackage」が追加してますが、これで自作のランタイムスクリプトに依存してることになります
Unity公式のパッケージの依存がある場合はこんな感じ

```C#:Sample.SamplePackage.asmdef
{
    ...
    "references": [
        "Unity.InputSystem", ←InputSystem使用してる場合
        "Unity.RenderPipelines.Universal.Runtime" ←URP使用してる場合
    ],
    ...
}
```

というか依存してるのに記載がない場合はエラー出るので気づくと思います

記載するのはアセンブリファイル名です
プロジェクトの「Library/PackageCache」に使用してるパッケージが含まれているので
エラーになってるパッケージの「○○.asmdef」を探して○○をreferencesに記載すればOKです

とか説明しておいてUnity上で設定もできるので依存関係はこっちで設定した方が楽です（Packagesフォルダ以下に含まれている必要がある）
![package_manager_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216261/2f5fd92d-090b-7a42-b4c9-e7d1b3cc1965.png)

## 6. プッシュ
　これでPackage側の準備は完了
　作成したファイル等をGitにプッシュしておいてください
　各ファイルの.metaファイルもプッシュ必須です
　無いと以下Package追加時にエラー出ます

# 自作Package追加
## 1. PackageManagerから追加
　新規でも既存でもいいんですが適当にUnityプロジェクト開いてPackageManager開いて下さい
　左上に＋ボタンがあるので画像の「git URL...」を選択
　![package_manager_add.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216261/759f4a85-a715-2892-c5eb-bf975be592f7.png)
　URL入力して「Add」で追加できます
　
　URLは最初に作成したリポジトリ（※下記は例で実際は自身で作成したURLです）
　https\://github.com/username/sample_package.git
　なんですが、これだとリポジトリ直下にpackage.jsonを配置した場合なので
　
　今回のように独自のフォルダ階層の場合は
　sample_package
　　┗ sample_package
　　　┣ Packages
　　　　┣ sample
　　　　　┣ package.json ←ここ

　https\://github.com/username/sample_package.git?path=/sample_package/Packages/sample
　のようにpathで階層指定する必要があります

## 2.完了
　ここまで問題なくできればPackageManagerに自作パッケージが追加されているかと思います
　![package_manager_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216261/1a25ff57-b951-1b6e-b731-354d4225e516.png)
　![package_manager_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216261/175e74c8-e31e-1f77-dfa0-8d09efc075e4.png)

　とりあえず追加までに最低限必要な作業だけやったんですが
　他にも「LICENSE.md」とか「CHANGELOG.md」とかちゃんとパッケージとして配布するならあった方がいい作業もあるんですが、あとは細かいファイルや定義追加なので公式のドキュメント見てもらえればと
　https://docs.unity3d.com/Manual/CustomPackages.html

　ちなみに…
　Previewパッケージは2020以降デフォルトで表示されないのでProjectSettingsから表示してあげてください
　依存関係の表示設定もできます
　![pakagemanager.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216261/a1f837b8-8598-249c-7956-ecdc5e92da91.png)

# まとめ
以前に比べ2020で大分便利になったと思うんですが
今後まだ改良されていくとは思います
サンプルフォルダの追加とか…
色々調べつつではあるのでそのうち追記や別記事書くかもです