【VCI】故障かな？と思ったら(VCIよくあるミス集)

# 概要
この記事はVCI作成において引っかかりそうな箇所と解決策をケース別に記載したものです。
右側に表示されている見出しから見るのがわかりやすいと思います。
原因の部分に記載していない内容が原因のケースもありますのでご了承下さい
自分用のメモの役割も強いため、形式などはあとから変更するかもしれません。記事置くサイト自体も変えるかもしれません。

記載に間違っている所があれば指摘お願いします
また、この記事に乗っていない内容で「こんなところで引っかかったよ」というものがあればコメントで教えていただけると助かります。

# 問題発生時に共通で確認すべきこと
* VCIが出力されないときはunityのコンソールにエラーが出てないか確認する。
    * コンソールが表示されてない場合はメニューで Window>General>Consoleの順に選択する
* VCIを上書き出力してる人は更新日を見て正しく出力されているかを確認する(まれにエラーが出てないけど出力されないケースがあり、それを切り分けたいため)
* Vキャス上で正しくスクリプトが動かない場合は開発者用コンソールログでエラーが出てないか確認する
* 同様の現象が起きていないかtwitterなどで検索する
    * 自分がなにか困ったことをtwitterで書き、その後解決したときはそれもツリーで記載しましょう！後で検索した人が助かります！ 

# 故障かな？と思ったら

## VCI出力・読み込み関連

### VCI出力時にエラーのダイアログが表示される
__■よくある原因__
① VCIObjectがついてないオブジェクトを選択した状態でVCIを出力する
② VCIObjectの必須項目が入っていない
__■解決策__
基本的にメッセージに原因が書かれているのでそれを解決する

### エクスポートまでは押せるがVCIが出力されない
__■よくある原因__
Unityのコンソールにエラーが有る場合
　① VCIObject直下じゃない部分にVCISubItemが入っている
　② アニメーションの階層関係が壊れている
　　(アニメーション設定後にSceneで階層変更とかしたとき起きやすい)
　③ アニメーションを設定しているオブジェクト自体を動かそうとしている
その他
　④ 出力したと思ってるフォルダと実際に出力したフォルダが違う
__■解決策__
基本的にメッセージに原因が書かれているのでそれを解決する
　① VCISubItemはVCIObjectの直下のみに入れるようにする
　② アニメーションを確認し、構成が壊れている(黄色くなってる)部分を修正する
　③ 以下のように動かしたいアイテムをアニメーターの子オブジェクトにする
　　1. 空オブジェクト(A)を作成
　　2. Aに動かしたいオブジェクト(B)を入れる
　　3. Bにアニメーターを追加し、
　　4. Bを動かす設定をする
　④ もう一度VCI出力してみて出力先のフォルダを確認する

### VCIを出したときに緑色のクリスタルが出る
__■よくある原因__
① 使えないバージョンのuniVCI(≠最新版)を使用している
　(ベータ用に作ったVCIを安定版で出したとき等)
__■解決策__
① 使えるのuniVCIのバージョンでエクスポートしなおす

### クリスタルは出ないがアイテムも出てこない
__■よくある原因__
① アイテムが出てくる前に重力で下の方に落下してしまっている
② アイテムが互いにぶつかり合って弾け飛んでいる
③ 離れた位置に出ている
③ 地面に出てる(SubItemの位置が低い)
__■解決策__
① 重力無効化の設定をする(SubItemのRigidbodyComponentのUseGravityをOFFにする)
② 物理挙動が必要ないならisKinematicをオンにする
　物理挙動が必要ならぶつからない用にアイテムを配置する
③④ Unity上で適切な位置になるように調整する 
  VCIObjectのついたオブジェクトの位置は反映されないので注意

### Unity上で反映したBlendShapeが反映されない
__■よくある原因__
① 調査中
__■解決策__
① 調査中


## VCI更新関連
### VCIを差し替えても変わらない
__■よくある原因__
① 再読み込みをしていない
② アップするVCIを間違えている(旧verのVCIなどを上げている)
③ Seedの別のアイテムに上書きしてしまった
__■解決策__
① メニューでシステム>インベントリ更新を押してから出し直す
②③ VCIとSeedのアイテム名を確認する

### luaのコードが更新されない
__■よくある原因__
① Unity側でVCIObjectに設定されているスクリプトの変更をしていない
② scriptに同名の別ファイルが紐付いている(VCIObjectのscriptにファイルを設定している場合のみ)
③ mail.luaが存在しておりそちらが動作している
__■解決策__
① Unity側でスクリプトの変更をする
③ 正しいファイルと紐付けを行う
③ main.luaを削除する(リネームでも可)


## VCI操作関連
### アイテムがつかめない
__■よくある原因__
① Subitemのつけ忘れ
② SubItemのGrabbableにチェックつけ忘れ
③ コライダーのつけ忘れ(Blenderから持ってくるときや、PlaneとかQuad使ったときに起こりやすい)
④ 他のSubItemが重なっていて他のSubItemをuseしている判定になっている
　(FixedJoint使っているときになりがち)
__■解決策__
① Unityで対象オブジェクトにVCISubItemのコンポーネントをつける
② SubitemのGrabbableにチェックを入れる
② コライダーをつける
④ コライダーを重ならないようにする
　unity上でコライダーの順番を変更する(TODO:後で詳しく書く)

