2D Animationでボーンを入れたスプライトに物理演算を適用させる
Unity バージョン
unity 2019.4.19f1
はじめに
Unityにはスプライトに3DオブジェクトのようなBoneを組み込み動かすための機能が公式に用意されています。2D Animationというもので、これはPackage Managerからダウンロードすることができます。
そして、布など重力で揺らしたいものにBoneを適用させRigidbodyをBoneにアタッチすれば簡単に物理演算に即した動きを表現することができるようになります。
Boneを組む
今回は長方形の画像を用意しました。この画像にBoneを組んでいきましょう。
Sprite Editorを開き、左上のSkinning EditorをクリックするとBoneを組む専用のエディタが表示されます。
左のメニューからCreate Boneを選択しましょう。
さて、Boneを組み込んでいきます。今回はこのような感じにしました。上から垂れ下がるようにしたいので上から下方向へのBoneをまず作り、その子Boneとして両側にBoneを配置しました。
完了したら左のメニューのAuto Geometryを選びポリゴンを自動生成します。右下にあるメニューからGenerate for All Visibleボタンをクリックし、生成すると完了しました。Boneをドラッグするとそれに応じて画像の形が変わっていたら成功です。
Unityのシーン内で使う
画像をHierarchyウィンドウにただドラッグアンドドロップしても、Boneはまだ反映されていません。
Boneを適用させた画像のSpriteRendererにSprite Skinというスクリプトを追加します。そしてCreate Bonesと書かれたボタンを押しBoneを生成しましょう。
生成するとこのようにSceneウィンドウにBoneが表示され、Sprite SkinにもBoneのリストが表示されます。
Rigidbody2Dをつける
Rigidbody2Dを追加し布が揺れる表現を作りましょう。布の両脇にあるすべてのBoneのTransformを選択しRigidbody2DとDistance Joint 2Dを追加します。
このままでは支えがなくて布が自由落下してしまうので、上側のBoneを固定します。一番上にある両端のBoneにあるRigidbody2DをStaticにします。(Distance Joint 2Dも必要ないので削除します。)
そしたらそれぞれのBoneにあるDistance Joint 2DのConnected Rigidbodyを上にあるRigidbodyにセットしましょう。こうすることでBoneが自分の上にあるBoneにぶら下がるようになり物理演算が適用できます。
すべてのBoneについて完了したら、Rigidbody2DやDistance Joint 2Dの設定を変更します。
Boneが回転すると布がおかしくなるので、Rigidbody2DのConstraintsからFreeze Rotationにチェックを入れます。また、Distance Joint 2DにAuto Configure Distanceという項目がありますが、これがゲーム中もオンになっていると布がどんどん垂れ下がっているのでオフにしておきます。
これで布が重力ではためくようになりました!ただし現在は空気抵抗がまったくない状態です。お好みでRigidbody 2DのLiner Dragの項目を設定してください。