見出し画像

なんも分からんVRC Contactの同期ズレと戦ったメモ

VRC Contact Sender, Receiverの同期の仕方が全く分からんかったので
タッチできるタブレットを作った工程を忘れないようにメモした場所です。
2022/8/27日での情報です。
Unity Ver.2019.4.31f1
Avatar SDK Ver.2022.07.26.21.45_Public
Write DefaultはOFFの設定です。
Avatar Parameter Driverが使える事が前提です。
細かい設定方法まで記載しておりません、なにをやったかのメモです。

自分が試した結果なので間違ってる、もっと効率の良い方法があると思います。

こいつ同期意味わかんね\(^o^)/

同期ズレの原因・・・?

ツイッターとかツイッターとかで調べている内に
・Expression Parameterに入れていないパラメータは同期されないことがある。
(EX Parameterに入れたものは後から来た人にも同期される)
Contactはみんなそれぞれで判定が行われちゃってる
(それによってタッチした人しか見えないだったり、
アニメーションのステート移行ラグの差である人はアニメがONに見えてたり、OFFだったりしまう?)
ことが原因?な気がしてそうだったので

Conatctの判定を全てローカル処理にして
アニメを決定するパラメータをExpression Parameterに入れて自分のローカル内で決定したパラメータを周りに同期させて同じにするという方法で同期できました。

ローカル処理を使わないとどうなるかに関しては下記のランダムギミックも参考に載せておきます。

作成したギミック

飛行機をコントロールするタブレット、タッチすることで呼び出し、飛行コースの選択、コースの確認、飛行等の制御ができるものでした。
他人から触っても作動できるようにする為に同期対策が必要でした。

Re-joinしてもらっても同期できていたので大丈夫そうですが
欠点としてなんか反応がにぶいです!!!0.5秒くらいタッチしないとアニメが移行しません。

やったこと

上のContact付き動画を見てもらうと分かるようにVRC Contact Receiverは触ってる間だけTrueになるような動きなので、EX MenuでいうButtonと同じ状態です。
なので、これを触っていなくても維持できるようにToggleに相当する状態に直す必要がありました。

おおまかな流れ

  1. 9つのVRC Contact Receiverのタッチ判定をローカルのInt式に変換(ローカルのButton式に変換する)

  2. Int式をローカルのBool式に変換(ローカルのToggle式に変換)

  3. 2で作ったパラメータを使ってのアニメーションを動かす

  4. 2で作ったパラメータをEX Parameterに登録する。

上記の手順を踏むことで
他人からタッチされた情報を自分の中で維持できるToggle式に直して
グローバルで再生できる・・・・のでは?????
ちなみにContactはQuestアバターでも16個まで使用できるので今回作ったギミックはQuestでも使用できます。
更に、この16個にはデフォルトでついている頭、腰、両手、両足、両指はカウントに含みません!
(ぶいちゃドキュメントのStandard Collidersの事です。)

ただし、Phys Boneと制限と同じく16個を超えてしまうとアバターのアップロードができなくなると思われるので注意が必要です。
Contactの公式ドキュメントも置いておきます。

1:VRC Contact Receiverを作る

ビヘイビア(behavior)を追加からVRC Contact Receiverを追加していきましょう。

7つのボタンと
画面切り替え後の2つのボタンの計9つ
上記のスクショのように系9つのReceiverを作る
各Receiverのパラメータ欄に名前を入れてパラメータを作成する

VRC Contact Senderはデフォルトで付いてる右手の人指し指を使うのでFinger IndexRをCollision Tagに設定。作る必要はありません。
隣り合ったボタンを同時に押して誤作動しないように該当するボタン以外がFlaseじゃないと移行しないようにしています。

2:Receiverに触られたらLocalのInt式に変換する

ここからAvatar Parameter DriverのLocal Onlyの設定をジャンジャン使っていきます。
・any Stateから9つのボタン+デフォルト位置の計10個のステートを伸ばし、それぞれにビヘイビア(behavior)を追加からAvatar Parameter Driverを追加する。

・あらかじめ作っておいたInt式のパラメータをAvatar Parameter Driverに選択して追加、番号を0~9まで割り振る(何もボタン触ってない時が0!)
また、その時にLocal Onlyにチェックを入れるのを忘れずに

Avarar Parameter Driverを使うためのレイヤーなのでアニメは全て空のアニメーションです。

※ またAny Stateを使用しているので全てのステートの自身に遷移(Can Transition to Self)のチェックを外すのを忘れずに!!(2敗)

3:Int式を受けて保持するためのBool式パラメータを作る

今回はAny Stateで常に変動するIntの数字に対応する為に、2つの状況を想定しています。
異なるIntの数字でTrue,Falseを決める場合
同じIntの数字を使ってTrue,Falseを決める場合

