【Unity + VRCSDK】逆引きトラブルシューティングガイド

#はじめに

VRCを嗜む人であれば100人中100人が好きと答えるであろうUnity（諸説あり）ですが何かとVRCへのアップロード時にはトラブルは付き物、そんな困ったときにこの記事を読んでもらって解決の糸口となることを目指した記事となります。
なお執筆開始時点でのUnityのバージョンは `2018.4.20f1` VRCSDKのバージョンは `VRCSDK2-2020.07.15.12.38` となります為ご留意ください。
（SDK3特有のことも少しずつ追記していきます）
なお記事の最終更新日は 2021年8月3日になります。

#前座的なお話
本題に入る前に覚えておくと良いことを少しだけ書いておこうと思います。
##トラブルとか云々の前に推奨しておきたい事
悪いことは言わない、何らかの形で **プロジェクトのバックアップは取れ**、[こうなって](https://twitter.com/meronmks/status/1258379828081782789)[^1]手遅れになる前に・・・
[^1]: Unityは突然死することで有名
個人的おすすめはこちらの記事「[【超初心者向け】Unityのプロジェクトを、GitHub for Unityを使って超簡単にバックアップする方法](https://qiita.com/toRisouP/items/97c4cddcb735acde2f03)」のようにGitでのバックアップを、コミットメッセージつけるの面倒とか自分で使うだけなら適当でいいんでやって・・・お願いだから。
最低限ローカルにあるプロジェクトのフォルダを丸々コピーでもいいのでやりましょう。
**壊れたときに泣くのはあなたです** ので。
なおフォルダをコピーしたいという人で場所がわからないという場合はUnity Hubを使っている人の場合はこの赤枠内を
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89306/7d9df499-10af-66cf-90f0-34e54d137580.png)
直接Unityをインストールしている方はこの赤枠内を見ることでプロジェクトがあるフォルダがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89306/d6e33184-6923-45d2-bed8-fe590a49da83.png)
後はこのフォルダにプロジェクト名のフォルダがありますのでそちらをコピーすれば完了なので、面倒と思っても定期的にやって・・・

##何かおかしい時に最初に見るべき箇所 Console
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89306/d047d6cd-e6b8-fe47-6ad7-eafd776fb9c8.png)
さてこの画面はUnityにVRCSDK2を入れただけで特に問題もないプロジェクトですが、仮にこのプロジェクトで何か起きたとしましょう。意図していた通りに動いてくれない、なぜかアップロードボタンが押せないという時にはまずはここを見ましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89306/ccbf3c45-6739-cfd2-6c09-d51535feafb7.png)
**何も見えないけど？？？**
はい、今は何も見えていませんがこの箇所にはUnityからもしくはあなたが導入したSDKやエディタ拡張からのメッセージが表示されます。
例えばエラーになっていると以下のように赤い「！」マークと赤文字でメッセージが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89306/b00afe92-0725-2222-0db6-ba1067708242.png)
このメッセージをクリックすると `Console` というビューが画面のどこかが切り替わって表示もしくはポップアップしてくるので（この例の場合は `Project` の部分が切り替わります）のでこちらを確認しましょう。[^2]
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89306/b285be81-ea50-6552-cbcb-633bbd89092e.png)
**いやこれでわかるなら(ry**
はい、だと思いますが落ち着いてメッセージ内容で調べてみて、いやそれでもわからんとなった場合は
**何がしたくて**（アバターをアップロードしたい、色を変えたい、etc...）
**どういう事象が起きていて**（アップロードボタンが押せない、パラメータが意図通り変わらない、etc...）
**どういうエラーが出ているか**を添えて聞いてみるとスムーズに解決できるはずです。
ちなみに、Consoleの右上のこのボタンでそれぞれのメッセージ（ただの情報と警告とエラー）の表示をフィルターすることができるのでエラー以外の情報が多すぎてわからんとなった場合は活用しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89306/98f74c01-8b1f-18be-c827-ea2cd2e7be15.png)
またConsoleのメッセージを選択した状態で `Ctrl+C`で内容をコピーできるのでこちらも活用していきましょう。
[^2]: ちなみにこのサンプルでのエラーはコンパイルエラーになるスクリプトをわざと配置しただけです。
最後に、スクリーンショットを添付するときは可能な限りUnityのウインドウ全体が見えるようにしましょう、意外と周辺も見ないと真因に気が付けないということもあるので。

