もくじ
矢を撃ちたい!
実装が面倒?ギミックが厄介?それでも弓矢を装備したい!
この記事はそんなあなたのためのセットアップ講座です。
最終的には、右手のハンドサインに対応した弓矢システムが完成します!
今回は解説のために、無料でご利用いただける弓矢のデータをご用意いたしました。
この素体データはモデルを差し替えて様々な改変をしていただくことが可能ですので、
皆さまも是非お好きな弓矢を作ってバンバン撃ってみましょう!
【VRC 想定】セットアップ済み弓矢(ベース) ver1.00
また、同梱のUnityパッケージを使った簡単な方法も最後に紹介いたしますので、
とにかくパっとモデルを差し替えて撃ってみたいという方はそちらをご利用くださいませ!
…ちなみにこちらの方法だと1分程度で実装からエクスポートまで完了致します。
導入方法に強い興味をお持ちの方以外は、こちらの方法をオススメさせていただきます。
fbxから始めるセットアップ
実装の流れ
今回の実装はけっこうやる事が多いので、最初に全体の流れを見ておきましょう。
- アバターをアップロードできる状態に持っていく
- 弓を手に持たせる
- 弦を引くシステムをつくる
- 弦を引く/離すアニメーションをつくる
- パーティクルで矢が飛び出るようにする
- アニメーションコントローラーを整備する
この6項目をこなせば、あなたのアバターも弓使いに!
事項からは詳細な説明が始まりますので、
画像も見ながら丁寧に進めていきましょう!
事前準備
まずは普段通りVRCSDK3.0とアバターに必要な諸々をインポートして、
弓矢を装備させたいアバターを普通にエクスポートできる状態まで持っていきましょう。
この工程が分からない場合は、「vrc アバター アップロード」等で検索すると
有志の皆さまによる様々なお役立ち情報が見つかるはずです!
弓を持たせる
次は早速、弓を左手に持たせていきます。
弓は通常左手で持ち、右手で矢を引き絞るので、間違えないように気を付けましょう!
①空のオブジェクトと弓本体の配置
両手、あるいは物持ち用のジョイント直下に空のゲームオブジェクトを追加(Create Empty)します。
弓を持つ左手のものは”weapon_target”、右手の物は"grip_target"としています。
次に、弓のfbxモデル本体をアバターの階層直下に置いてください。
②コンストレイントと調整
”bow_test”直下の弓のルート骨にペアレントコンストレイントを追加し、
Sourcesに"weapon_target"を設定。
Zeroを押して弓を手の位置に移動させましょう。
これで、"weapon_target"に弓のモデルがくっついてくるようになりました!
ついでに、ここで弓の位置も調整しておきましょう。
"weapon_target"を移動させれば、持ち手の位置を丁度握りやすい場所に持っていくことが出来ます。
弦を引くシステムをつくる
弓を引き絞り、狙いを定める動きが出来るようなシステムを実装します。
多種のコンストレイントを扱うので、きっちり対応するものをセットしていきましょう!
①空のオブジェクトと矢の配置
"bowstring"骨直下に"aim"という名前で空のゲームオブジェクトを追加しましょう。
先ほど追加した"aim"直下に、弓のモデルを置いてください。
位置と回転の値も調整して、きちんと弦に矢がセットされた形にしておきましょう。
②エイムコンストレイントの設定
まずは、弦をどんな方向に引いても、矢が弓の持ち手方向を向くように設定していきます。
"aim"にエイムコンストレイントを追加し、Sourcesに"arrow_height"の骨を設定。
今度はActiveを押して設定を確定してください。
"arrow_height"骨で矢をつがえる位置を自由に調整し、”bowstring”骨を動かすと、
つがえた状態のまま弦を引くことが出来るようになりました!
③弦を引く・離すシステムの実装
"bowstring"骨にペアレントコンストレイントを追加し、Sourcesに"grip_target"を設定。
Zeroを押して、弦が右手に引っ張られることを確認してください。
弦を引けるようにはなったので、手を離すと弦が元に戻るシステムを作りましょう。
"grip"骨の下に空のゲームオブジェクトを追加し、"reset_target"とします。
このオブジェクトの位置は、"bowstring"骨の位置と同じにしておきましょう。
まずは先ほど設定した、ペアレントコンストレイントのIs Activeのチェックを外します。
先ほどと同じ"bowstring"骨にポジションコンストレイントとローテーションコンストレイントを追加。
こちらのSourcesには"reset_target"を設定し、両方ともZeroを押してください。
これで、弦を引いたり離したり出来るシステムが完成しました!
アニメーションをつくる
ここからはアニメーションの設定を行っていきます。
結構ややこしい部分なので、画像を見ながら頑張っていきましょう…!
①コントローラーとアニメーションの作成
矢を撃つ動作を実装するため、専用のアニメーションコントローラーを作ります。
まずはVRCSDKに同梱された、プリセットのコントローラーを複製しましょう。
今回は右手のハンドサインに対応して動かす想定なので、
ハンドサインをつかさどる”vrc_AvatarV3HandsLayer”を複製して"Layer_fx"とします。
この実装はハンドサインでの表情変えと同じ仕組みなので、詳しいことを知りたい方は
「VRChat ハンドサイン 表情」などで検索してみてくださいね!
アバターを選択し、先ほどのコントローラーをPlayable LayersのFXの項目に登録しましょう。
これでこのコントローラーの設定が、VRC上で反映されるようになります。
ここからはAnimatorタブで作業を行います。
タブが表示されていない方は、Window>Animation>Animatorからタブを表示しましょう。
"Right Hand"を選択し、Create State>Emptyから二つステートを作成してください。
それぞれ、"Arrow_Grip"と"Arrow_Release"とします。
ここから、二つのステートに登録するアニメーションを作っていきます。
Animationタブが無い方は、Window>Animation>Animationからタブを表示しましょう。
シーンビューでプレビュー出来るように、"Layer_fx"をアバターのAnimator>Controllerにセットします。
AnimationタブでCreate New Clipを選択し、"Grip"のアニメーションを新しく作りましょう。
次に、Add Propertyから"bowstring"骨の各コンストレイントのActive項目を追加していきます。
"Grip"では右手で弦を引く動きを作るので、ペアレントコンストレイントのみをActiveにした状態にします。
キーは0フレームのみで大丈夫なので、右の方に自動で打たれたキーがあれば消しておきましょう。
Animatorに戻り、"AllParts"に追加された"grip"ステートを削除してください。
残ったままだと、問答無用で再生されてしまいバグの元になります。
原因にも気付きにくいので、今のうちに忘れず対処しましょう!
次は"release"のアニメーションを作ります。
一から作ると項目の追加が面倒くさいので作業の効率化のために、gripを複製してリネームしましょう。
このままではAnimationタブでの一覧で選択できないので、作っておいた二つのステートにそれぞれアニメーション登録します。
Animationタブに戻って、今度は"release"を選択。
弦を元の位置に戻すために、こちらはポジションとローテーションのコンストレイントにチェックを入れます。
仕上げに、両アニメーションを選択し、Loop Timeの項目をオフにします。
これで、アニメーションの大枠とコントローラーへの登録が出来ました!
飛び出る矢を作る
このままでは矢が弦にぴったりくっついたまま、射出されることはありません。
ということで、今回は飛び出る矢をパーティクルで作っていきましょう!
①パーティクルの作成
まずは"aim"直下、矢のモデルのお隣に、Effects>Particle Systemを追加。
まずはTransformで位置を矢のモデルに合わせて…
パーティクルの基本設定(パーティクル名のタブ)、Emittion、Shape、Rendererの項目を設定していきます。
うさほの設定した項目は画像の通り。
パーティクルの設定だけでも色々と面白い改変ができますので、
導入完了後は是非こちらも触って遊んでみてください!
②アニメーションへの追加
"grip"と"release"に、今度は矢の射出アニメーションを入れていきましょう。
このパーティクルはActiveになると自動で飛んでいくので、
手を離したときにモデルからパーティクルに切り替わるようにすると良さそうです。
まずはAnimationタブで"grip"を選択し、モデルとパーティクルのActive項目を追加。
モデルはオン、パーティクルの方はオフになるようにキーを打ってください。
次に"release"を選択し、モデルをオフ、パーティクルをオンにします。
"grip"からキーをコピペすると、項目を追加する手間が省けてちょっと楽です
これでアニメーションの作業は完了です!
次はAnimatorタブで遷移の調整を行いますが、その前にひと手間。
矢のモデルとパーティクル両方を非表示にして、
アバターのコントローラーを外してください。
これをしておかないと、弦を引く前から矢が見えてしまったり、
勝手にアニメーションが再生されて挙動がおかしくなったりします。
コントローラーを整備する
ついにここからは、アニメーションの遷移を整備していきます。
様々な条件付けをして、どんな状態の時にどのアニメーションが
再生されるかを決定していきましょう!
①遷移をつくる
まずはAnimatorタブに移動し、"Right Hand"内に作成したステート二つを分かりやすい位置に移動します。
次にMake Transitionでステート同士を繋げていきましょう。
Any Stateからは"Arrow_Grip"に、"Arrow_Grip"と"Arrow_Release"は行き来できるようにします。
更に、二つのステートを選択し、他のステートに合わせてWrite Defaultsをオフにします。
これは、VRCではすべてのステートでWrite Defaultsの状態を合わせないと
遷移に不具合が起きることがあるためです。
②遷移の条件付け
さて、今回は右手がFistの時に弦を引き、
それ以外の時は離すという動きを実装していきましょう。
まずは弦を引く条件です。
遷移の条件は、Conditionsから追加することができます。
今回はFistの時に弦を引きたい=条件をFistへの遷移と同じにします。
つまり、"GestureRight"が=1の時に遷移する条件付けです。
これは弦を離してからもう一度引く時も同じです。
弦を離す遷移には、先ほどまでとは逆に"GestureRight"が ≠ 1の時に遷移する条件付けをします。
③遷移の詳細設定
ここからは、遷移の詳細設定を行っていきます。
まずは前項で作成した三つの遷移を選択し、Has Exit TimeとSettings下の設定をFistやOpen等のものに合わせます。
次に、"Arrow_Release"から"Arrow_Grip"に戻る遷移を選択し、Transition Durationを0にします。
これで、手を離した瞬間に矢が放たれるようになりました!
また、Any Stateから"Arrow_Grip"への遷移では、Can Transition To Selfをオフにしましょう。
これがオンになっていると、高速でステート間を行き来して処理が無駄に重くなる原因になります。
最後に、使用しないステート間の遷移を削除します。
これを忘れると動作しなくなったりもするので、お忘れなく!
やったね!
Unityパッケージから始めるセットアップ
さて、ここからは1分でおわるPrefabを利用したセットアップの解説です。
まずアバターをアップロードできる状態まで持っていき、シーンに弓矢のPrefabを置きます。
この時忘れずにUnpack Prefabを行って階層構造を変更可能にしておきましょう。
左手(もしくはその物持ち用骨)直下に"weapon_target"、右手の方には"grip_target"を移動し、位置を調整します。
"rood_bow"以下に含まれる"arrow_height"骨で矢をつがえる位置も自由に調整できるので、
見栄えにこだわりたい方は是非この時に調整してみてくださいね!
アバターの階層直下に"bowtest"を移動します。
Playable LayersのFXの項目に、"Animations"フォルダ内の"Layer_fx"を設定して完了!
早い!簡単!
さいごに
お疲れ様でした!
弓矢の実装…いかがでしたでしょうか?
ご自分で実装されるにしてもPrefabをご利用いただくにしても、
モデルはもとよりアニメーションや遷移、パーティクルなど、
ここから様々な改変の余地があると思います。
特に遷移に関しましては、我が家の「薄暮の射手」のように
武器をオンオフしたり、表情と共存させたりもできるので面白いですね!
よろしければ是非、皆さまのお宅の子たちにも素敵な弓を装備させてあげてください!
それでは皆さま、良いVRChatライフを!