[VRChat] ExMenuで着せ替えする場合に読み込み中に一瞬全てのパラメータに0が代入され裸になる問題への対処案メモ
七草くりむです。
夜中に着せ替えシステムで何故か読み込み時に一瞬裸になってしまう問題について奈良阪さんと話していたら「どうやら最初に ( あるいはアバターを変更した本人が読み込みしている最中に他の人が先に読み込んだ場合に ) 全てのFXパラメータに対して0が代入されるらしい ( 結果として裸になる瞬間ができてしまうのではないか ) 」ということを知り、「じゃあパラメータが0の時ダミーの服を着せるようなレイヤーを作っておいて、解錠してSavedしとけば最初に解錠しちゃえば問題ないんじゃないですか?」と思い、奈良阪さんから「なんならDefault値を1にしとけば勝手に解錠されるじゃん」ということで裸にならない着せ替えシステムができるんじゃないかという話のメモです ( Unity2019.4.31f1 / VRCSDK3-AVATAR-2022.05.25.23.02_Public ) 。
1. アニメーションを作る
Hierarchyウィンドウでアバターオブジェクトをルートごと複製 ( 例えば「Avatar(1)」 ) し、Projectウィンドウで任意の場所に新しいAnimationファイルを作る。このAnimationを例えば「Lock_on」と名付け、複製したAvatar(1)にD&Dする。Animationウィンドウに移動し、Avatar(1)を選択してAdd Propertyからダミーとして着せる服のオブジェクトのis Activeを追加し、0:00と0:01の2フレームのみのキーを作り、Trueあるいは1に設定する ( Animationを作ったら複製したAvatar(1)は削除しても大丈夫です ) 。
次にLock_onを複製して「Lock_off」を作り、Falseあるいは0に設定する。
2. パラメータを作る
ProjectウィンドウでDefaultExpressionParameters ( Assets>VRCSDK>Examples3>Expressions Menuにあります ) を複製し、任意の場所に任意の名前のパラメータファイルを作る ( 既にパラメータファイルがある場合はそれを用いる ) 。そこに「Lock」 ( 名前は任意のものでOK ) という例えばbool型のパラメータをつくり、DefaultとSavedにチェックを付ける。そしてできたパラメータファイルをInspectorウィンドウにてアバターオブジェクトのrootオブジェクトのVRC Avatar DescriptorコンポーネントのExpressions>Parametersにアタッチする。
3. FX Animatorの設定
アバターのFXなんちゃらという名前のAnimatorファイルをProjectウィンドウから選択し ( 大体の場合アバターのrootオブジェクトのVRC Avatar DescriptorコンポーネントのPlayable Layers>Base>FXにアタッチされています ) 、AnimatorウィンドウのParameterタブに「Lock」というBool型のパラメータを作り ( ここのパラメータ名は必ず2.で名付けたものと同じものにする ) 、Layerタブで「Lock System」などといった任意の名前をつけたレイヤーを作り、例えば図1のように繋ぐ( それぞれのノードの名前は何でも構いません ) 。また、Layerの横の歯車からWeightを1とする。
この時TransitionについてはLock→openについてはパラメータ「Lock」がTrueである時、open→Lockについてはパラメータ「Lock」がFalseである時といった条件を設定する。また、ノード「Lock」のMotionにはアニメーション「Lock_on」を、ノード「open」のMotionにはアニメーション「Lock_off」をアタッチする ( Write Defaultについては全てのレイヤーの全てのノードで揃えた方がよいと聞くことが多い ) 。
4. Expressions Menuの設定 (Optional)
( ※ここからの部分については必ずしも設定を要するものではありません )
ProjectウィンドウでDefaultExpressionsMenu ( Assets>VRCSDK>Examples3>Expressions Menuにあります ) を複製し、任意の場所に任意の名前のExメニューファイルを2つ作る ( 既にExメニューファイルがある場合はそれを用いる ) 。今回は片方を「(アバター名)_ExMenu」、もう片方を「(アバター名)_LockMenu」とする。
そしてできたExメニューファイルのうち「(アバター名)_ExMenu」をInspectorウィンドウにてアバターオブジェクトのrootオブジェクトのVRC Avatar DescriptorコンポーネントのExpressions>Menuにアタッチする。
Projectウィンドウで複製して作ったExメニューファイルを選択し、InspectorウィンドウからAdd Controlを押し、メニューを増やす。名前は任意でよいが例えば「Lock Menu」とする。今回は誤爆防止のためにType項をSub Menuとし、出てきた一番下のSub Menuの項に「(アバター名)_LockMenu」をアタッチする ( Parameterは[None]でよい ) 。
最後に、Projectウィンドウから「(アバター名)_LockMenu」を選択し、InspectorウィンドウにてAdd Controlを押し、メニューを増やす。名前は任意でよいが「Lock」とする。Type項をToggleに設定、ParameterをプルダウンからLock,Bool ( 2.で設定したパラメータと同じ名前のもの ) に設定する ( プルダウンの右側のテキスト欄はプルダウンを設定すると自動的に設定される )。
このように設定することで一瞬全ての値が0となってもダミーの服を着た状態となり、その後についてはLockのDefault値が1であることでダミーの服は自動的に脱がされ、本来着せたかった服が着せられている状態となると考えられる。デメリットとしてはパラメータを1bit埋めてしまうという点があるものの、最近はパラメータが128bitから256bitになったのもあり1bit埋める程度なら大した問題ではないはず……!
( 2022.6.5更新 : 奈良阪さんからのリプライを受けて実際に確認したところ、4.について必ずしも設定が必要ではないことが判明しましたので追記しました。 )