第18回 サブアームを武装!~Fixed Jointを用いた別オブジェクト連動解説~
アバターの動きに連動したサブアームを実装してみましょう!
私の中の小学生が「ロボットを操縦した気分になりたい!」とうるさいのでアバターの動きに連動するサブアームを実装しました。
この記事を読んでいるあなたの中の小学生がいつ騒ぎ出すかわからないので一緒に実装方法を理解しておきましょう。
今回はオブジェクトを別オブジェクトの動きに追従させるFixed Joint機能を使いますよ。
第18回はこんな流れで進めていきますよ
STEP3.アバター側のRigidbodyを設定、サブアーム側と合体しよう
~STEP0.Fixed Jointって何?~
Fixed Jointとはオブジェクトの動きを制限させるunityの機能です。
ゲーム制作などでは紐で吊るされたアイテムを触ると紐ごと揺れる、といったような文字通り二つのオブジェクトのジョイント(継ぎ手)の役割を持ちます。
この二つのオブジェクトを繋ぐにはRigidBodyと呼ばれる物理特性を追加するコンポーネントが必要です。
今回はその理屈をアバターのBoneとサブアームのBoneにあてはめていきます。
~STEP1.サブアームを準備しよう~
既に自分で連動させたいモデルデータがある場合はSTEP2.まで読み飛ばして大丈夫です。
都合よくサブアームだけ配布している、なんてことはなかったのでアセットストアの配布モデルからアームパーツを拝借しましょう。
今回はこちらのデータをお借りします、銃のデータなど応用が利きそうですね。
以前のアセットストア解説記事を読みながらプロジェクトファイルにインポートしましょう。
モデルデータのファイルが追加されましたね。
ファイル内のPrefabsからモデルデータをhierarchyにドラッグして表示させましょう。
ロボが表示されました。
しかしこの銃を構えたポーズではユニティちゃんに合わせにくいですね…同じTポーズをとらせましょう。
VRCSDK内のフォルダからAnimationを見つけ、tpose-newを展開しましょう。
展開した中にあるtpose-newアニメーションファイルをCtrl+Dでコピーします。
コピーしたアニメーションファイルをロボのファイルへ移動させましょう。
右クリックし、Createから新規animatorを作成します。
その中に移動させたアニメーションファイルをドラッグしましょう。
animatorがピンと来なかったらアニメーション解説回を一度読んでおきましょう。
Tポーズをとるアニメーションが入ったanimatorをロボの中にあるAnimatorにドラッグして適用させます。
次にAnimationウィンドウを開いて赤丸の録画アイコンをクリックしましょう。
これでアニメーションが再生されて銃を構えていたロボがTポーズをとりましたね。
Tポーズをとらせたら録画ボタンを再度クリックして再生を解除します。
この再生を解除しないと今後の作業などが保存されないので忘れずに解除しておきましょう。
それとAnimationウィンドウを閉じるとまた銃を構えたポーズに戻ってしまうのでここからは邪魔にならないところにウィンドウを移動させます。
さて、ここからは今回使わない腕以外のパーツを削除していきましょう。
Ctrlを押しながらクリックすることで複数選択することができます。
Arm1とHipsを残してその他をDelete。
「削除するとPrefabデータに影響が出るけど続ける?」と聞かれるためContinue。
これで今回必要な腕のパーツだけ残りました。
ついでに腕以外のBoneも削除してしまいましょう。
Hipsの階層下にあるSpine以外をまずは削除します。
削除が完了したらSpineの階層を開きます。
背中のバックパックと首から上のBoneも使わないため削除します。
これで連動させるサブアームが完成しました!
~STEP2.サブアーム側のRigidbodyを設定しよう~
サブアームの準備ができたらアバターのhierarchyにサブアームのBoneを移動させましょう。
ユニティちゃんの場合はSpine2、ほかのアバターだとChestの下に移動させます。
メッシュデータのArm1はmesh rootの中に入れておきましょう。
Add ComponentからFixed Jointを見つけてサブアームのBoneに追加しましょう。
あれ?Fixed Jointを選んだのにRigidbodyも追加された?と思うかもしれませんが大丈夫です。
Fixed Jointはオブジェクトに物理特性を追加するRigidbodyがなければつなぐことができません。こちらの少し数値を設定しましょう。
AnGular Dragの値を0にし、Use Gravityのチェックを外します。
Freeze PositionのX,Y,Zすべてにチェックを付けます。
今の設定は「空気抵抗(drag)の数値を0にして、重力の影響を受けないものとします。さらに勝手に移動しないようにX,Y,Z軸を固定します。」という内容です。
せっかくの物理特性ですが今回の連動には邪魔なだけなのですべて使いません。
上記の設定を全てのBoneに追加していきます。
一つ一つ追加していくときりがないので複数選択してからAdd Component。
これで同じ数値の設定であれば一気に追加することができます。
~STEP3.アバター側のRigidbodyを設定、サブアーム側と合体しよう~
次にアバター側を設定しましょう。
連動させたいBoneにAdd ComponentからRigidbodyを追加します。
AnGular Dragの値を0にし、Use Gravityのチェックを外します。
Freeze PositionとRotationのX,Y,Zすべてにチェックを付けます。
今の設定は「空気抵抗(drag)の数値を0にして、重力の影響を受けないものとします。さらに勝手に移動、回転しないようにX,Y,Z軸を固定します。」という内容です。
せっかくの物理特性ですが今回の連動には邪魔なだけなのですべて使いません。
こちらも複数選択して一気にRigidbodyを追加しましょう。
指のBone設定を一部抜いているのはアバター側の指Boneが4つあるのに対してサブアーム側の指Boneが3つしかなかったからです。
アバター側のRigidbody設定が終了したらサブアーム側のFixed Jointにアバター側のRigidbodyをドラッグして適用させていきます。
これはまとめて適用することができないので地道に適用させましょう。
サブアームのBoneがアバターのBoneのどこに当てはまるのかは…名前を見ればわかりますね。
名前が一致しないのはSpine2とChestくらいでしょうか。
全て適用が終わったらアバターをアップロードして確認してみましょう。
ユニティちゃんの動きに合わせてサブアームも動いていますね、指の形も一致しています!大成功!
…ただしこのサブアーム、中指から小指までの3本が一つのBoneでくくられているのでピースサインやロックンロールの手の形が作れません。
指差し、サムズアップ、ハンドガン、拳ができるだけでも良しとしましょう。
それと現状では特にリスクはありませんが今回のやり方だとアバターのパフォーマンス判定がvery poor(とても悪い)になってしまいます。
今後のアップデート次第では何か影響があるかもしれないことをご了承ください。
1件の返信
[…] 解説していた方法がunity2017では対応していないので第18回のSTEP1.で改めて解説しました。(2019/1/17) […]