UbuntuのvpmがUnityを認識してくれない！

# ある日...
無事New Userなれたしアバター改変に向けてVRCSDKのセットアップの仕方を学ぶぞ〜
早速公式に従ってCreator Companionを...って窓しか対応してないやん(半ギレ)
(参考記事：[【VRChat】VCCをCLIで使う。](https://zenn.dev/ytjvdcm/articles/a5b6318b8a3995))
よーしこれであとは`vpm check unity`で認識するか確認...
```
[18:45:51 INF] Found No Supported Editors
[18:45:51 INF] Unity is not installed.
```
...はぁ？いやUnity 2022.3.6f1(当時ぶいちゃが要求してたバージョン)バッチリ入ってますが？`~/.local/share/VRChatCreatorCompanion/settings.json`の`pathToUnityExe`にもしっかり書きましたが？
ふざけんなぁぁぁぁぁぁぁぁぁぁ(魂の叫び)
# 概要
...なんて事があったので試しにggってみたところ、どうも[macOS](https://github.com/vrchat-community/creator-companion/issues/28)や[Linux](https://github.com/vrchat-community/creator-companion/issues/408)で同じ事が起きてると言うissueを発見。
その中で後者のissueにどうやって思いついたのか分からん解決方法が載ってたのでそれを日本語にする(＋α)だけの雑な記事です。
VRChat日本Linux勢の助けになったら幸いです...

:::note info
(2024/05/23追記)
実はAvatar Optimizerの作者(anatawa12氏)がVCC代替の[ALCOM](https://vrc-get.anatawa12.com/alcom/)を出しているので今はこれを使うのがいっちゃん楽だったりします。
以下、ALCOMを知る前の記事なので使えはしますけどこんなんやらんでもALCOM使えば済むのでご注意を。
:::
:::note info
(2024/05/25追記)
いつの間にかVRChatが要求するUnity 2022のバージョンが2022.3.22f1に上がってたので更新しました。
:::

# 解決方法
結論から言うと、以下のスクリプトを実行<del>する</del><ins>して`vpm`の設定を少しいじる(3/21追記)</ins>だけです(あら簡単)
(なんかスクリプト実行と設定いじりはセットだったみたいなので修正)
```cs
#r "nuget: LiteDB, 5.0.19"
using LiteDB;
using System;
using System.IO;

var user = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);

// ↓こっからUnityのインストール先
var unity2019 = $"{user}/Unity/Hub/Editor/2019.4.31f1/Editor/Unity";
var unity2022_3_6 = $"{user}/Unity/Hub/Editor/2022.3.6f1/Editor/Unity";
var unity2022_3_22 = $"{user}/Unity/Hub/Editor/2022.3.22f1/Editor/Unity";
// ↑適宜変更してちょ

var isUnity2019Installed = File.Exists(unity2019);
var isUnity2022_3_6Installed = File.Exists(unity2022_3_6);
var isUnity2022_3_22Installed = File.Exists(unity2022_3_22);

var dataHome = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
var connect = new ConnectionString(dataHome + "/VRChatCreatorCompanion/vcc.liteDb");

using(var db = new LiteDatabase(connect)) {
    if(isUnity2022_3_22Installed) {
        db.GetCollection("unityVersions").Insert(new BsonDocument() {
            { "Path", unity2022_3_22 },
            { "Version", "2022.3.22f1" },
            { "LoadedFromHub", false }
        });
    }
    if(isUnity2022_3_6Installed) {
        db.GetCollection("unityVersions").Insert(new BsonDocument() {
            { "Path", unity2022_3_6 },
            { "Version", "2022.3.6f1" },
            { "LoadedFromHub", false }
        });
    }
    if(isUnity2019Installed) {
        db.GetCollection("unityVersions").Insert(new BsonDocument() {
            { "Path", unity2019 },
            { "Version", "2019.4.31f1" },
            { "LoadedFromHub", false }
        });
    }
}
```
あ、ちゃんとUnityのインスコ先は適宜変更してくださいね。Unity Hubから入れてればそのまま使えるはずですが。
あと元のスクリプトには**何故か**LiteDBの`using`が抜けていたので修正。~~これのせいで数十分無駄にした。~~
さて、どう見てもこれはC#であってスクリプトっぽくないですね。
しかし、`dotnet-script`なるツールによりこのトップレベルにベタ書きされてるC#のコードをスクリプトの様にその場で実行できてしまうのです。
というわけでまず.NETと`dotnet-script`をインストールしましょう。
## .NET
`vpm`を使っているのであればそもそも.NET 6のランタイムが入ってるはずなので(というか無いと動かん)大丈夫だとは思いますが一応。
Ubuntuの場合は公式リポジトリに最新版しか置かれてないので.NET公式PPAを追加しましょう。あとは`dotnet-runtime-6.0`をインスコするだけです。
```shell
$ sudo add-apt-repository ppa:dotnet/backports
$ sudo apt install dotnet-runtime-6.0
```
## dotnet-script
これは`dotnet`コマンドからインストールします。ツールの導入が1行で完結するのは便利ですね。
```shell
$ dotnet tool install -g dotnet-script
```
## スクリプトの実行
ここまで来ると次の1行叩くだけでスクリプトを実行できるようになります。
```shell
$ dotnet script SCRIPT_FILE
```
先程のスクリプトファイルを適当なファイル(suffixは`.csx`みたいですね)に突っ込んでそのパスを`SCRIPT_FILE`に入れてやれば動きます。
## 設定ファイルの編集(3/21追記)
`vpm`(というかディレクトリ名的にVCC)の設定はデフォルトで`~/.local/share/VRChatCreatorCompanion/settings.json`に(多分)置いてあるので各自`vim`でも`gedit`でも使って開いて、
```json
"pathToUnityExe": "",
```
を
```json
"pathToUnityExe": "/home/USER_NAME/Unity/Hub/Editor/2022.3.22f1/Editor/Unity",
```
にしたり(こっちはいらないかも)、
```json
"preferredUnityEditors": {},
```
を
```json
"preferredUnityEditors": {
  "2019": "/home/USER_NAME/Unity/Hub/Editor/2019.4.31f1/Editor/Unity",
  "2022": "/home/USER_NAME/Unity/Hub/Editor/2022.3.22f1/Editor/Unity"
},
```
にしたりして保存すればヨシッ！
## 結果
```
[20:48:39 INF] Unity is installed.
```
キタ———(゜∀゜)———— !!(死語)
データベース書き換えるとか、何喰ったら思いつくんだろ...
ともかく、先駆者兄貴には頭が上がりませんね...
それでは、またいつか。