見出し画像

VRChat Constraintコンポーネントによる武器の収納/所持切り替え・両手持ち方法

2023/03/24追記
 以外の記事はVRCSDK3実装前の環境に基づいて記載されているため、アニメーションの導入方法が現在のFxレイヤーを利用する環境とは異なっています。

現在、VRCSDK3対応・より安定した両手持ちシステムの導入方法について執筆中です。今しばらくお待ち下さい…。


はじめまして。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でアバターをアップロードする
・アニメーションオーバーライドで武器を表示/非表示できる。

〇どうやって収納/所持切り替え・両手持ちをするの?

それでは、本編に入ります。
設定はすべてUnityで行います。

1. 武器の持ち方を決める。
2. 「武器の中心点」を設定する。
3. 武器を収納/所持する位置を調整する。
4. Constraintコンポーネントを導入する。
 4.1 Parent constraintによる武器の持ち替え設定
 4.2 Aim constraint による両手持ち設定
5. アニメーションの設定をする。

今回の説明では下図右のアバターに左の棒を装備させる、という想定で説明します。

モデル

1. 武器の持ち方を決める。

「持ち方ってなんだよ両手に決まってるだろ」と思われるかもしれませんが、今回説明する両手持ちシステムでは右手と左手で武器の追従のしかたが異なるため、unityでいじる前に事前に決めておく必要があります。具体的に追従の仕方がどう違うのか、例として本稿の最初に乗せた動画を使用すると・・・。

右手:武器の向きは追従しているが、手を柄と平行に伸ばしても武器の位置は動かない。
左手:手と柄がくっついているように、手を動かすと武器の向き・位置が動く

一言でいうと、「右手は添えるだけ」「左手はしっかり柄を握っている」という違いがあります。
よって、自分の使用する武器について、左右どちらの手で持ち、どちらの手を添えるのかをあらかじめ決めておかなければいけません。

また、しっかり握る方の手で「武器のどこを握るのか」を決める必要もあります。この、武器の握る場所のことを、本稿では「武器の中心点」と呼ぶことにします。

まとめると、ここで決めるのは以下の項目です。

・右手、左手の役目:どっちの手で握り、どっちの手を添える?
・武器を支える中心点:武器のどこを握る?

今回の説明では右手を添える手、左手を握る手とします。

2. 武器の中心点を設定する。

持ち方が決まったところで、実際に武器モデルへ武器の中心点を設定します。

ーーーーーーーーーーーーーーーーーーーー

5/20追記:Unityの表示系の設定について

武器の中心点を設定する際、Unityの座標表示系をいじる必要があります。
といっても、難しいことではありません。

画像36

上の図で赤く囲ったところが[Pivot]となっていることを確認してください。
もし[center]となっていたならば、クリックすることで[Pivot]に変更することができます。

ここが[center]のままだと、武器の中心点座標をうまく決めることができません。

ー追記終わり

ーーーーーーーーーーーーーーーーーーーー

それでは、中心点の設定に移ります。

棒pivot 作成

まず、ヒエラルキーの中に空のgame object(上図:bou pivot)を作成します。このオブジェクトの位置が、武器の中心点となるように設定します。ここからの説明では上記game objectをそのままbou pivotと呼びます。

棒pivot 位置調整

続いて、作成したbou pivotを先ほど設定した武器の中心点へ移動させます。

棒pivot 親子逆転

その後、武器モデルをbou pivotの子に入れます。これで武器の中心点がbou pivotの位置になりました。

3. 武器を収納/所持する位置を調整する。

続いて、実際にアバターが武器を持つ場所を調整します。今回は以下のように武器をアバターに持たせます。

・右手で片手持ちさせる
・両手持ち(握る手は左)
・背中に武器を収納する。

まず、右手の設定をします。

右手位置調整

武器モデルを入れたgame objectを移動させ、右手の持つ位置に合わせます。この時、子の武器モデルだけを移動・回転させて動かさないようにしましょう。せっかく調整した武器の中心点がずれてしまいます。

右手首ボーンへin

続いて右手のボーンの子に武器の中心点ごとモデルを移動させます。通常の武器モデル設定と同様です。

右手首ボーン内構造

右手のボーンの子に2つ、空のgame objectを作成します。用途を区別するために「bou right grip」と「bou right aim」と名付けます。

・bou right grip:片手持ちの時の位置決めに使用
・bou rigut aim:両手持ち時にaim constraitで武器を向かせるポイント

右手 grip object調整1

続いて、bou right grip オブジェクトをbou pivotの子に入れます。

右手 grip object調整2

bou right gripのtransformを上図のように設定し、bou right gripとbou pivotの位置を一致させます。

右手 grip object調整3

位置調整が終わったらbou right gripをbou pivotの外(右手首ボーンの子)に戻します。これで右手片手持ち時の位置を調整できました。

右手 aim object調整1

続いて、bou right aimを右手の掌のあたりに移動させます。両手持ちをさせたときに武器の柄が通る位置になるので、アバターごとに調整してください。

以上で右手の設定は完了です。

続いて左手の設定をします。

左手首ボーンへin
左手位置調整

右手の時と同様、bou pivotを左手首ボーンの子に入れ、武器の位置を調整します。このとき、bou pivot(武器の中心点)と左手の位置を揃えるようにします。

左手 grip object調整1

そして、右手首の時と同様に左手首ボーンの子に空のgame objectを作成します。今回は握る位置の設定のみ必要なのでbou left gripの1つのみです。
以降、右手のbou right gripの時と同様に位置調整をします。

腰 grip object調整

最後に腰(今回はspineボーン)のボーンでも同様にgame objectを入れ、武器モデルの位置調整を行います。

