はじめに
今回はVRChatで使える追従するボーンを変えるギミックを作ります。
腰に着けたオプジェクトを手に配置する処理を作ります。


腰に付けた武器を手に持たせたりする際に使えます。
もちろん「手」や「腰」以外のボーンにも追従させれます。
帽子 → 手に持つなども可能。
…あとは人間側のアイデア次第。
下記の3つを前提に進めます。
・UnityやModula avatarが導入済みである程度使える
・Modula AvatarでMenuを自作できる
・Gesture Manager導入済み+使える
↓前提知識はこちらをご覧ください。

これからすることの概要
これからすることは下記。
1:空白オプジェクトを2つ以上配置しモデルの位置、回転、スケール情報を合わせる
→ モデルの位置、回転、スケール情報を空白オプジェクトから参照する
(VRC Parent Constraintを使用)
2:空白オプジェクトをボーン追従させる
(MA Bone Proxyを使用)
3:モデルが参照するオプジェクトをアニメーションで切り替える
(トグルなどのギミック作成)

詳しいことはのちほど解説します。
今は全体の流れだけ把握してください。
VRC Parent Constraintを使えばモデルの位置情報を「空白のオプジェクト」で上書きできます。
これを使うためにまず2つ以上の空白オプジェクトを適切な位置に配置。
そして空白オプジェクトをVRC Parent Constraintに読み込ませます。

次に空白オプジェクトがボーン追従するよう「MA Bone Proxy」あたりを設定します。
モデルの代わりに空白のオプジェクトを使うのがポイント。
これで複数の追従するボーンの情報を1オプジェクトに持たせれます。

あとはトグルなどのボタンを押したら参照先を変えるギミックを作ります。
これは「Weight」の値をアニメーションで記録すれば作れます。

以上がこれからすることの概要です。
この操作を細かく見ていきます。
下準備
ヒエラルキーを右クリック。
3Dオプジェクト → キューブなどの実験用モデルを作成。

適当な位置に配置。

ヒエラルキーを右クリック。
空のオプジェクトを作成。
生成したCube(モデル)を中に入れます。

空白オプジェクトの名前を「Test」などに変更。

さらに空のオプジェクトを2つ作成。

名前を「Set_On」と「Set_Off」などに設定。

「Set_On」の位置・回転・スケールを任意の位置に配置。
ここではキャラクターモデルの右手位置に配置。
座標系を「ローカル」にし回転なども調整。

「Set_Off」も同様の手順で任意の場所に配置します。
ここでは腰の位置に配置。


武器系のギミックを想定して腰 → 手に配置しました。
以上で下準備が完了です。
VRC Parent Constraintの設定
ヒエラルキーを右クリック。
空のオプジェクトを生成。

生成した空のオプジェクトに「VRC Parent Constraint」を追加。

Sourcesを開き「+」を2回押します。

ここに先ほど生成した参照先空のオプジェクトを入れます。
順番は適当でOK。

Advanced Settingsを開きます。
Target Transformに追従先を変更したい3Dモデルを読み込み。

Is Activeを有効化。
全体のWeightが1かを確認。

次はVRC Parent Constraintの動かし方を見ていきます。
Weightを操作したときの挙動
どちらかのWeightが「0」の場合。
もう一方のWeightを0.001以上にすると指定した空オプジェクトの位置にモデルが移動します。
ここでは「Set_Off」を0にし「Set_On」の方を1に設定
→ 手の位置に移動しました。


Transformの値が上書きされたと思ってください。
(位置、回転、スケールが空のオプジェクトに上書きされました)
ただデータ的には「1」にした方が扱いやすく綺麗です。
片方を「0」もう片方を「1」にして参照位置を決めるようにしてください。

次は動作確認のため反対の操作を行います。
「Set_On」の0にし「Set_Off」を1に設定。
→ 腰の位置に移動しました。

次は「Set_Off」と「Set_On」を両方とも0.5に設定。
すると2つの空白オプジェクトの “中間地点” に移動します。

↓こちらの位置です。


この0.5の値が取れることで2つの空白オプジェクト間の移動を滑らかに行えます。
以上がWeightを操作したときの挙動です。
MAで空白オプジェクトをボーン追従させる
生成した空白オプジェクトはボーンに追従してません。
手を動かすと位置が変わります。

そこで「Set_On」と「Set_Off」をボーン追従するようにします。
Modular Avatarが入ってるならMA Bone Proxyを使えば実装できます。
まず、Set_Offを選択 → MA Bone Proxyを追加。

ターゲットとしてHipsボーンを読み込み。

設定の際は詳細設定を開く → Bone referenceからボーンを選ぶと操作が楽です。


ヒエラルキーでボーンを開く。
→ 追従したいボーンをターゲットにドラッグ&ドロップでもOK。
これで「Set_Off」の空白オプジェクトが腰ボーンに追従します。

次は「Set_On」にMA Bone Proxyを追加。

ターゲットを「Hand.R」に設定。(右手)

これで右手のボーンに空白オプジェクトが追従します。

以上でボーン追従の設定自体は完了です。
次はUnityでの動作確認方を見ていきます。
Unity上で動作確認するときの注意点
Modula Avatarを使用した場合、通常時だとボーンを動かしても何も起こりません。
↓MA Bone Proxyを正しく設定してますがこの挙動になります。


動かし終わったらCtrl+Zキーでボーンの形を戻してください。
動作確認の際は「▶ Play Mode」を有効化。
するとModula Avatarの回路が動作しボーン追従処理が正しく入ります。
この状態でボーンを操作すると追従が正しく動きます。

以上がUnity上で動作確認するときの注意点です。
ギミックの作成
VRC Parent Constraintの動作情報はアニメーションとして記録可能です。
これを記録し正しい条件分岐設定を行うとギミック生成ができます。

