2D Animationでボーンを入れたスプライトに物理演算を適用させる

Unity バージョン

unity 2019.4.19f1

はじめに

Unityにはスプライトに3DオブジェクトのようなBoneを組み込み動かすための機能が公式に用意されています。2D Animationというもので、これはPackage Managerからダウンロードすることができます。
f:id:ky0ichi:20210410194303p:plain


そして、布など重力で揺らしたいものにBoneを適用させRigidbodyをBoneにアタッチすれば簡単に物理演算に即した動きを表現することができるようになります。

Boneを組む

今回は長方形の画像を用意しました。この画像にBoneを組んでいきましょう。
Sprite Editorを開き、左上のSkinning EditorをクリックするとBoneを組む専用のエディタが表示されます。
f:id:ky0ichi:20210410185627p:plain


左のメニューからCreate Boneを選択しましょう。
さて、Boneを組み込んでいきます。今回はこのような感じにしました。上から垂れ下がるようにしたいので上から下方向へのBoneをまず作り、その子Boneとして両側にBoneを配置しました。
f:id:ky0ichi:20210410190413p:plain


完了したら左のメニューのAuto Geometryを選びポリゴンを自動生成します。右下にあるメニューからGenerate for All Visibleボタンをクリックし、生成すると完了しました。Boneをドラッグするとそれに応じて画像の形が変わっていたら成功です。
f:id:ky0ichi:20210410190448p:plain

Unityのシーン内で使う

画像をHierarchyウィンドウにただドラッグアンドドロップしても、Boneはまだ反映されていません。
Boneを適用させた画像のSpriteRendererにSprite Skinというスクリプトを追加します。そしてCreate Bonesと書かれたボタンを押しBoneを生成しましょう。
f:id:ky0ichi:20210410190743p:plain
生成するとこのようにSceneウィンドウにBoneが表示され、Sprite SkinにもBoneのリストが表示されます。

Rigidbody2Dをつける

Rigidbody2Dを追加し布が揺れる表現を作りましょう。布の両脇にあるすべてのBoneのTransformを選択しRigidbody2DとDistance Joint 2Dを追加します。
f:id:ky0ichi:20210410195055p:plain


このままでは支えがなくて布が自由落下してしまうので、上側のBoneを固定します。一番上にある両端のBoneにあるRigidbody2DをStaticにします。(Distance Joint 2Dも必要ないので削除します。)
f:id:ky0ichi:20210410195403p:plain


そしたらそれぞれのBoneにあるDistance Joint 2DのConnected Rigidbodyを上にあるRigidbodyにセットしましょう。こうすることでBoneが自分の上にあるBoneにぶら下がるようになり物理演算が適用できます。
f:id:ky0ichi:20210410195643p:plain


すべてのBoneについて完了したら、Rigidbody2DやDistance Joint 2Dの設定を変更します。
Boneが回転すると布がおかしくなるので、Rigidbody2DのConstraintsからFreeze Rotationにチェックを入れます。また、Distance Joint 2DにAuto Configure Distanceという項目がありますが、これがゲーム中もオンになっていると布がどんどん垂れ下がっているのでオフにしておきます。
f:id:ky0ichi:20210410200104p:plain


これで布が重力ではためくようになりました!ただし現在は空気抵抗がまったくない状態です。お好みでRigidbody 2DのLiner Dragの項目を設定してください。
f:id:ky0ichi:20210410200637g:plain