前置きが長くなりましたがここから逆引き集となります。

#全般
アバターとかワールドとか関係ないものを記載していきます。
##メニューにVRChat SDKがそもそも出てこない
- Unityのバージョンが間違ってないか（古い方に）
    - Unityのウインドウのタイトルバーに書いてるので今一度間違ってないか確認
    - 指定されたバージョン以外では確定でどこかでトラブルが発生するので絶対に間違わないように（最悪バックアップを取っていたとしても最初からやり直す羽目になります）
- SDKに依存しているエディタ拡張があるが、使用していた機能が古く使えなくなっている為エラーとなっている
    - この場合はエディタ拡張が比較的早く更新されていることが多いので確認しましょう
- 導入に失敗した、もしくは手違いで必要なファイルを消した可能性
    - その場合は再度UnityPackageから導入しなおすと不足しているものだけ再導入してくれます
- Unityの再起動
    - 極まれにSDKのインストール直後だと表示されないことがある
    - 困ったらまず再起動は意外と鉄板

##VRChat SDKのメニューにShow Control Panel等が無い
- SDKを導入した後に導入したエディタ拡張は最新のものか
    - エディタ拡張は動作確認されたバージョン以外だとSDKを巻き込んで動かなくなることがある
- 間違えてVRChat SDKのフォルダなどを消してしまったり、中身を編集してないか
    - UnityPackageからもう一度入れなおすことで解消することがあります
    - `Assets/VRChat Examples`と`Assets/VRCSDK`を消してからもう一度入れなして解消することも
    - 入れ直し後も解消しない場合は`Project`ビューの`Assets/VRChat Examples`と`Assets/VRCSDK`で右クリックし`Reimport`
    - 上記だけで解消しない場合は`Project`ビューのどこかで右クリックして`Reimport All`をする必要がある（導入したAssetsの数によってはとんでもなく長いので注意）
- 古いSDKからアップデートしている場合は「不要なファイル」が残ってないか
    - 現在のSDK2では`Assets/VRChat Examples`もしくは`Assets/VRCSDK`以外には関連ファイルは無いのでここ以外に関連するファイルがある場合は削除しましょう（`Assets/Editor`や`Assets/Plugins`にあったりしますので消しましょう）

##見た目が目に悪いショッキングピンク色に
- アバターやオブジェクトの見た目、見え方を決める「マテリアル」がMissingとなっている
    - 対応するマテリアルを再度指定しなおす
- 「シェーダー」が壊れてしまっている可能性
    - 使用されているシェーダーを再導入
- 使用している「シェーダー」を入れ忘れてる
    - 使用しているシェーダーをインポートする 

##アップロード時にUnityがクラッシュしてしまう
Control PanelのSettingsにある `Future Proof Publish` にチェックが入っているとVRCのクライアントがアップデートされても壊れにくくするためにUnityPackageを作るのですが、この作成時にクラッシュすることがあるため頻繁に又は確定でクラッシュしてしまうのであればチェックを外すのがいいでしょう。
（単純にアップロードにかかる時間が多くなるので短くするためにOFFにしているのが大多数と思われますが）
2021/02/17追記
このオプションで生成されるUnityPackageそもそも現状使用されてないらしく、推奨はしていないらしいです。（それでもまだ諦めきれてないのか現状でもデフォルトでONとなっている）

##アップロードしたのにゲーム内に反映されない
Unityのバージョンが指定のものより新しい可能性があります。
今一度ウインドウタイトル部分のバージョン表記が**本当に一字一句間違いがないか**確かめましょう。

