【Unity】柔らかいオブジェクトが作れる「Jelly Mesh」を購入してみた


こんにちは。ピンビットです。
このページでは「Jelly Mesh」の使い方を紹介します。


Jelly Meshとは


Jelly 物理演算が3次元に突入!Jelly SpritesとJelly Meshの成功を受けて開発された本作は、動的かつソフトボディ風の物理演算をあらゆるUnityメッシュに導入し、退屈で固定的なメッシュを、跳ねて、伸びて、変形し、自然な力に反応するスプライトに変換することができるようにします。

*Unityにコンパチブルなメッシュで動作します。
*2Dおよび3Dの物理演算システムをサポートしています。
*シンプルな設定が可能な一方で、奥深い設定オプションが品質とパフォーマンのバランスを取りやすくします。
*キューブ、球体、三角とグリッドボディ設定で素早くソフトなボディを作成。
*シーンビューでリジッドボディを直接動かしスケールするために、Jelly Meshをフリーモードに変換。
*「付着点」システムはメインのJelly Spriteのように子オブジェクトを物理演算要素に反応させることができます。
*完全なC#ソースコードとサンプルシーンが含まれています。
公式ページより引用)
とのことです。

使い方

Jelly Meshの作り方

Unityのエディタ上で「Gameobject->Create Other->Jelly Mesh」とクリックするとJelly Meshというゲームオブジェクトが生成されます。これの「Mesh」欄でメッシュを選択すると完成です。

衝突の検知

Jelly Meshは複数のリジッドボディにより成り立っています。これらのリジッドボディは、他のボディやトリガーと衝突したとき、下記の関数を用いて親オブジェクトであるJelly Meshにメッセージを送信します。
(意訳であり、翻訳の内容は保証しません。)
 
 void OnJellyCollisionEnter(JellyMesh.JellyCollision collision)
 void OnJellyCollisionExit(JellyMesh.JellyCollision collision)
 void OnJellyCollisionStay(JellyMesh.JellyCollision collision)

 void OnJellyCollisionEnter2D(JellyMesh.JellyCollision2D collision)
 void OnJellyCollisionExit2D(JellyMesh.JellyCollision2D collision)
 void OnJellyCollisionStay2D(JellyMesh.JellyCollision2D collision)

 void OnJellyTriggerEnter(JellyMesh.JellyCollider trigger)
 void OnJellyTriggerExit(JellyMesh.JellyCollider trigger)
 void OnJellyTriggerStay(JellyMesh.JellyCollider trigger)

 void OnJellyTriggerEnter2D(JellyMesh.JellyCollider2D trigger)
 void OnJellyTriggerExit2D(JellyMesh.JellyCollider2D trigger)
 void OnJellyTriggerStay2D(JellyMesh.JellyCollider2D trigger)

これらは、標準のUnityコリジョン関数とほぼ同じですJelly Mesh GameObjectに添付されているスクリプトに1つまたは複数のスクリプトを実装するだけで、子剛体の1つが衝突/トリガーメッセージを受信するたびに呼び出されます。引数として渡されるJellyCollision / JellyColliderオブジェクトには、元の衝突データと、どの子剛体が衝突を報告したかの詳細が含まれます。

Jelly Meshのインスペクター上の設定

Mesh

レンダリングするメッシュ

Use 2D Physics

メッシュがUnity 2Dまたは3D物理システムを使用するかどうかを制御します。

Attach Neighbors

デフォルトでは、各Jelly Meshリジッドボディは中央のリジッドボディにのみ接続されています。「Attach Neighbors」オプションを選択すると、各ボディが最も近い隣に接続され、より安定したJelly Meshが作成されます。

Body Configuration

ボディ構成を変更すると、Jelly Meshリジッドボディとコライダーの物理的レイアウトが制御されます。一部のシェイプは特定のメッシュに適している場合があります。たとえば、円形のメッシュに円の構成を使用して、自然な見た目で動作させる場合などです。いくつかの形状は、選択した重力とばね剛性の値によって、他の形状よりも安定している場合があります。個々のボディのレイアウトは、シーンビューで緑色の円として表示されます。