以上で、武器の位置調整は完了です。

4. Constraintコンポーネントを導入する。

ここからが鬼門のConstraintとの戦争です。
以下の作業では、順番を間違えるとうまく動かないことがあります。
そのため、自分の手でいじりながら動作確認をしてください。

棒 アバター直下

まず、bou pivotごと武器モデルをアバター直下(Armatureと同じ階層)に移動させます。

棒 コンポーネント入れ

続いて、bou pivotに二つのコンポーネント「Parent Constraint」と 「Aim Constraint」を導入します。ここからはこの2つのコンポーネントをいじっていきます。

 4.1 Parent constraintによる武器の持ち替え設定

まず、Parent Constraintをいじり、武器の持ち替え設定をします。

parent ソース増やし

Parent Constraintの下段にある+ボタンを押し、sourcesの段を増やします。この段数が持ち替える位置の数になります。 

parent grip導入1

増やしたsourcesの中に、先程までに作成したgripオブジェクトを入れます。

parent grip導入2

続いて、sourcesの右側にある数値をすべて0にしコンポーネント内上段にある「Zero」を押します。

parent grip導入3

武器が変なところに移動しますが気にする必要はありません。
コンポーネント上段のIs activeにチェックがついていることを確認してください。

これで、位置調整の設定は完了です。
以下、sourcesの右側の数値を0,1で変化させて、武器の位置が変化することを確認してください。

・spine gripの数値を1にしたとき:腰追従

parent grip導入 spine確認

・right gripの数値を1にしたとき:右手追従

parent grip導入 right確認

・left gripの数値を1にしたとき:左手追従

parent grip導入 left確認


4.2 Aim constraint による両手持ち設定

続いて、Aim constraintをいじり両手持ちの設定をします。
事前にParent constraitの値をいじり、左手持ち状態にさせてください。

aim 導入1

まず、Aim constraint内のsourcesの段を1つにします。

aim 導入2

続いて、bou right aimをsource内に入れ、右の数値を0にします。

aim 導入3

続いて、Aim constrait上段の「Activate」を押します(parent constraintの時とは違う!)
上手のように武器アバターがright aim の方を向いたら成功です。

*失敗例

aim 導入3-1 失敗1

武器があらぬ方向を向いてしまいました。
原因としては以下が考えられます。

・武器モデルが入ったgame object(bou pivot)の向きがおかしい
 →一度武器モデルを階層から外してrotationをいじる
・Aim constraintの設定がおかしい
 →ctrl+zで戻り再度設定をやり直す。

上記を試してみてください。

ーーーーーーーーーーーーーーーーーーーー

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を選ぶ。

画像37

2. もう一度歯車マークをクリックし、今度はRemove Componentを選ぶ。
(これでAim constraintが一覧から削除されます。)

画像38

3. 別のコンポーネント(隣のParent Componentや最上段のTransformなどなど…)の歯車マークをクリックし、Paste Component As Newを選ぶ。

画像39

これで、先ほど設定したaim constraintが復活します。

もしこれを行った後にaim constraintをIs Activeにしても動かなかった場合は、他に設定ミスがないか確認してください(正直これ以上は私の経験外なので、よいアドバイスが思いつきません・・・)ー追記終わり

ーーーーーーーーーーーーーーーーーーーー

4/19 追記:片刃武器用のaim constraint設定

画像34

Aim constraint/Constraint setting/Freeze Rotation Axesのチェックボックスをいじることで、武器の回転方向の追従設定を変えることができます。
これにより、片刃武器の刃方向だけ左手に追従させたまま柄を右手に追従させる、なんてことも可能になります。
(武器モデルと武器の中心点用game objectの向き関係によってはうまくいかないことがあります。この場合、2. 武器の中心点を設定する。から調整する必要があります。)

aim freeze 調整指針

上図のように、中心点用のgame objectのrotationを0/0/0にしたときに武器の柄がz軸正方向に伸びていることが条件と思われます。自分で設定する際に調整してみてください。ー追記終わり

ーーーーーーーーーーーーーーーーーーーー

5. アニメーションの設定をする。

最後に、ハンドアニメーションを設定します。

アニメーション付け

従来のアニメーションづくり同様、アバターを複製してアニメーションづくり用のアバターを用意します。
この時、parent constraint/sourcesの値をいじり、腰追従にしてください。

アニメーション付け2

2つのアニメーション(右手で片手持ち/両手持ち)を作成し、アニメーション用のアバターに導入します。

・片手持ちアニメーション

アニメーション付け5

アニメーション編集で赤丸を押し、Parent Constrait/sourcesの値を以下のようにいじります。

・spine grip:0
・right grip:1

通常のアニメーション設定と同様に1フレーム目にも同じ値を入れてください。

・両手持ちアニメーション

アニメーション付け6

片手持ちの時と同様、赤丸を押してParent Constrait/sourcesの値をいじります。

・spine grip:0
・left grip:1

その後、Add propertyを押しbou pivot/aim constraintをIs activeにするアニメーションを追加します。

アニメーションオーバーライド設定

最後に、今回作成した2つのアニメーションをハンドサイン内に仕込んで完成です。

アバターをアップロードし、VRChat内で確認しましょう。
武器の持つ位置がおかしかった場合は、spine grip/left grip/right gripの位置を調整してください。


〇終わりに

以上で解説を終了します。
今回のシステムを利用することで、長物やアサルトライフルの両手持ちを行うことができます。

もし質問等ございましたら、以下のtwitterへリプ・DMで連絡をお願いします。

ID:Helio_ICNMY

それでは、よきVRChat生活を!

〇参考文献


この記事が気に入ったらサポートをしてみませんか?