・異なるIntの数字でTrue,Falseを決める場合

異なるIntの数字でアニメを切り替える場合
ボタンから手を離すとInt式はデフォルト(0)になってしまう為、このままIntでアニメをコントロールすると、後から来た人には同期できなくなってしまいます。
その為保持し続ける為のBOOL式に切り替えます。

5がタッチされたときはR
1がタッチされたときはL

上記のような判定をした時にアニメーションを動かす為のBOOLパラメータを作成しAvatar Parameter DriverでTrue,Falseを制御するようにします。
Local Onlyでね!

このパラメータがアニメーションを起動する為のパラメータになります!

・同じIntの数字を使ってTrue,Falseを決める方法

同じIntの数字を使う場合も、後から来た人はデフォルトステートのアニメが再生される為、アニメが移行した後に合流するとズレが発生してしまいます。

その為、タッチする度にTrue,Falseを決めるBOOL式パラメータを用意します。

該当するIntの数値を受け取った時に作動するような、作成したBool式のパラメータをON,OFFさせます。ここもLocal Only

これもアニメを動かす為のパラメータになります!

4:Bool式を受けてアニメを動かす


ここまでくればいつものアニメーションです。

3で作ったパラメータがTrueやFalseになった時に
いつものアニメーションを再生します!

5:EX Parameterへの同期

EXに組み込むのは3で作成したBOOL式のパラメータのみになります。
1,2で作成したパラメータは入れる必要はありません。

今回は7つのBoolを登録しました。
EXのメモリが倍の256になってからかなり余裕ができましたね。

実際に上記のパラメータが動いてるのは下のような感じに


おまけ:アニメレイヤーの構成

このタブレットのアニメのFXレイヤーとしては14個ありますが中身は複雑ではない・・・・です(多分)

下記の3つのレイヤー以外はアイテムの出し入れと同じようなON.OFFのステートしか存在しません。

タッチした反応をInt式に直すレイヤー
右旋回、左旋回を判断して飛行機を飛ばすレイヤー
飛行機を呼び出し、帰還させるレイヤー
それ以外のレイヤーは全てこれです。

Write Default OFFの構成

Write DefaultがOFFであることによって
アニメーションで動かしたものが勝手にデフォルト状態に戻らなくなります。(だからアニメの作り直しが大変でもあるのですが・・・)

アバターの表情では表情に関連するシェイプキーを
ほぼ全て(リップシンク系除く)を入れて
それを変更する事で表情が組み合わさらないようにします



今回はこれを意図的に抜いて組み合わせる事を前提に組んでいます。

このタブレットはおおまかに

  1. Left Turn,Right Turnのリング表示

  2. STBY、GOのリング表示

  3. Cource Checkのリング表示

  4. 画面テクスチャの切り替え、Contact Receiverの切り替え、サブ画面で表示しないリングの削除

  5. 飛行機呼び出し、帰還時のリング表示

  6. EMER表示(全部のリング、Contactの切り替え)

という構成になっています。
さらにアニメレイヤーは上から順番に再生していき、同じオブジェクトがそれぞれのアニメにあった場合、下にあるアニメレイヤーの情報が優先されるルールがあります。
その為、上のレイヤーで指示したものを下のレイヤーが作動する事で上書きすることができます。

下のレイヤーで指示していないオブジェクトは上のレイヤーの指示がまだ残っていれば、それが再生されます。
OFFのアニメーションに何もキーが入っていないEmptyのアニメーションをわざわざ入れる理由は恐らくここです。(自信なくなってきた)
例えばタブレットのレイヤーの上書きに関しては下のような挙動をしていきます。

1と5のリングをON,OFFしている
テクスチャが変わる
1~6のContactを使わなくなる
1~6のリングをOFFにする。ここで上のレイヤーの1,5のリングの表示状態は上書きされ
OFFになる。
1,4,5のリングの状態をコントロールする
このレイヤーで1,4,5のリングだけは上書きされ
3,6のリングは2つ目のレイヤーのOFF状態が維持されたままになる。
1~6のリングの表示切替
Contactの表示の切り替え
一番下のレイヤーになるので1,4,5のリングを含む全てのリングが上書きされ
2つ目のレイヤーで設定したContactの状態も全て上書きされる。

上記のようなWhite Defaultの仕様とアニメレイヤーの優先順位を利用する為、レイヤーの並ぶ順番が大事になってきます。
White Default OFFの表情アニメーションでデフォルトの顔のレイヤーは
一番上に置け!!っていうのも同じ理由です。

最後に:これ分からん

本当はContactのProximityを使用して画面をスライドさせたかったのですが下のような症状が直らず断念しました。
オープンベータで実施していたのも原因かもしれませんがどうすれば直りますかこれ・・・・


いいなと思ったら応援しよう!