見出し画像

【VRChat】ワールド固定や左右の持ち替えをModularAvatarだけで設定する方法

最近、色々調べていたらModular Avatarだけでアイテムのワールド固定や左右の持ち替えをできる方法を知ったので忘れないように手順をまとめておきます

今まではアイテムごとにAnimator ControllerやAnimation Clipを作ってて非常に面倒だったんですが、この方法だと一度作ってPrefab化すると使いまわしもできるので非常に楽になりました

考え方としてはアイテムをワールド固定にしておいて、コンストレイントで右手や左手などの持たせたい位置に移動させる感じです

こんな感じのメニューが出来上がります
構造はこんな感じ






せっかちさんへ

データ配布することにしたので一番下までスクロールしてください



下準備

階層構造の下準備

アバターとGestureManagerが入ったSceneを用意します。
アバターの直下にEmptyを9個作成してこのような形にします

Transform_Hand_RとTransform_Hand_Lはそれぞれ右手と左手の位置
(最終的に調整するのでなんとなくでいいです)

#Editor_Item 2個、Constraint_Hand_R、Constraint_Hand_Lの4個はそれぞれの親と同じ位置。

ItemSetup、ModelRoot、Menuの3つはワールド原点です


アイテムモデルの配置

使いたいアイテムのモデルをModelRootの下に放り込みます。
ModelRootと同じ原点に位置を合わせておきます

たけのこ派です


メニューの下準備

ItemSetupにMA Menu GroupとMA Menu Installerをくっつけて、
MA Menu Groupに↓の設定をします

  1. 「引用元オブジェクト」に先程作ったMenuオブジェクトを放り込む

  2. 「メニューアイテムを追加」をクリック

  3. 「表示名」にメニューに表示するアイテム名を入れる(ここではItemにしてあります)

  4. 「タイプ」を「Sub Menu」に変更



アイテムのON/OFFの設定

メニューの追加

  1. 先程の「メニューアイテムの追加」の上にある「▶メニュー内容を表示」をクリック

  2. 新たに出てきた「トグルを追加」をクリック

Itemオブジェクトの子にコンポーネントが追加されたNew Toggleというオブジェクトが作られて選択されるので

  1. MA Menu Itemの「表示名」を「ON」などに変更

  2. MA Object Toggleの「List is empty」にModelRootを放り込む

  3. 「条件を反転にチェック」を入れる

実行してGesture ManagerでメニューのONを選ぶとアイテムが表示されるようになっているはずです

MA Object ToggleはMA Menu Itemで設定した項目がラジアルメニューで有効になっているときに指定したオブジェクトの表示非表示を指定できます。

通常だとModelRootが「OFF」になっているので非表示になるのですが、条件を反転させて有効時に表示を、無効時に非表示になるようにしています。



左右の持ち替えの設定

追従設定

Transform_Hand_RとTransform_Hand_LにそれぞれMA Bone Proxyをくっつけて「配置モード」を「子として・ワールド位置と向きを維持」に変更

詳細設定の「Bone reference」を以下に変更
Transform_Hand_Rは「Right Hand」
Transform_Hand_Lは「Left Hand」

「ターゲット」ではなく「Bone reference」を設定したのは、Prefabにして他のアバターに放り込んだときに、そのアバターの右手と左手のボーン名が今のアバターと違っていても自動的に「ターゲット」を設定してくれるためです。
実際にターゲットが自動で設定されていると思います


コンストレイントの設定

次にコンストレイントの設定をします
Constraint_Hand_RとConstraint_Hand_Lにそれぞれ「VRC Parent Constraint」コンポーネントを追加します
必ず「VRC」がついている方のコンストレイントを追加してください。

  1. 「Sources」のList is Emptyにそれぞれ以下のオブジェクトを放り込む

    1. Constraint_Hand_RはTransform_Hand_Rオブジェクト

    2. Constraint_Hand_LはTransform_Hand_Lオブジェクト

  2. Advanced Settingsの「Target Transform」にModelRootオブジェクトを指定

  3. Constraint Settingsの値がすべて0になっているのを確認して「Lock」にチェックを入れる

  4. 「Is Active」にチェックを入れる

頭に「VRC」がついているコンストレイントコンポーネントには「Target Transform」という項目が拡張されています。
元々のコンストレイントはコンポーネントがくっついているオブジェクトをコンストレイント制御する事しかできないのですが、「Target Transform」にオブジェクトを指定すると指定したオブジェクトをコンストレイント制御するようになります。
その機能を利用してコンポーネントをつけたオブジェクトの有効/無効を切り替えることで、コンストレイントの有効/無効を切り替えようとしています

メニューの追加

