Unityで作れる物理オブジェクトは基本的には「剛体」(つまり変形しない物体)です。しかし、ゲームを作っているとたまに「ゼリーのような柔らかい物体」(英語だとSoft Bodyというらしい)を作りたくなることがあります。
もちろんそういう物体は有料アセットを使えばすぐに実装できるのですが、ここではアセットを使わず自前で実装する方法をご紹介します。実際に作ってみたサンプルは次のGIFの通りです。
「2D Animation」と「Spring Joint」で実装!
まずはじめに実装方法についてですが、今回は
- 2D Animationパッケージ(※Package Managerからインポート可能)
- Spring Joint
の2つを使って柔らかい物体を実現することにしました。2D Animationはスプライトを変形させるため、Spring Jointはゼリーのような動きを物理演算で再現するために使います。
ゼリーのようなゲームオブジェクトの具体的な作り方
ではここからが本題で具体的な作り方の手順を解説していきます。主な手順は次の通りです。
- スプライトにボーンを仕込む
- 「Sprite Skin」コンポーネントでスプライトが変形するようにする
- 各ボーンと親にRigidbody 2Dをアタッチする
- 各ボーンにCircle Collider 2Dをアタッチする
- 各ボーンにSpring Joint 2Dをアタッチする
それぞれ詳しく見ていきましょう。
手順1:スプライトにボーンを仕込む
まずはスプライトにボーンを仕込んでいきます。2D Animationパッケージがインポートされていれば、スプライトエディタで左上のドロップダウンメニューに「Skinning Editor」という項目が出るはずなので、それを選択してボーン編集画面を開きましょう。
画面が出たらスプライトをダブルクリックして選択し、「Create Bone」メニューから適当にボーンを生やします(下図)。ボーンの位置や長さは大体で構いません。
できたら右上の「適用する」をクリックして変更を確定させましょう。
手順2:「Sprite Skin」コンポーネントでスプライトが変形するようにする
次に、このままではスプライトが変形しないので「Sprite Skin」というコンポーネントを使ってスプライトが変形するようにします。
先ほど編集したスプライトをシーンにドラッグ&ドロップし、SpriteSkinコンポーネントをアタッチしてください。そうしたら「Create Bones」というボタンがあると思うのでそれをクリックしてボーンを自動登録しましょう。するとシーンビューでスプライトにボーンが表示されるようになります(下図。なんかすごくキモいですよね)。
手順3:各ボーンと親にRigidbody 2Dをアタッチする
それができたら、次は各ボーンとその親のゲームオブジェクトにそれぞれRigidbody2Dをアタッチします。必要なら質量を変更しても良いですが、それ以外は特にいじる必要はありません。
手順4:各ボーンにCircle Collider 2Dをアタッチする
そうしたら各ボーンにCircle Collider 2Dをアタッチしましょう。半径が大きいとうまく動かないので、ごく小さい値(0.05とか)でOKです。
手順5:各ボーンにSpring Joint 2Dをアタッチする
最後に各ボーンにSpring Joint 2Dをアタッチします。Spring Jointは1つのボーンにつき3つ必要で、
- 隣接するボーン1つずつ
- 親
のリジッドボディをそれぞれの「Connected Rigidbody」に登録してください。そうしたら、Spring Jointコンポーネントの設定を次のように変更します。
- 「Auto Configure Connected」にチェックを入れます。
- 「頻度」がデフォルトだと変な動きになってしまうので、だいたい「8」くらいの値にすると良いです。
これで一通り設定が完了しました!ゲームを再生してゼリーのような動きになるか確かめてみましょう。
おわりに
以上、簡単ではありますが「Unityでゼリーのような動きをする物理オブジェクトの作り方」をご紹介しました。使い方によっては面白いことができそうなので、ぜひ試してみてください。