【VRChat】VPM対応のすゝめ

## はじめに
VPM、便利ですよね。＋ボタンをポチッと押すだけで簡単にインストールできます。
VPMはVRChat Package Managerの略で、VRChat Creator Companion（VCC）や[ALCOM](https://vrc-get.anatawa12.com/ja/alcom/)がその機能を担ってくれます。パッケージの更新もボタン一つで出来る革命的な機能です。
この記事では、作成したアセットをVPM対応させるための方法を解説します。

※2025/03時点の情報です。
※この記事は一例であり、対応を保証するものではなく、筆者は一切の責任を負いかねます。

## 前提
この記事では、`Assets/Test`下に`Test.cs`を置き、これをVPM対応させます。適宜読み替えてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3983688/20465253-b7f1-46c1-90dd-575cce02f4cc.png)
Start時に「Hello, World!」するだけのU#です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3983688/98dcd044-2dc6-4bef-8e6b-000f8866508d.png)

# VPM対応
:::note warn
必ずバックアップしてから始めてください！
:::
## Unity
### アセットをパッケージ化
Package Makerを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3983688/4ddf19f0-6919-41fc-b2e3-a58604071c90.png)
*良い感じ*に設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3983688/784a1e2f-a7e6-43b4-ae6b-a4cc65de3c27.png)
`Package ID`は、自分のドメインがある場合はそれを逆方向に、ない場合は `com.[自分の名前].[パッケージ名]` などにしておくとよいでしょう。これに沿っていなくても問題ありませんが、他のもの（特に他の人のパッケージ）と被らないように注意してください。
`Related VRChat Package`は正しく設定しましょう。設定しないとアバター・ワールド両方に表示されてしまいます。（2敗）
メールアドレスは一応後で消せます。

`Convert Assets to Package`したら、**一度Unityのウィンドウを非アクティブにして、再度アクティブにします。** こうすることでUnityがファイル群を認識してくれます。うまくいかなかったら再起動でもOKです。
Packagesフォルダ内に先ほど入力したPackage IDの名前のフォルダがあるので開きます。

### README.mdの編集
作成後、README.mdには**PCのユーザー名**が製作者として書かれていますので注意してください。

### package.jsonの編集
#### Unity上での設定
Unity上で設定できる部分は設定します。下に雑な設定例を載せておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3983688/5a96bd67-ba2f-476e-b948-8f3d20c8b458.png)
ここで設定したバージョンがそのままRelease時のバージョンとなるので、正しく設定しましょう。
#### テキストエディタ上での設定
`localPath`や、`email`などはpackage.jsonを直接編集することで消せます。
依存関係のバージョンを設定します。VRChat SDKは後方互換性がある~~と信じている~~ので、「以上」を表す`>=`を付けます。
以下は設定例です。
``` json:package.json
{
  "name": "com.nomlas.test",
  "displayName": "Test Package",
  "version": "0.0.1",
  "description": "Describe this Package",
  "gitDependencies": {},
  "vpmDependencies": {
    "com.vrchat.worlds": ">=3.7.5"
  },
  "author": {
    "name": "nomlas"
  },
  "legacyFolders": {},
  "legacyFiles": {},
  "localPath": "",
  "unity": "2022.3"
}
```

### asmdefの設定
#### UdonSharp.Runtimeの追加
Runtimeフォルダ内のasmdefに、`UdonSharp.Runtime`を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3983688/4a1aad29-c590-4c85-85ff-007ac68f1359.png)
#### U# Assembly Definitionの追加
（これがないと動かないのに自動生成してくれないんですよね...）
Projectタブ上で`U# Assembly Definition`を作成し、Source Assemblyにasmdefファイルを指定します。

## GitHub
### VPM Package Templateをダウンロード
https://github.com/vrchat-community/template-package

不要なファイルもあるのでZIP形式でダウンロードしてしまいましょう。

### gitignoreの更新
大量に追跡対象のファイルがあるので、（あまり良くないですが）雑にこれを足します。
```gitignore:gitignore
/*/
!/Website/
!/Packages/
!/.github/
```
完了したら、Packagesフォルダ内のgitignoreも編集していきます。
Packagesフォルダ内のgitignoreは、`!com.vrchat.core.*`を削除し、`!com.vrchat.demo-template`を自分のパッケージに変更します。

### 不要なファイルを削除
必要なのは
- workflowファイル
- gitignoreファイル
- Websiteフォルダ内ファイル
だけです。他は削除しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3983688/3041754e-e1a9-4d41-a029-9542c00125e6.png)

出来たらPublicのリポジトリに上げます。

### GitHub上での設定
#### リポジトリ変数の作成
リポジトリ変数を作成します。画像赤枠のボタンをクリックし、Nameに`PACKAGE_NAME`、Valueに`com.nomlas.test`などのパッケージ名を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3983688/14f678c9-82ab-4f13-a9e1-65f4a53e6083.png)

#### GitHub Actionsの設定
設定ページのまま、「Pages」を選択して、「Source」ドロップダウンを「GitHub Actions」に変更します。

#### GitHub Pagesの設定
GitHub Actionsによる自動実行に対応するため、「制限なし」にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3983688/c25ded3c-4038-4317-b381-38b0f62cd21c.png)

### Action実行
Actionsページで「Build Release」を走らせると自動的にタグが打たれ、リリースされます。さらにその後自動的に「Build Repo Listing」が走り、GitHub Pagesを構成してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3983688/7688b030-c1b8-4826-b98c-44681bb9b67a.png)

お疲れさまでした。~~複数のパッケージを配信する`VPM Package Listing`の設定方法は以下の記事でまとめています。~~

## カスタマイズ
### releaseをドラフトにしたい
`release.yml`に以下の設定を追加します。
```diff_yaml:release.yml
      # Publish the Release to GitHub
      - name: Make Release
        uses: softprops/action-gh-release@de2c0eb89ae2a093876385947365aca7b0e5f844
        with:
+         draft: true
+         generate_release_notes: true
          files: |
            ${{ env.zipFile }}
            ${{ env.unityPackage }}
            ${{ env.packagePath }}/package.json
          tag_name: ${{ env.version }}
```
ドラフトでも`build-listing.yml`が実行されてしまうので、実行されないよう編集します。
```diff_yaml:build-listing.yml
on: 
  workflow_dispatch:
  workflow_run:
    workflows: [Build Release]
    types:
      - completed
  release:
-    types: [published, created, edited, unpublished, deleted, released]
+    types: [published, unpublished, deleted]
```


## トラブルシューティング
### workflowが見つからない
.github\workflowsのworkflowファイル群を上げなおすと認識してくれます。

### Unity実行時にエラーが出る
#### 以下のエラーの場合
```
Packages\com.nomlas.test\Runtime\Test.cs(2,7): error CS0246: The type or namespace name 'UdonSharp' could not be found (are you missing a using directive or an assembly reference?)
Packages\com.nomlas.test\Runtime\Test.cs(7,21): error CS0246: The type or namespace name 'UdonSharpBehaviour' could not be found (are you missing a using directive or an assembly reference?)
```
[U# Assembly Definitionの追加](#u-assembly-definitionの追加)をご覧ください。
#### その他のエラーの場合
アセンブリ定義参照が正しく行われているか確認してください。