【Unity】物理特性マテリアル(弾性)を用いた跳ね返り表現の方法


冒頭

オブジェクト同士が衝突した際にピタッと止まることに違和感を覚える方もいらっしゃるのではないでしょうか。

物理特性マテリアル(Physic Material)を用いれば、現実に即した動きから現実離れした動きまで手軽に表現することが可能です。

今回は主に物理特性マテリアルにおける跳ね返りの表現、「弾性」についてご紹介していきます。

本記事では以下の流れで内容をご説明していきます。

  • 物理特性マテリアルとは?
  • どのような時に使える?
  • 下準備
  • 物理特性マテリアル(弾性)の使い方
  • 気をつける点
  • まとめ

*「物理特性マテリアル」に関する公式マニュアルはこちら

物理特性マテリアルとは?

マテリアルと聞くとオブジェクトの色付けをする際に使用するものと考えがちかもしれません。

反発係数や摩擦力を演算するために用いられるのが物理特性マテリアルです。オブジェクトへのアタッチは通常のマテリアル同様非常に簡単です。

「Rigidbody」コンポーネントで重力をつけたオブジェクトは以下のように動作します。

物理特性マテリアルなし_自由落下

*「Rigidbody」に関する記事はこちらをご参考ください

自由落下はするもののはずんだりはしません。物理特性マテリアルはオブジェクトを弾ませたり滑らせたりすることが可能です。

弾性を表現する際に調節しなければならないのが以下のプロパティです。

プロパティ_弾性

プロパティ 機能
Bounciness 弾性。0~1の値で設定。1の場合はエネルギーが減ることなくはずみ続けます。
Bounce Combine 衝突するオブジェクト間における跳ね返し度合いの処理方法。処理方法の種類は以下の通り(Friction Combine)と同様。
-Average 2つの弾力を平均化して反映。
-Minimum 2つの弾力の小さい方を優先して反映。
-Maximum 2つの弾力の大きい方を優先して反映。
-Multiply 2つの弾力を乗算した値を反映。

上記のプロパティを調節することによって、弾み、静止等の表現が実現可能になります。

*摩擦に関わるプロパティについては別の記事で紹介します。

どのような時に使える?

先述した通りオブジェクト同士が衝突した際の動き、摩擦などを表現したいときに使用します。

様々な場面での用途が考えられます。簡単なものですが以下に例を挙げてみました。

  • ビリヤード
  • エアホッケー
  • 跳ねることができる地面
  • 球技スポーツ
  • 攻撃を跳ね返す強化鎧
  • 角度がきつい場所でのオブジェクトの維持

マテリアルであるためゲーム上のステージから細かいアイテムまで簡単にアタッチができ、様々な場面での使用が可能です。

アイディア次第で弾性と摩擦を活かした表現の幅は広がっていくものでしょう。

下準備

物理特性マテリアルを使用するための下準備を行います。

まずScaleを( X: 1, Y: 1, Z: 1 )、Positionを( X: 0, Y: 0, Z: 0 )に設定した「Plane」を設置してください。

下準備_Plane_Transform

下準備_Plane

次にScaleを( X: 1, Y: 1, Z: 1 )、Positionを( X: 0, Y: 7, Z: 0 )*に設定した「Sphere」を設置してください。

下準備_Sphere_Transform

下準備_Sphere

*高さは任意の値で構いません。

「Sphere」に重力をつけるため[AddComponent]->[Physics]->[Rigidbody]の手順で「Rigidbody」のコンポーネント追加をしてください。

Rigidbody_Sphere

最後は「MainCamera」の設定です。Positionを( X: 0, Y: 3.5, Z: -10 )*に設定してください。

下準備_MainCamera_Transform

下準備_MainCamera

*「Sphere」と「Plane」が両方見える位置であればどのような値でも構いません。

以上で下準備は完了です。

物理特性マテリアル(弾性)の使い方

まずは物理特性マテリアルを作成していきます。

Projectウィンドウから[Create] -> [Physic Material]を選択します。

Physic_Material_作成方法

球体が跳ね返っているアイコンが特徴です。ここでは名前を「Sphere」とします。

「Sphere」を選択すると、先ほどご説明したプロパティの設定画面が出てきます。

球体を弾ませる上で重要になってくるのは「Bounciness」の個所です。0~1の任意の値で設定してください。ここでは「0.5」とします。

プロパティ_物理特性マテリアルの使い方

設定が完了したらHierarchyウィンドウの「Sphere」を開き、「Sphere Collider」コンポーネント内の「Material」右にある小さい丸ボタンをクリックしてください。

物理特性マテリアルの選択ウィンドウが出てきたら先ほど作成した「Sphere」マテリアルを選択してください。

物理特性マテリアルアタッチ_Sphere

ドラッグ&ドロップで直接オブジェクトにアタッチすることも可能です。

「Plane」にも忘れずに同様の手順でマテリアルをアタッチしてください。その理由については下記気をつける点でご説明いたします。