各ボディタイプには、フリーモードに変換するオプションがあります。これにより、各ボディの位置を手動で調整することができます。提案されたワークフローは、事前定義された形状の1つを使用して基本構成を生成し、次に「設定をフリーモードにコピー」ボタンをクリックしてカスタム編集を可能にすることです。自由モードに入ったら、個々のボディーをクリックしてドラッグし、Jelly Meshインスペクターウィンドウでこれらの値を変更して、シーンビューのボディー位置と半径を変更できます。インスペクタでは、ポイントを追加および削除することもできます。

フリーモードでは、すべてのJelly Meshリジッドボディが中央のボディに接続されています。これは、三角形、円形、矩形の設定にも当てはまります。したがって、これらの形状の「フリー」バージョンは、対応しています。しかし、 'Grid'レイアウトでは格子モードのスプリング構造が使用されていますが、Freeモードに切り替えると保存されないため、結果として生じるJelly Meshの振る舞いが若干変更される可能性があります。

Collider Radius

この値は、剛体コライダーの大きさを全体のメッシュサイズの一部として測定したものです。コライダーを縮小すると、形状が不安定になり、他の剛体オブジェクトがゼリーメッシュを通過する可能性があります。これはあなたのプロジェクトによっては望ましくない場合があるかもしれません。

Collider Scale

この値を使用して、ソフトボディの全体的な形状を伸縮させることができます。これを使用して、メッシュに合わせてシェイプを調整します。楕円形のメッシュは、円形の構成を単純に潰すだけで、よりよくモデリングできます。

Lock Rotation

ゼリーメッシュをz軸回りに回転させるかどうかを選択します。

Kinematic Central Body

中心点を運動学的に設定することができます。これにより、移動を防止し、ゼリーメッシュの移動を防止したり、空中で停止させたりすることができます。

Mesh Scale

実際にレンダリングされるメッシュの大きさ。ソフトボディの安定性を維持するには、通常の変換スケール値を使用するのではなく、この値を使用してメッシュをスケールする必要があります。

Controll Point Influence

このスライダは、各メッシュ頂点が物理的ボディの変位によってどの程度強く影響されるかを制御します。値を大きくすると、メッシュの変形がソフトボディの形状をより正確に表現できますが、視覚的な乱れも発生します。

Physics Materials

柔らかいボディコライダーに適用されるPhysics Materialです。これを使用して摩擦や弾性を制御します。

Drag/Angular Drag (3D physics mode only)

コライダーのドラッグ値を制御します。これを使用して、3Dモードでオブジェクトの落下を遅くすることができます。

Gravity Scale(2D physics mode only)

コライダーの重力スケールを制御します。これを使用して、3Dモードでオブジェクトの落下速度ををより速くしたり遅したりできます。

Spring Stiffness

個々のボディを接続するスプリングジョイントの剛性を制御します。メッシュが自重で崩壊している場合は、バネの剛性を上げてみてください。

Spring Damping

スプリングの振動が抑えられる程度を設定できます。

Mass/Mass Type

ソフトボディの質量を設定します。これはグローバルスケール(メッシュ全体の質量が質量値と等しい)またはボディスケールごとに定義することができます(各コンポーネント本体にはこの質量があります。総質量は(質量×物体数)に等しくなります。

Attach Points

アタッチポイントを使用すると、子のGameObjectをJelly Meshにアタッチできます。子オブジェクトの位置は、可視メッシュ上の点であるかのように正しく変形します。 Jelly Meshを他のJelly Meshに接続することもできます。これにより、子メッシュの中央剛体をKinematicに設定し、子メッシュがメインメッシュの位置を追跡しながら、物理的な力に依然として反応します。 AddAttachPoint()関数を使用して、実行時にアタッチポイントを追加することもできます。


Jelly Meshの大きさを変える

実行時に、Jelly MeshのScale()関数を使用して、Jelly Meshを動的にサイズを変更できます。

使ってみた

Unityの公式チュートリアルRoll a Ballに、このアセットを適用してUnity Roomにてアップロードしました。