ここでは「トグル」を押したら追従先を変えるギミックを作例として作ります。

MAの設定
ヒエラルキーを右クリック。
Test階層内に2つの空白オプジェクトを生成。
名前を「ExpMenu」と「トグル」設定。
トグルをExpMenuの中に入れます。

「トグル」を選択。
MA Menu Itemを追加。
タイプをトグル、パラメーター名を「TestOBJ」などの適当なモノに設定。

同じく「トグル(空白オプジェクト)」にMA Menu Installerを追加。

これで既存アバターのメニューに干渉して「トグルボタン」を生成できます。

次はExpMenuを選択。
MA Parametersを追加。
「+」ボタンでパラメーターを追加。
名前を「TestOBJ」にし、データ型を「Bool」に設定。


MA Menu ItemとMA Parametersで設定したパラメーター名は完全に一致させてください。
名前の一致でデータが連動するようになります。
次にモデルが入ってる階層より上に作った空白オプジェクトを選択。(Test)
ここにMA Merge Animatorを追加。

プロジェクトを右クリック。
作成 → アニメーションコントローラーを作成。


右にあるtestという立方体モデルは気にしないでください。
(別記事から画像を使いまわした結果、増えただけです)
名前を「Test_AniCon」あたりに設定。
統合されるアニメーターにドラッグ&ドロップ。

これでMAで作ったボタンでアニメーションコントローラーを操作できるようになります。
アニコンの設定
アニメーションコントローラーをダブルクリック。

アニメーターを表示。
グラフの所で右クリック。
ステートの作成 → 空を2回繰り返して2つのステートを作ります。

次にパラメーターを開き+ボタンで「Bool」パラメーターを追加。
名前をMA Parametersと完全に一致する「TestOBJ」に設定。

レイヤーに戻りレイヤー名を適当なモノに変更します。
名前被りによるエラー対策なので名前は自由に設定して大丈夫です。


なるべくほかの人が作ったギミックの名前と被らないように意識します。
私が配布用のモデルを作る場合は「Sig_OBJ_Move」あたりにすると思います。
ステートを右クリック。
「遷移を作成」を実行。
2つのステートを上下につなぎます。(白い線を2本配線)

New StateからNew State0に向かう “配線” を選択。
Conditionsの「+」を選択。
ここで「TestOBJ / ture」を設定。


この配線にあるConfitionsを設定することで条件分岐を指定できます。
プログラム的な言い方をするならこの配線が「if」文に相当します。
「TestOBJ / ture」でTestOBJがTureなら「New State 0」を実行という処理になります。
あとは終了時間やSettingsを開き切り替わりに関わる時間的な処理を設定します。
ここでは下記のように設定。
・終了時間ありを無効化 → Tureになったら即時に処理が実行
・推移間隔を0.5s → 0.5秒かけてステート移動の処理を行う

推移間隔 (s)は処理を行う時間です。
追従ボーンを切り替える際のモデルの移動時間に関わります。


0.5ぐらい入れておくと滑らか。
次にNew State 0からNew Stateに戻る処理を作ります。
線を選択。
条件分岐をTest OBJがfalse時に設定。
終了時間をなし。
遷移時間を0.5sに設定。

これでトグルボタンがオンで「New State 0」を実行。
トグルボタンがオフで「New State」を実行する処理が作れました。

あとは2つのステートでWrite Defaultsをオフにします。
これはVRChatの必須設定です。

Write Defaultsについて
→ オンだとアニメーション切り替え時に一部のパラメーターが初期化されたりする
→ オフだと切り替え時の初期化が起こらない
→ VRChatではWrite Defaultsは「オフ」が推奨されている
→ オンじゃないとまばたきなどの一部の処理が正しく動かないことがある
以上でアニメーションコントローラーの設定が完了です。
アニメーションデータの作成
プロジェクトを右クリック。
作成 → アニメーションを2つ作成。
名前を「OFF_Anim」と「ON_Anim」に設定。

New Stateの方に「OFF_Anim」を設定。

New State 0の方に「ON_Anim」を設定。

ギミックのトップ階層にアニメーションコントローラーをドラッグ&ドロップ。

MA Merge Animatorと同じ位置にアニメーションコントローラーを入れます。
この状態で初めてアニメーション情報を記録できるようになります。

プロジェクトで「OFF_Anim」をダブルクリック。

アニメーションが表示されます。

ヒエラルキーで「Test」を選択。

赤い丸を押せるようになるのでクリック。
これでアニメーションの記録が開始。

VRC Parent Constraintを設定したからオプジェクトを選択。
「OFF_Anim」は下記のように設定。
・Set_OffのWeightを「1」
・Set_OnのWeightを「0」

これで「Off_Anim」が右手に追従した状態の情報になります。

次は「ON_Anim」を設定します。
プレビューしたの名前の所で切り替え。

VRC Parent Constraintを設定したからオプジェクトを選択。
「ON_Anim」は下記のように設定。
・Set_OffのWeightを「0」
・Set_OnのWeightを「1」

これで「On_Anim」が右手に追従した状態の情報になります。

Gesture Managerを起動して動作確認。

これで追従するボーンを変えるギミックが完成です。
まとめ
今回はVRChat向けの追従するボーンを変えるギミックの作り方を紹介しました。
・VRC Parent Constraintを使うと空オプジェクト位置にモデルの配置を上書きできる
・VRC Parent Constraintは2つ以上の空オプジェクトを読み込める
・参照先の空オプジェクトを変えるギミックを組めば追従するボーンを変えれる
・あとは空オプジェクトがボーンに追従する用MA Bone Proxyを設定
また他にもModula AvatarやVRChatについて解説してます。

ぜひ、こちらをご覧ください。
コメント