*Planeは「Mesh Collider」コンポーネント内の「Material」右ボタンから「Sphere」マテリアルをアタッチしてください。

Plane_マテリアルアタッチ

これでマテリアルのアタッチは完了です。

ゲームを実行してみましょう。「Sphere」オブジェクトがはずんでいることが確認出来たら成功です。

弾性テスト_0.5

Bouncinessの値を変更すれば、はずむ高さも変わります。ちなみに1にした場合はオブジェクトのはずむ高さがどんどん高くなっていきます。トランポリンのような床も実現可能です。

気をつける点

先ほどの例は「Sphere」も「Plane」も同じ物理特性マテリアルをアタッチしていたため、スムーズに動作が反映されました。しかし以下の条件だった場合どうなるのでしょうか。

  • それぞれ別の物理特性マテリアルがアタッチされていた場合
  • 片方にしかマテリアルがアタッチされていない場合

簡単な例を用いてご紹介していきます。

それぞれ別の物理特性マテリアルがアタッチされていた場合

先ほど説明した手順で物理特性マテリアルをもう1つ用意してください。名前を「Plane」とします。Bouncinessの値は「0」にしてください。設定が完了したらプロジェクトエリアの「Plane」にアタッチしてください。

この状態でゲームを実行します。

弾性テスト_S-0.5_P-0_Average

先ほどよりはずむ高さが低くなっていることが確認できます。これは物理特性マテリアル「Sphere」「Plane」のBounce Combineが「Average」に設定されているためです。

Sphere_BounceCombine_Average

プロパティ_Average

つまり「Sphere」のBounciness「0.5」と「Plane」のBounciness「0」平均値「0.25」が衝突時のBouncinessの値として反映されているということです。

その他のパターンも以下でご紹介させていただきます。

「Sphere」のBounce Combineは「Average」のままです。「Plane」のBounce Combineのみ変更しています。Bouncinessはどちらも変更していません。

Bounce Combineが「Minimum」であった場合

弾性テスト_S-0.5_P-0_Minimum

「Plane」のBouncinessの値が「Sphere」の値より小さいためBouncinessは「0」として反映されています。

Bounce Combineが「Multiply」であった場合

弾性テスト_S-0.5_P-0_Multiply

「Plane」のBouncinessと「Sphere」のBouncinessを掛け合わせた値「0」が反映されています。

Bounce Combineが「Maximum」であった場合

弾性テスト_S-0.5_P-0_Maximum

「Sphere」のBouncinessの値が「Plane」の値より大きいためBouncinessは「0.5」として反映されています。

「なぜ『Plane』のBounce Combineが優先的に反映されているのか?」と感じた方もいるのではないでしょうか。

それはBounce Combine のUnity上での優先度が決まっているためです。その優先度というのは以下の順番になります。

[Average]<[Minimum]<[Multiply]<[Maximum]

こうした優先度が設定されているため、上記の例においても「Plane」側のBounce Combineが優先して反映されているのです。

片方にのみマテリアルがアタッチされていた場合

オブジェクト「Sphere」にのみマテリアルをアタッチした場合の動作は以下の通りになります。

Bouncinessを「0.5」、Bounce Combineを「Average」で設定しています。

弾性テスト_マテリアル片方のみ_Average

オブジェクト双方にマテリアルがアタッチされている時より跳ね返りが小さくなっていることが確認できます。

物理特性マテリアルがアタッチされていないオブジェクトは、通常Bouncinessは「0」とされています。

「Sphere」のBounce Combineが「Average」で設定されている場合、Bounciness「0.5」のオブジェクトと「0」のオブジェクトが衝突したと認識され、その平均値が最終的なBouncinessの値として実行されます。この場合は「0.25」であるため跳ね返りが小さくなっています。

衝突するオブジェクト双方にマテリアルをアタッチしなくても、Bounce Combineの設定を調節すれば想定した動きの実現も可能です。

例えばBouncinessを「0.5」で実行したい場合、先述した優先度にのっとり「Sphere」のBounce Combineを「Maximum」に設定すればOKです。

マテリアル片方_マキシマム

弾性テスト_マテリアル片方のみ_Maximum

実行したいことに合わせて、スマートにマテリアルのアタッチができると理想的です。

以上のように衝突するオブジェクト同士のBouncinessの値が違う場合、Bounce Combineの設定によって様々な動作がなされることが確認できます。うまく組み合わせて表現したい動きを生み出しましょう。

まとめ

いかがでしたたでしょうか。

今回は物理特性マテリアルの「弾性」についてご紹介してきました。

通常のマテリアル同様、気軽にオブジェクトにアタッチすることによって跳ね返りを表現できることをご理解いただけたでしょうか。

物理特性マテリアルのもう1つの特徴である「摩擦」についても別の記事でご紹介していきます。興味を持っていただけたら幸いです。

参考記事)物理特性マテリアルを用いた摩擦表現の方法


Massuuuu