まずは右手から。
Itemオブジェクトを選んで「トグルを追加」をクリック
オブジェクトが作られるので

  1. MA Menu Itemの「表示名」を「R Hand」などに変更

  2. 「パラメータ値」の「自動」のチェックボックスを外して「0」に設定

  3. 「パラメータ名」に「ItemPosition」と入力

  4. 「初期設定にする」にチェックを入れる

  5.  MA Object Toggleの「List is empty」にConstraint_Hand_Rを放り込む

  6. 「条件を反転にチェック」を入れる

次に左手。
Itemオブジェクトを選んで「トグルを追加」をクリック
新たに作られたオブジェクトを選んで

  1. MA Menu Itemの「表示名」を「L Hand」などに変更

  2. 「パラメータ値」の「自動」のチェックボックスを外して「1」に設定

  3. 「パラメータ名」に「ItemPosition」と入力

  4.  MA Object Toggleの「List is empty」にConstraint_Hand_Lを放り込む

  5. 「条件を反転にチェック」を入れる

実行してGesture Managerで確認すると右手と左手でアイテムの切り替えができるようになっているはずです。

メニューでどれか一つだけ有効にしたい場合に「パラメーター名」と「パラメーター値」を使用します。
同一の「パラメーター名」を持つメニュー項目はどれか一つしか有効化できなくなります。

「パラメータ値」は項目の内部IDを指定しているので必ず被らないようにしましょう。
またすべての項目を無効化しようとしたときに強制的に「0」が指定されている項目が有効化されるようになります。
そのため必ず「0」は指定しておいてください。

また起動時には「初期設定にする」が設定されている項目が有効化されます



ワールド固定の設定

アイテムをワールド固定化する

ModelRootに「MA World Fixed Object」コンポーネントをくっつけます。


メニューの追加

Itemオブジェクトを選んで「トグルを追加」をクリック

  1. MA Menu Itemの「表示名」を「World Fix」などに変更

  2. 「パラメータ値」の「自動」のチェックボックスを外して「2」に設定

  3. 「パラメータ名」に「ItemPosition」と入力

  4.  MA Object Toggleの「List is empty」にConstraint_Hand_RとConstraint_Hand_Lを放り込む

実行してGesture ManagerでWorld Fixを指定するとワールド固定されるようになっているはずです

ModelRootにMA World Fixed Objectを追加したことにより、何もしないとワールドに固定されるようになりました。
しかしすでにModelRootは右手と左手にコンストレイント制御されています。
そこでメニューでコンストレイントをすべて無効にすることでワールドに固定されるようにしました



アイテムの位置調整をしやすくする

位置調整用のモデルを配置

機能的には完成しているのですが、MA Object Toggleの影響でアイテムが非表示になっていて位置調整がしづらいのでその対応をします

#Editor_Itemオブジェクトを2つどちらとも「Tag」を「EditorOnly」に変更

一番上にあります

#Editor_Itemの直下にそれぞれアイテムモデルを放り込みます。
それぞれ #Editor_Itemと位置を合わせます

こんな感じになるはず

「Tag」に「EditorOnly」を指定されたオブジェクトは実行やビルドをする際に階層ごと削除されます。
そのため今回のようにSceneを編集している時だけ表示しておきたいオブジェクトに指定すると便利に使えます


アイテムの位置調整をする

アイテムの位置がわかるようになったので、Transform_Hand_RとTransform_Hand_Lを移動、回転させてアイテムの位置調整をします

今回は手のひらに乗せる感じで



完成!

以上で完成です。
おつかれさまでした

もし、便利だなって思ったらお友達に教えてあげてください。
これよりさらにシンプルかつわかりやすい方法があるぞ!って人は教えて下さい!!
VRCへの集合知よろしくお願いします



おまけ:Prefab化して使い回せるようにする

なんだかんだで結構めんどくさかったかと思います。
冒頭に書いた通りPrefab化することで使い回せるようになるのでその手順です

Prefab化する

アイテムモデルを3つとも削除します。

この3つ

ItemSetupオブジェクトをProjectにドラッグ&ドロップします。
これでPreafb化されました。

Scene上のデータはアバターの直下にPrefabを放り込んだ直後と同じ状態になっているので下記の方法で設定します


Prefabの使い方

別のアバターで使う時の方法です

  1. アバターの直下に「ItemSetup」Prefabを放り込む

  2. ModelRootと#Editor_Item 2つの直下に各々アイテムモデルを放り込む

  3. アイテムモデルの位置が親オブジェクトと同じになっているか確認

最初に貼ったこの状態になっていたらOKです。
以上です!



その他

説明で作ったデータを無料配布します
おまけで↑で作ったPrefabも入れてあります


説明に使用したアバター


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