VRChat Constraintコンポーネントによる武器の収納/所持切り替え・両手持ち方法
はじめまして。Helio_ICNMY(ヘリオ・一之宮)といいます。
VRソーシャルゲーム「VRChat」でアバターに武器を持たせて遊んでいる者です。
今回は、Unity 2018で利用できるコンポーネント「parent constraint」と「aim constraint」を利用し、一つの武器モデルを背負い/所持位置に移動させるシステム、および武器の両手持ちシステムを作成したので備忘録代わりにnoteを執筆しました。
初めてのnote執筆なので至らない点もあると思いますがご了承ください。
〇更新履歴
2020/04/18 初版
2020/04/19 内容追加:4.2/片刃武器用のaim consetaint設定
2020/05/20 内容追加:Unityの表示系の設定について
内容追加:Aim constraintをIs activeしてもオブジェクトが動かない時
誤字修正
〇両手持ちって具体的にどういうこと?
以下のリンクをご覧ください。
動画の0:13あたりで、鎌の柄が両方の手に追従して動いているのがわかるでしょうか。このように、まるで両方の手でつかんでいるかのように1本の道具を動かすことができるようになります。
〇両手持ちすることのメリットは?
今度は次のツイートをご覧ください。
従来の片手持ち状態だと片手だけで武器の向き・位置を調整しないといけないので、どうしても無理な体勢になったりもう片方の手が離れたりします。しかし、両手持ちシステムを入れることで楽に、自然なポーズをとることができます。
*ここからは、以下の作業についての知識を持っているという前提説明します。
〇どうやって収納/所持切り替え・両手持ちをするの?
それでは、本編に入ります。
設定はすべてUnityで行います。
今回の説明では下図右のアバターに左の棒を装備させる、という想定で説明します。
1. 武器の持ち方を決める。
「持ち方ってなんだよ両手に決まってるだろ」と思われるかもしれませんが、今回説明する両手持ちシステムでは右手と左手で武器の追従のしかたが異なるため、unityでいじる前に事前に決めておく必要があります。具体的に追従の仕方がどう違うのか、例として本稿の最初に乗せた動画を使用すると・・・。
一言でいうと、「右手は添えるだけ」「左手はしっかり柄を握っている」という違いがあります。
よって、自分の使用する武器について、左右どちらの手で持ち、どちらの手を添えるのかをあらかじめ決めておかなければいけません。
また、しっかり握る方の手で「武器のどこを握るのか」を決める必要もあります。この、武器の握る場所のことを、本稿では「武器の中心点」と呼ぶことにします。
まとめると、ここで決めるのは以下の項目です。
今回の説明では右手を添える手、左手を握る手とします。
2. 武器の中心点を設定する。
持ち方が決まったところで、実際に武器モデルへ武器の中心点を設定します。
ーーーーーーーーーーーーーーーーーーーー
5/20追記:Unityの表示系の設定について
武器の中心点を設定する際、Unityの座標表示系をいじる必要があります。
といっても、難しいことではありません。
上の図で赤く囲ったところが[Pivot]となっていることを確認してください。
もし[center]となっていたならば、クリックすることで[Pivot]に変更することができます。
ここが[center]のままだと、武器の中心点座標をうまく決めることができません。
ー追記終わり
ーーーーーーーーーーーーーーーーーーーー
それでは、中心点の設定に移ります。
まず、ヒエラルキーの中に空のgame object(上図:bou pivot)を作成します。このオブジェクトの位置が、武器の中心点となるように設定します。ここからの説明では上記game objectをそのままbou pivotと呼びます。
続いて、作成したbou pivotを先ほど設定した武器の中心点へ移動させます。
その後、武器モデルをbou pivotの子に入れます。これで武器の中心点がbou pivotの位置になりました。
3. 武器を収納/所持する位置を調整する。
続いて、実際にアバターが武器を持つ場所を調整します。今回は以下のように武器をアバターに持たせます。
まず、右手の設定をします。
武器モデルを入れたgame objectを移動させ、右手の持つ位置に合わせます。この時、子の武器モデルだけを移動・回転させて動かさないようにしましょう。せっかく調整した武器の中心点がずれてしまいます。
続いて右手のボーンの子に武器の中心点ごとモデルを移動させます。通常の武器モデル設定と同様です。
右手のボーンの子に2つ、空のgame objectを作成します。用途を区別するために「bou right grip」と「bou right aim」と名付けます。
続いて、bou right grip オブジェクトをbou pivotの子に入れます。
bou right gripのtransformを上図のように設定し、bou right gripとbou pivotの位置を一致させます。
位置調整が終わったらbou right gripをbou pivotの外(右手首ボーンの子)に戻します。これで右手片手持ち時の位置を調整できました。
続いて、bou right aimを右手の掌のあたりに移動させます。両手持ちをさせたときに武器の柄が通る位置になるので、アバターごとに調整してください。
以上で右手の設定は完了です。
続いて左手の設定をします。
右手の時と同様、bou pivotを左手首ボーンの子に入れ、武器の位置を調整します。このとき、bou pivot(武器の中心点)と左手の位置を揃えるようにします。
そして、右手首の時と同様に左手首ボーンの子に空のgame objectを作成します。今回は握る位置の設定のみ必要なのでbou left gripの1つのみです。
以降、右手のbou right gripの時と同様に位置調整をします。
最後に腰(今回はspineボーン)のボーンでも同様にgame objectを入れ、武器モデルの位置調整を行います。
以上で、武器の位置調整は完了です。
4. Constraintコンポーネントを導入する。
ここからが鬼門のConstraintとの戦争です。
以下の作業では、順番を間違えるとうまく動かないことがあります。
そのため、自分の手でいじりながら動作確認をしてください。
まず、bou pivotごと武器モデルをアバター直下(Armatureと同じ階層)に移動させます。
続いて、bou pivotに二つのコンポーネント「Parent Constraint」と 「Aim Constraint」を導入します。ここからはこの2つのコンポーネントをいじっていきます。
4.1 Parent constraintによる武器の持ち替え設定
まず、Parent Constraintをいじり、武器の持ち替え設定をします。
Parent Constraintの下段にある+ボタンを押し、sourcesの段を増やします。この段数が持ち替える位置の数になります。
増やしたsourcesの中に、先程までに作成したgripオブジェクトを入れます。
続いて、sourcesの右側にある数値をすべて0にしコンポーネント内上段にある「Zero」を押します。
武器が変なところに移動しますが気にする必要はありません。
コンポーネント上段のIs activeにチェックがついていることを確認してください。
これで、位置調整の設定は完了です。
以下、sourcesの右側の数値を0,1で変化させて、武器の位置が変化することを確認してください。
・spine gripの数値を1にしたとき:腰追従
・right gripの数値を1にしたとき:右手追従
・left gripの数値を1にしたとき:左手追従
4.2 Aim constraint による両手持ち設定
続いて、Aim constraintをいじり両手持ちの設定をします。
事前にParent constraitの値をいじり、左手持ち状態にさせてください。
まず、Aim constraint内のsourcesの段を1つにします。
続いて、bou right aimをsource内に入れ、右の数値を0にします。
続いて、Aim constrait上段の「Activate」を押します(parent constraintの時とは違う!)
上手のように武器アバターがright aim の方を向いたら成功です。
*失敗例
武器があらぬ方向を向いてしまいました。
原因としては以下が考えられます。
上記を試してみてください。
ーーーーーーーーーーーーーーーーーーーー
5/20 追記:Aim constraintをIs activeしてもオブジェクトが動かない時
私のUnity環境で起きたことなのですが、一度Unityを再生状態(上部中央の再生マークが押された状態)を挟むとAim constraintが働かなくなることがあります。すなわち、(アバターをアップロードする時も再生状態になるため)アバターをそのまま更新し直すとAim constraintが働かないままアップロードしてしまいます。
対処法としては、Aim constraintを一度削除してからもう一度Add componentすることで復活します。
・・・ただ、新たに設定しなおすのは面倒ですよね。
そこで、Copy componentを使って一度設定したAim constraintを削除→即addすることで手間を省くことができます。
やり方としては、
1.Aim constraintコンポーネントの右上にある歯車マークをクリックし、プルダウンメニューからCopy Componentを選ぶ。
2. もう一度歯車マークをクリックし、今度はRemove Componentを選ぶ。
(これでAim constraintが一覧から削除されます。)
3. 別のコンポーネント(隣のParent Componentや最上段のTransformなどなど…)の歯車マークをクリックし、Paste Component As Newを選ぶ。
これで、先ほど設定したaim constraintが復活します。
もしこれを行った後にaim constraintをIs Activeにしても動かなかった場合は、他に設定ミスがないか確認してください(正直これ以上は私の経験外なので、よいアドバイスが思いつきません・・・)ー追記終わり
ーーーーーーーーーーーーーーーーーーーー
4/19 追記:片刃武器用のaim constraint設定
Aim constraint/Constraint setting/Freeze Rotation Axesのチェックボックスをいじることで、武器の回転方向の追従設定を変えることができます。
これにより、片刃武器の刃方向だけ左手に追従させたまま柄を右手に追従させる、なんてことも可能になります。
(武器モデルと武器の中心点用game objectの向き関係によってはうまくいかないことがあります。この場合、2. 武器の中心点を設定する。から調整する必要があります。)
上図のように、中心点用のgame objectのrotationを0/0/0にしたときに武器の柄がz軸正方向に伸びていることが条件と思われます。自分で設定する際に調整してみてください。ー追記終わり
ーーーーーーーーーーーーーーーーーーーー
5. アニメーションの設定をする。
最後に、ハンドアニメーションを設定します。
従来のアニメーションづくり同様、アバターを複製してアニメーションづくり用のアバターを用意します。
この時、parent constraint/sourcesの値をいじり、腰追従にしてください。
2つのアニメーション(右手で片手持ち/両手持ち)を作成し、アニメーション用のアバターに導入します。
・片手持ちアニメーション
アニメーション編集で赤丸を押し、Parent Constrait/sourcesの値を以下のようにいじります。
通常のアニメーション設定と同様に1フレーム目にも同じ値を入れてください。
・両手持ちアニメーション
片手持ちの時と同様、赤丸を押してParent Constrait/sourcesの値をいじります。
その後、Add propertyを押しbou pivot/aim constraintをIs activeにするアニメーションを追加します。
最後に、今回作成した2つのアニメーションをハンドサイン内に仕込んで完成です。
アバターをアップロードし、VRChat内で確認しましょう。
武器の持つ位置がおかしかった場合は、spine grip/left grip/right gripの位置を調整してください。
〇終わりに
以上で解説を終了します。
今回のシステムを利用することで、長物やアサルトライフルの両手持ちを行うことができます。
もし質問等ございましたら、以下のtwitterへリプ・DMで連絡をお願いします。
ID:Helio_ICNMY
それでは、よきVRChat生活を!
〇参考文献
この記事が気に入ったらサポートをしてみませんか?