【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」を設置してください。
次にScaleを( X: 1, Y: 1, Z: 1 )、Positionを( X: 0, Y: 7, Z: 0 )*に設定した「Sphere」を設置してください。
*高さは任意の値で構いません。
「Sphere」に重力をつけるため[AddComponent]->[Physics]->[Rigidbody]の手順で「Rigidbody」のコンポーネント追加をしてください。
最後は「MainCamera」の設定です。Positionを( X: 0, Y: 3.5, Z: -10 )*に設定してください。
*「Sphere」と「Plane」が両方見える位置であればどのような値でも構いません。
以上で下準備は完了です。
物理特性マテリアル(弾性)の使い方
まずは物理特性マテリアルを作成していきます。
Projectウィンドウから[Create] -> [Physic Material]を選択します。
球体が跳ね返っているアイコンが特徴です。ここでは名前を「Sphere」とします。
「Sphere」を選択すると、先ほどご説明したプロパティの設定画面が出てきます。
球体を弾ませる上で重要になってくるのは「Bounciness」の個所です。0~1の任意の値で設定してください。ここでは「0.5」とします。
設定が完了したらHierarchyウィンドウの「Sphere」を開き、「Sphere Collider」コンポーネント内の「Material」右にある小さい丸ボタンをクリックしてください。
物理特性マテリアルの選択ウィンドウが出てきたら先ほど作成した「Sphere」マテリアルを選択してください。
ドラッグ&ドロップで直接オブジェクトにアタッチすることも可能です。
「Plane」にも忘れずに同様の手順でマテリアルをアタッチしてください。その理由については下記気をつける点でご説明いたします。
*Planeは「Mesh Collider」コンポーネント内の「Material」右ボタンから「Sphere」マテリアルをアタッチしてください。
これでマテリアルのアタッチは完了です。
ゲームを実行してみましょう。「Sphere」オブジェクトがはずんでいることが確認出来たら成功です。
Bouncinessの値を変更すれば、はずむ高さも変わります。ちなみに1にした場合はオブジェクトのはずむ高さがどんどん高くなっていきます。トランポリンのような床も実現可能です。
気をつける点
先ほどの例は「Sphere」も「Plane」も同じ物理特性マテリアルをアタッチしていたため、スムーズに動作が反映されました。しかし以下の条件だった場合どうなるのでしょうか。
- それぞれ別の物理特性マテリアルがアタッチされていた場合
- 片方にしかマテリアルがアタッチされていない場合
簡単な例を用いてご紹介していきます。
それぞれ別の物理特性マテリアルがアタッチされていた場合
先ほど説明した手順で物理特性マテリアルをもう1つ用意してください。名前を「Plane」とします。Bouncinessの値は「0」にしてください。設定が完了したらプロジェクトエリアの「Plane」にアタッチしてください。
この状態でゲームを実行します。
先ほどよりはずむ高さが低くなっていることが確認できます。これは物理特性マテリアル「Sphere」「Plane」のBounce Combineが「Average」に設定されているためです。
つまり「Sphere」のBounciness「0.5」と「Plane」のBounciness「0」の平均値「0.25」が衝突時のBouncinessの値として反映されているということです。
その他のパターンも以下でご紹介させていただきます。
「Sphere」のBounce Combineは「Average」のままです。「Plane」のBounce Combineのみ変更しています。Bouncinessはどちらも変更していません。
Bounce Combineが「Minimum」であった場合
「Plane」のBouncinessの値が「Sphere」の値より小さいためBouncinessは「0」として反映されています。
Bounce Combineが「Multiply」であった場合
「Plane」のBouncinessと「Sphere」のBouncinessを掛け合わせた値「0」が反映されています。
Bounce Combineが「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」で設定しています。
オブジェクト双方にマテリアルがアタッチされている時より跳ね返りが小さくなっていることが確認できます。
物理特性マテリアルがアタッチされていないオブジェクトは、通常Bouncinessは「0」とされています。
「Sphere」のBounce Combineが「Average」で設定されている場合、Bounciness「0.5」のオブジェクトと「0」のオブジェクトが衝突したと認識され、その平均値が最終的なBouncinessの値として実行されます。この場合は「0.25」であるため跳ね返りが小さくなっています。
衝突するオブジェクト双方にマテリアルをアタッチしなくても、Bounce Combineの設定を調節すれば想定した動きの実現も可能です。
例えばBouncinessを「0.5」で実行したい場合、先述した優先度にのっとり「Sphere」のBounce Combineを「Maximum」に設定すればOKです。
実行したいことに合わせて、スマートにマテリアルのアタッチができると理想的です。
以上のように衝突するオブジェクト同士のBouncinessの値が違う場合、Bounce Combineの設定によって様々な動作がなされることが確認できます。うまく組み合わせて表現したい動きを生み出しましょう。
まとめ
いかがでしたたでしょうか。
今回は物理特性マテリアルの「弾性」についてご紹介してきました。
通常のマテリアル同様、気軽にオブジェクトにアタッチすることによって跳ね返りを表現できることをご理解いただけたでしょうか。
物理特性マテリアルのもう1つの特徴である「摩擦」についても別の記事でご紹介していきます。興味を持っていただけたら幸いです。
参考記事)物理特性マテリアルを用いた摩擦表現の方法
また、物理演算の停止方法や最適化など、物理演算に関するあれこれを説明している記事もあるので、ご興味ある方はご一読ください。
参考記事)物理演算を徹底解説!物理演算の停止・精度変更・水や髪の物理演算まで
この記事はいかがでしたか?
もし「参考になった」「面白かった」という場合は、応援シェアお願いします!