![見出し画像](https://assets.st-note.com/production/uploads/images/120653990/rectangle_large_type_2_c96c11bb92c360f715795dd118d05c25.png?width=1200)
VRC|帽子脱着ギミック覚書
はじめに
最近、脱げるアバターギミックを搭載している人やアイテムを出し入れしている人のパフォーマンスを見て面白いなと思った。そろそろ11月11日。ポッキーゲームを実装してみたい。そのためには作り方を理解する必要がある。
ギミック作成の練習の一環として、今回は帽子の脱着を実装した。完成した結果は、下記動画の通りである。
脱着ギミックを作成する際に解説動画を参考にした。パッと思い出したいときに備えてテキストにしておく。
なお、本記事は参考動画とほぼ同様の内容である。初めてギミックづくりに挑戦する人は、より丁寧に解説されており情報量が多い元動画を参考にされることをお勧めする。参考にした動画は本記事の一番下にまとめている。
また、面倒な作業をしたくない人は、動画の作者と同じ人が帽子脱着ギミックをBoothで配布されているので、そちらを使うと良いかもしれない(https://booth.pm/ja/items/4977797)。
以下では実力をつけるために、手作業で設定する方法について述べる。
すること
帽子脱着ギミックを実装するにあたり、必要な作業は下記。
パーツ取り
パーツを扱いやすくするための工夫
ギミックの実装
パーツ取り(Unity編)
本セクションではUnityでパーツ取りを行う方法について述べる。(なお、Blenderが使える場合は本当に必要な物のみ取り出せるが、ここでは手軽な方法を載せておく。)
今回ベースとなるアバターはエリーゼちゃん。
![](https://assets.st-note.com/img/1698966681132-PsCMu6jqhl.png)
Prefab の構造は下記の通り。「Cap」が今回取り出したいパーツ。
![](https://assets.st-note.com/img/1698967187610-fyFjDZcmzj.png)
このPrefab を複製、右クリックで Unpack。必要なボーンとCap以外を削除する。必要なボーンの見極め方は、ボーンを消しても帽子の位置が元の位置から変わらないこと。ここでは名前を Elise2_cap_dataとした。
![](https://assets.st-note.com/img/1698967324788-WOjXchtZ34.png)
パーツやボーンについている Animator や VRC Avatar Descripter、VRC Phys Bone Collider などは不要である。 Elise2_cap_data のメッシュやボーンを選択して、Inspector を確認。Taransform 以外の Component がある場合は、削除する。
![](https://assets.st-note.com/img/1698967849688-UB27HZ94uR.png)
パーツを扱いやすくするための工夫
上記工程で得られたパーツの原点は、パーツの重心と異なる。
![](https://assets.st-note.com/img/1698968251219-kH2GChJN00.png)
これらを合わせるために以下の工程を行う。
Hierarchy を右クリック、Create Empty より、別のGameObjectを作成
GameObjectの原点をパーツの重心に合わせる
GameObjectの中にパーツを入れる。
![](https://assets.st-note.com/img/1698968659373-Z2TssaFDor.png)
![](https://assets.st-note.com/img/1698968670193-oE0iC3wQZK.png)
![](https://assets.st-note.com/img/1698968774394-yPQ4BRpcBO.png)
脱着ギミックの実装
脱着ギミックの実装は下記工程で行う。
元パーツの非表示
取り出したバーツの配置
パーツ固定位置の設定
当たり判定の設定
Fxパラメータの設定
Fx メニューの設定
元アバターのパーツの非表示
元のアバターのCapは非表示かつ、Tag を EditorOnly にしておく。EditorOnlyにしたものは、Unityで作業中は表示されるがPlay時に非表示になる。またVRChatにアバターをアップロードする際に無視される。
![](https://assets.st-note.com/img/1698968936730-9jg8njXnLE.png)
![](https://assets.st-note.com/img/1698968943835-vEjQSDacE2.png)
(なお、アバターをUnpackしている人は、Capそのものを消しても良い。)
取り出したパーツの配置
アバター直下にGameObjectを作成。ここではPropsと命名。この中に、さらにGameObjectを作成し、CAPと命名。CAPの中に上記で取り出したパーツ Elise2_cap を置く。
![](https://assets.st-note.com/img/1698971498791-cbyTUxd7Cw.png)
なお、これ以後の図は、Hierarchy にあるObjectがすべてUnpack後のPrefabで作業を行った図になっている。これは実験の産物であり、特にUnpackする必要はない。
パーツ固定位置の設定
今回帽子を置きたい箇所は、「頭」、「右手」、「ワールド」である。
(1) 頭と手に関しては、対応するボーンの直下に新規にGameObjectを配置する。それぞれ、「CAP_HEAD_POSITION」、「CAP_HAND_POSITION」と命名した。
![](https://assets.st-note.com/img/1698971665765-BauxpScXP6.png)
![](https://assets.st-note.com/img/1698971722950-Q2e3ERmMSb.png)
Props/CAP に Parent Constraint と Scale Constraint コンポーネントを付け、Zeroを押したのち、Source に各POSITIONオブジェクトを割り当て、Weight を0, 1 で割り当て、各POSITIONのTransformを調節した。
(2) ワールド固定用には、アバター直下にGameObjectを配置し、WORLDと命名。さらに、その下にGameObjectを作り、CAP_WORLDと命名した。 さらに、CAP_HAND_POSITIONを複製し、CAP_WORLD_POSITIONと改名した後、CAP_WORLD下に置いた。
![](https://assets.st-note.com/img/1698972032694-aevR3x2HIu.png)
WORLDおよびCAP_WORLD には、Fixed Joint コンポーネントを追加した。Fixed Jointを追加するとRigidbody コンポーネントも付与される。CAP_WORLD のRigidbody コンポーネントのUseGravityは、チェックを外す。
また、Hand.R に Rigidbodyコンポーネントを追加し、CAP_WORLDのFixed Joint に指定した。この Joint によりCAP_WORLDは普段は右手と同じ位置にあるが、CAP_WORLDのIsKinematicのON/OFFを切り替えることにより、置き去りになる。これによりワールド固定が実現できる。
![](https://assets.st-note.com/img/1699242254727-5WRHlhrjD3.png)
![](https://assets.st-note.com/img/1699242227223-4MiKx4kjCb.png)
なお、Props/CAP に追加した Constraint コンポーネントは下記の通りである。
![](https://assets.st-note.com/img/1698972326751-28qt8nvAgt.png)
当たり判定の設定
まずは、頭についている帽子を掴むための設定を行う。
Head 下にGameObjectを配置し、CAP_HEAD_RXと命名した。
![](https://assets.st-note.com/img/1698972621728-1uNfgF1yEh.png)
これに、VRC Contact Receiver コンポーネントを付与。当たり判定の大きさおよび位置を調節した後、Collison Tags を追加し、Finger R を設定。Receiver Type を Constant にした後、Parameter をCAP_HEAD_RXと命名した。
![](https://assets.st-note.com/img/1698972801564-w4KB8GWx6M.png)
![](https://assets.st-note.com/img/1698972772078-sTCo2Y47M0.png)
これにより、右手の指が水色の球の中にいるかいないのかが、CAP_HEAD_RXの値で判断できるようになる。中にある場合はCAP_HEAD_RX>0であり、外にある場合は CAP_HEAD_RX < 0.01 である。(後ほどこのパラメータをFxレイヤーの判定に用いることでanimationをコントロールする。)
続いて、ワールドに置いている帽子を掴むための当たり判定を追加する。
Props/CAP/Elise2_cap/ 下にGameObjectを配置し、CAP_WORLD_RXと命名。上記と同様に設定を行った。
![](https://assets.st-note.com/img/1698973833372-B626QUQ7nh.png)
![](https://assets.st-note.com/img/1698973132510-X1kiIRAZ5t.png)
![](https://assets.st-note.com/img/1698973140185-fFZgqvlcht.png)
アニメーションの作成
下記3つのアニメーションを作る。
帽子が頭にある(CAP_HEAD.anim)
帽子が右手にある(CAP_HAND.anim)
帽子がワールドに固定されている(CAP_WORLD.anim)
赤丸RECボタンを押してから、各パラメータを設定する。各ステータスに対応するConstraint を設定する他、帽子を手に持っているときは CAP_WORLD の Rigidbody のIsKinematic はオフ、手に持ってないときは IsKinematic をオンにする。
![](https://assets.st-note.com/img/1698973503917-md0IBMJXTy.png)
![](https://assets.st-note.com/img/1698973528540-aU38vYgC4N.png)
![](https://assets.st-note.com/img/1698973515631-s8i6sIZ1pU.png)
また、各 animation の Loop Time は切っておく。
![](https://assets.st-note.com/img/1698974799125-LlrJm5ldfd.png)
ExParaの設定
状態遷移管理用のフラグとして、CAP_HANDとCAP_WORLDをBoolianで追加する。(その他は無視してください。)
![](https://assets.st-note.com/img/1698973725467-GqtTA1ewkI.png)
Fxメニューの設定
FXメニューのParameters に4つのパラメータを追加する。先ほどの状態遷移管理フラグをBoolで加える他、Contact Receiver で指定したParameter名をfloatで付け加える。大文字小文字が識別されるため、注意する。
![](https://assets.st-note.com/img/1698973995596-EKN5oL3XDl.png)
新規レイヤ―を作成し、Weightを1にした後、先ほど作成したアニメーションを追加する。アニメーションの遷移は、当たり判定と手の形を組み合わせにより制御する。
当たり判定は、例えばCAP_HEAD_RXでは、CAP_HEAD_RX>0であり、外にある場合は CAP_HEAD_RX < 0.01 の様にすると識別できる。
![](https://assets.st-note.com/img/1698974236124-UAliWfeD7E.png)
![](https://assets.st-note.com/img/1698974684728-K3It8z0txb.png)
![](https://assets.st-note.com/img/1698974726530-fXvULMUd37.png)
Has Exit Time は切っておく。Transition Duration は、ぬるっと動かしたいなら0.25ぐらい。パッと切り替えたいときは 0 にする。
後からJoinした人と同期をとるために、状態が遷移するたびに、状態遷移管理フラグを上書きする必要がある。これは、VRC Avatat Parameter Driver コンポーネントで実現できる。FXレイヤー上に置いた、アニメーションをクリックすると、Inspectorから Add Behaviour できる。
![](https://assets.st-note.com/img/1698974367529-sDURnPI4QK.png)
![](https://assets.st-note.com/img/1698974565153-xJ7OLfXeCG.png)
![](https://assets.st-note.com/img/1698974572673-bizW6LsSE4.png)
例えば遷移状態が CAP_HEAD である場合、CAP_HANDとCAP_WORLDのフラグをオフにしている。(ここでは、これらの他にWithCap フラグも合わせて同期する設定にしている。このフラグは耳調節用のフラグであり、帽子をかぶっているときに耳を小さく、帽子を脱いでいる場合に耳を大きくするアニメーションを別レイヤーでコントロールしている。)
このフラグに対応したtransition も追加しておく。
![](https://assets.st-note.com/img/1698974871460-btA9dbvUcV.png)
なお、エリーゼちゃんの場合、帽子をかぶっている場合は耳を小さくし、被っていない場合は耳を大きくする処理を入れる必要がある。詳細は割愛するが、帽子の有無に関するレイヤーを作成し、耳のサイズに関するアニメーションを作成し、上述のWithCap フラグを用いて、同様に遷移を設定している。
![](https://assets.st-note.com/img/1698974917875-VCgv7EU201.png)
参考動画
本記事作成およびギミック実装にあたり、下記動画を参考にした。(大変わかりやすくて助かりました。)
使用アバター
以上。