## Failed to import package with error: Couldn't decompress package と表示されUnityPackageがインポートできない
もはやVRCとか関係無いですがMacでパッケージをエクスポートした後Windowsでインポートしようとすると条件によっては記載のエラーなりインポートできないようです。
参考：[Unityで"Failed to Import package with error: Couldn’t decompress package"](https://qiita.com/kc0615bootmfcitf/items/83ab26bb2e61efe50b14)

#アバター向け
アバター作成時に出会う可能性のあるものを記載します。

##アバターがアップロードできない
### SDKの画面に「A VRC_SceneDescriptor or VRC_AvatarDescriptor is required to build VRChat SDK Content」と表示されアップロードできない
書いている通り・・・と言ってしまえばおしまいですが、これはVRCSDKが今からアップロードするのがアバターなのか、ワールドなのかを判断する為のVRC_SceneDescriptorというコンポーネントまたはVRC_AvatarDescriptorというコンポーネントが見つからないよって事です。
アバターであればアップロードしたいアバターのGameObjectの一番最上層にVRC_AvatarDescriptorコンポーネントを追加してあげましょう。
ただ最近の販売アバターであればセットアップ済みのものが大多数ですので、これが表示されている場合は**そもそものアバター導入手順が間違ってないか**をReadMeでよく確認することを推奨します。

###Missingとなっているコンポーネントがある可能性
[【Unity】Missing なコンポーネントを検索できる「Missing Scripts Finder」紹介](https://baba-s.hatenablog.com/entry/2019/01/09/160000)
であるようなMissingとなっているコンポーネントを探すためのエディタ拡張などがあるのでこちらで一つ一つ消していくか、Missingとなっているコンポーネント（大体DynamicBone）を入れなおしてから再度アバターをインポートしなおしたりすると解消するはずです。
ちなみにこれに該当する場合はShow Control Panelでも警告されたはずですので対処法はともかく原因には気が付きやすいと思います。

###VRCで使えないコンポーネントがアバターにある
これもShow Control Panelに該当するコンポーネント名とともに出てきます。
大体エディタ拡張かAssetの機能を使った結果、`VRC_Avator Descriptor`のあるGameObjectに余計なものがあるのが多いと思われます。

### エラーが一つもないのにアップロードボタンが押せない
同じシーン内（今開いているhierarchy内）で他にもアバターとしてセットアップしているものがある場合は
一時的にVRC_AvatarDescriptorのあるGameObjectを無効に（Inspectorの左上のチェックボックスをオフにする）するとアップロードできるはずです。
要は今アップロードしようとしているアバター以外にエラーがあると全滅します。（どうして）

##アバターがTやAポーズ以外になってしまった
Animationの編集をするとそうなる仕様です。
事前にGameObjectを複製していればそちらに戻すという事も可能ですが、していない場合はTポーズに戻す拡張があったりしますのでそちらをご利用してみてください。
もしVeryAnimationのアセットを持ってる方ならそちらにもTポーズへ戻す機能がありますので使ってみるのもありです。
追記：
AnimatorにAnimation Controllerが設定されている場合は外してあげる（一度クリックしてDeleteとかで消せます）ともとに戻るかも。
~~無い場合は諦めてもろて（おい~~

##アップロード後VRCで喋ると声が反響する
リップシンクの設定で一部が `-none-` のままの可能性があります。
重複可なので空いているところになんでもいいので割り当てることで解消されます。

#ワールド向け
ワールド作成時に出会う可能性のあるものを記載します。

## SDKの画面に「A VRC_SceneDescriptor or VRC_AvatarDescriptor is required to build VRChat SDK Content」と表示されアップロードできない
アバターの時と同じですが、今度はワールドですのでなんでもいいので適当なGameObjectにVRC_SceneDescriptorを追加しましょう。
まあ手っ取り早いのはVRCSDKのVRCWorldというPrefabを設置するのが良いでしょう。

##ライトベイクをしたら特定のオブジェクトが真っ黒になった（焦げた）
もし真っ黒になった対象のオブジェクトがMeshBakerを使って一つにしたものであればそのオブジェクトだけ対象外にしてからもう一度ベイクをし直しましょう。
ある日突然真っ黒になってしまった場合はGIキャッシュを消してみたり、ライトの設定をMixedとかに変えると改善するかもしれません。
~~もしくは「[UnityでLightMapをもっと綺麗にBakeする！](https://minafrancesca.fanbox.cc/posts/407026)」での設定をしてみるとこれまた改善する可能性があります。~~
（2021/04/15追記：リンク先が非公開になっておりリンク切れになってます。代替えとなりそうなものが見つかったら差し替えます）


##ライトベイクをしていたらコンソールが「Failed to copy lightmap snapshot assets to directory」が埋まっていた
Unityの既知のバグ[^3]らしいです。
[^3]: https://forum.unity.com/threads/progressive-lightmapper-fail-to-write-lightning-data.614344/ （英語）
出てしまったらGIキャッシュを増やすか、Lightmapのサイズを変えたりすると問題が解消されることがあるそうです。もしくはバックアップから戻してやり直すか、Unity 2019.1以降では修正されているのでライトベイクだけ済まして結果だけ無理やり持ってくる・・・ということも可能ですがそこまでするならバックアップで戻すのが無難かもしれません。

##ライトベイク中に「'Bake Runtime' job failed with error code: 11 ('Failed reading Albedo Texture file.').」で止まってしまった
GIキャッシュを増やすことで対処可能な時があります。初期値はおそらく5GBなのでストレージと相談しつつ増やしてあげましょう。

## ベイク後にLightProbeの結果を確認していたら何故か真っ黒に焼かれているものがある
壁（メッシュ）に埋まっていたりすると発生しますが、そんな風に見えないって時は対象のprobeを壁から離す方向に少し動かしてみましょう。
確実に修正できる訳ではないので何度も施行あるのみです。

##アップロードして確認したら変な場所にスポーンした
VRCSDKにあるVRCWorldのPrefabをそのまま配置したのであれば、初期位置はそのPrefabの位置になります、意図してない場所になってないか確かめましょう。

##Mesh Colliderを入れたらよくわからないところで壁がある
モデルによっては相性が悪い？のかUnity側でうまく生成できない場合があります。
発生したら面倒ですがおとなしくBox Colliderで壁を作りましょう

## 【SDK3】Udon（U#）のコンパイル時に謎のエラーとなる
SDK3ではプロジェクトがある場所までのフォルダ名、アセットのファイル名、プロジェクト名にマルチバイト文字（平たく言うと日本語）やスペースが含まれていると高確率で壊れます。
U#では既に対応済みですがまあ変なバグを引き起こさないためにも避けておいた方が良いと思われます。

## 【SDK3】作ったギミックが突然動かなくなった
Udon内でnull参照が発生すると止まります。また現状再起動させる手段はおそらくないです。
なので操作する対象が消えてしまったりしないか確認し、消える可能性があるのであれば操作前に確認するようにプログラムを変えましょう。

##ワールドに入ったら落下した
この時床コライダーはよく忘れられる、気を付けよう。
なお一部ではこの現象を「蕎麦った」とか「蕎麦る」とか言うとか・・・

#最後に
この記事はここまでとなりますが、また新たな知見があったり何か自分がトラブルにあって直したって時に項目が増えてるかもしれません。~~おそらく未来の私がなんとかしてくれる。~~
ちなみについ最近（記事作成時）ですが「[VRCUnity勉強会](https://www.vrcunity.org/)」というのが立ち上がったようなので『文章読んでもやっぱわかんね人に聞きたい』という方はリンク先からDiscodeに参加してみるのも良いかもしれません。[^4]
[^4]: 不定期ですが講座が開催されたりするのでよわよわからつよつよになりたい人は是非、私もなりたいな・・・