### 拡縮したらいきなりサイズが大きくor小さくなり、もとに戻らない
__■よくある原因__
① Unity上で設定しているScaleがSubitemの設定可能範囲を超えている
__■解決策__
① 1.Subitem付きの空オブジェクト(A)を作成する。このオブジェクトのScaleはSubitemに設定可能な範囲の値にする(TODO:URL)
　2.大きさを変えたいオブジェクトをAの子オブジェクトに変更し、サイズを調整する

### 出したアイテムがふわふわ浮いていく
__■よくある原因__
① 物理演算の影響無効化の設定がされていない
__■解決策__
① SubItemを追加したオブジェクトのRigidbodyComponentのIsKinematicにチェックを入れる。


### アイテムをグリップしても反応しない
__■よくある原因__
① 他のSubItemが重なっていて他のSubItemをuseしている判定になっている
　(FixedJoint使っているときになりがち)
__■解決策__
① コライダーを重ならないようにする
　unity上でコライダーの順番を変更する(TODO:後で詳しく書く)


### 回転のアニメーションが動かない
__■よくある原因__
① アニメーションの回転のプロパティ項目がQuotanionになってる
__■解決策__
① 回転をEulerかEuler(Quotanion)に変更する
　参考：[VCIでPDCAを回す(回転アニメーションの罠)](https://qiita.com/lightjug/items/ef87095e6788a71a1adb)

### 装着できない
__■よくある原因__
① VCIAttachableのコンポーネントの追加忘れ
② 装着範囲が小さい
③ ボーンの装着可能な位置を勘違いしている
__■解決策__
① 装着したいアイテムにVCIAttachableをつける(Subitemではなくその子アイテムでも可)
② 装着範囲を大きくする
③ ボーンの装着可能なのはボーンの根っこの部分なので、そこに合うように装着範囲を変更する(TODO：ホントか要確認)

## 同期関連
### VCIがコードで動かせない・動いても元の位置に戻る
__■よくある原因__
① 所有権がないオブジェクトを動かそうとしている
　(アイテムは所有権を持ってる人の位置が同期されるため、動かしても上書きされてしまう)
② 掴んでるもの移動しようとしている
__■解決策__
① ボタンなどを押して動かそうとしている場合はボタンと動かしたいもののグループIDを一緒にする
② 掴んでるSubitemの移動はできない(仕様)。表示を消したい場合は移動ではなくSetActiveを使って表示を消す。

### スクリプトで動かしたアイテムが他の人と同期しない
__■よくある原因__
① Subitemのつけ忘れ
② 子アイテムを移動している

__■解決策__
① Subitemをつける 
② 子アイテムではなくSubItemにする。または他の人のスクリプト上でもアイテムを動かす

### アニメーションやエフェクトが他の人で再生されていない
__■よくある原因__
① \_ALL\_のついてない関数を使っている
__■解決策__
① \_ALL\_のついている関数を使う

### アニメーションやエフェクトが多重再生される(音小さくしているのに爆音になる)
__■よくある原因__
① updateAllなど皆で実行される関数内で\_ALL\_のついている関数を使っている
__■解決策__
① 以下のいずれかに処理を変更する
　1.useやupdate等特定の一人で動く関数内で\_ALL\_のついている関数を使う
　2.\_ALL\_のついていない関数を使用する

### main.lua(アンダーバーなしのやつ)で修正した内容が他の人に反映されない
__■よくある原因__
① 現状main.luaは他のユーザの凸後にmail.luaを更新しないと内容が他の人に反映されない仕様となっているため
__■解決策__
① main.luaに変更を加えて保存する

## その他スクリプト関連
### Stateに設定した値が取得できない
__■よくある原因__
① Stateを設定後同フレームで読み込みしている。
　(Stateへの値反映はSet呼んで即行われないため、Getしても値がまだ変わっていない)
② State設定をメッセージ送信を同時に行い、別の人がそれを読み込んでいる
　(AさんでState設定＆メッセージ送信をし、Bさんでメッセージを受け取りStateを読むような処理をしている)
__■解決策__
① State設定した同フレームで読み込みは行わない。
② Stateの反映タイミングが必ずしもメッセージ到着より先になるとは限らないため、同時使用はしない
　上記のケースは必要な情報はStateで渡すのではなくメッセージの内容として渡すようにする。

### functionがあるのにvci.message.Onで紐付けができない
__■よくある原因__
① vci.message.Onの設定の段階でまだfunctionが定義されていない
__■解決策__
① functionの宣言をメッセージの紐付けより前に書く

### GetTransformで思ったアイテムが取得できない
__■よくある原因__
① 同じ名前のアイテム(SubItemありなし問わず)があり、別のアイテムを取得している
__■解決策__
① オブジェクトの名前をかぶらないようにする