【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に↓の設定をします
「引用元オブジェクト」に先程作ったMenuオブジェクトを放り込む
「メニューアイテムを追加」をクリック
「表示名」にメニューに表示するアイテム名を入れる(ここではItemにしてあります)
「タイプ」を「Sub Menu」に変更
アイテムのON/OFFの設定
メニューの追加
先程の「メニューアイテムの追加」の上にある「▶メニュー内容を表示」をクリック
新たに出てきた「トグルを追加」をクリック
Itemオブジェクトの子にコンポーネントが追加されたNew Toggleというオブジェクトが作られて選択されるので
MA Menu Itemの「表示名」を「ON」などに変更
MA Object Toggleの「List is empty」にModelRootを放り込む
「条件を反転にチェック」を入れる
実行してGesture ManagerでメニューのONを選ぶとアイテムが表示されるようになっているはずです
左右の持ち替えの設定
追従設定
Transform_Hand_RとTransform_Hand_LにそれぞれMA Bone Proxyをくっつけて「配置モード」を「子として・ワールド位置と向きを維持」に変更
詳細設定の「Bone reference」を以下に変更
Transform_Hand_Rは「Right Hand」
Transform_Hand_Lは「Left Hand」
コンストレイントの設定
次にコンストレイントの設定をします
Constraint_Hand_RとConstraint_Hand_Lにそれぞれ「VRC Parent Constraint」コンポーネントを追加します
必ず「VRC」がついている方のコンストレイントを追加してください。
「Sources」のList is Emptyにそれぞれ以下のオブジェクトを放り込む
Constraint_Hand_RはTransform_Hand_Rオブジェクト
Constraint_Hand_LはTransform_Hand_Lオブジェクト
Advanced Settingsの「Target Transform」にModelRootオブジェクトを指定
Constraint Settingsの値がすべて0になっているのを確認して「Lock」にチェックを入れる
「Is Active」にチェックを入れる
メニューの追加
まずは右手から。
Itemオブジェクトを選んで「トグルを追加」をクリック
オブジェクトが作られるので
MA Menu Itemの「表示名」を「R Hand」などに変更
「パラメータ値」の「自動」のチェックボックスを外して「0」に設定
「パラメータ名」に「ItemPosition」と入力
「初期設定にする」にチェックを入れる
MA Object Toggleの「List is empty」にConstraint_Hand_Rを放り込む
「条件を反転にチェック」を入れる
次に左手。
Itemオブジェクトを選んで「トグルを追加」をクリック
新たに作られたオブジェクトを選んで
MA Menu Itemの「表示名」を「L Hand」などに変更
「パラメータ値」の「自動」のチェックボックスを外して「1」に設定
「パラメータ名」に「ItemPosition」と入力
MA Object Toggleの「List is empty」にConstraint_Hand_Lを放り込む
「条件を反転にチェック」を入れる
実行してGesture Managerで確認すると右手と左手でアイテムの切り替えができるようになっているはずです。
ワールド固定の設定
アイテムをワールド固定化する
ModelRootに「MA World Fixed Object」コンポーネントをくっつけます。
メニューの追加
Itemオブジェクトを選んで「トグルを追加」をクリック
MA Menu Itemの「表示名」を「World Fix」などに変更
「パラメータ値」の「自動」のチェックボックスを外して「2」に設定
「パラメータ名」に「ItemPosition」と入力
MA Object Toggleの「List is empty」にConstraint_Hand_RとConstraint_Hand_Lを放り込む
実行してGesture ManagerでWorld Fixを指定するとワールド固定されるようになっているはずです
アイテムの位置調整をしやすくする
位置調整用のモデルを配置
機能的には完成しているのですが、MA Object Toggleの影響でアイテムが非表示になっていて位置調整がしづらいのでその対応をします
#Editor_Itemオブジェクトを2つどちらとも「Tag」を「EditorOnly」に変更
#Editor_Itemの直下にそれぞれアイテムモデルを放り込みます。
それぞれ #Editor_Itemと位置を合わせます
アイテムの位置調整をする
アイテムの位置がわかるようになったので、Transform_Hand_RとTransform_Hand_Lを移動、回転させてアイテムの位置調整をします
完成!
以上で完成です。
おつかれさまでした
もし、便利だなって思ったらお友達に教えてあげてください。
これよりさらにシンプルかつわかりやすい方法があるぞ!って人は教えて下さい!!
VRCへの集合知よろしくお願いします
おまけ:Prefab化して使い回せるようにする
なんだかんだで結構めんどくさかったかと思います。
冒頭に書いた通りPrefab化することで使い回せるようになるのでその手順です
Prefab化する
アイテムモデルを3つとも削除します。
ItemSetupオブジェクトをProjectにドラッグ&ドロップします。
これでPreafb化されました。
Scene上のデータはアバターの直下にPrefabを放り込んだ直後と同じ状態になっているので下記の方法で設定します
Prefabの使い方
別のアバターで使う時の方法です
アバターの直下に「ItemSetup」Prefabを放り込む
ModelRootと#Editor_Item 2つの直下に各々アイテムモデルを放り込む
アイテムモデルの位置が親オブジェクトと同じになっているか確認
最初に貼ったこの状態になっていたらOKです。
以上です!
その他
説明で作ったデータを無料配布します
おまけで↑で作ったPrefabも入れてあります
説明に使用したアバター