見出し画像

【Unity VRChat】アバターのアイテムの同期ズレ 原因2パターン


FXレイヤーでアイテム取り出し等の設計をしている人向け

動機:VRChatでアバターにアイテムを出現させたのに、相手からは「見えない!」と言われたので原因を調べました。

パターン1:parameter同期と実行が「必ず遅れる」ことから生じる同期ズレ

とりあえず絶対に同期ズレするのでこれはやってはいけないということがわかった処理について

①is_Right_Grabがfalse、つまり「右手に何も持っていない」とき、右手にアイテム3を出現させる
②右手にアイテム3を出現させた、つまり「右手に何も持っていない」状態ではなくなったので、Parameter Driverでis_Right_Grabをtrueにセットしておく(←

これをすると「相手から見えている自分のアバター」では条件判定のときに①is_Right_Grabがfalseという条件を満たさなくなっているため(trueにセットされてる)、②に遷移せず相手視点だけアイテムが出現しません。
自分ではアイテムが見えているのに相手からは何も見えない原因

参考ページ(アバターのAnimatorの同期ズレについて記述してるページ少ない…)

要点:「ステートマシンではなくパラメータの値が同期される」
「パラメータの値の同期はアバター着用者側での Animator 処理終了後に行われる」

パターン2:あとから来たひとは必ずオレンジ色のステートに入ることから生じる同期ズレ

参考:https://note.com/komugi_vr/n/n63c3ff4aefa6

「途中でワールドにインした人の場合、最初のStateからスタートする」

あとから来たひとは、parameterの状態はすべて同期されているが、ステートが違う(あとから来たひとの描画する自分はオレンジにいる)。
つまりparameterが同じだったら初期位置から流れて必ず同じステートに行きつくように設計しないと、完全に同期することはできない。

例:

①④
②③
これはミュートボタンの2回押しで目の色が変わるAnimatorのレイヤーで
参考記事のうまくいかなかった図とほど近い構成になっているのだが、③にいるときに新規の人が来ると(その人の中での自分のアバターは)①のところからスタートするので、一生かみ合わない。

修正版


③にいるとき、Latejoinerさんのステートが①→③
④にいるとき、①→④
と流れるようにちょっと工夫した(③④でtrue,①②でfalseにあるフラグをセット。①→③はMuteSelf:falseかつフラグオン,①→④はMuteSelf:trueかつフラグオン)。

Local Onlyにしてparameterもちゃんと登録しているのに、アイテムが同期しない原因にはこのようなものがあることがわかった。
次はもっとわかりたい。

おわり。

この記事が気に入ったらサポートをしてみませんか?