UnityのPhysic Materialを使って衝突や跳ね返りを設定する

今回はPhysic Materialを使ってゲームオブジェクト同士が衝突した時の跳ね返り等の設定をしてみます。

Physic Materialを使うと氷の床、ザラザラで物が滑らないような床という風にする事が出来ます。

Physic Materialは

Physic Materialを設定する場所

↑のようにゲームオブジェクトに設定したコライダに設定します。

スポンサーリンク

Physic Materialの作成

Physic Materialの作り方

Physic MaterialはProjectのAssetsエリアで右クリック→Create→Physic Materialで作成出来ます。

Physic Materialのインスペクタの設定

作成したPhysic Materialを選択すると↑のようにインスペクタに表示されます。

Dynamic Frictionは移動中に衝突した時の摩擦で、0は摩擦なし、1は摩擦が最大で働きます。
Static Frictionは動いていない時に衝突した時の摩擦で、値はDynamic Frictionと同じです。
Bouncinessは跳ね返りの係数で0は跳ね返りがなく、1は力が落ちることなく跳ね返ります。
Friction Combineは衝突したオブジェクト同士の摩擦の設定で、

Averageは両方の平均
Minimumは小さい方で計算
Maxmamuは大きい方で計算
Multiplyは両方をかけて計算

になります。

Bounce Combineは衝突したオブジェクト同士の跳ね返りの設定でFriction Combineと同じです。

文章を読むより実際のサンプルを見た方が早いと思いますので、見ていきましょう。

まずは二つのPhysic Materialを作成し、名前をFrictionCube1とFrictionCube2とします。

physicmaterialCube1の設定

physicmaterialCube2の設定

それぞれの設定値は↑のようにしました。

FrictionCube1は床用でFrictionCube2は上から床に落とすゲームオブジェクトに設定します。

FrictionCube1では動的、静的に摩擦が0.5働くようにします。
FrictionCube2では摩擦を無くしツルツル滑る氷のように設定しました。

衝突させるゲームオブジェクトを二つ作成する

ヒエラルキー上に↑のように二つのCubeを作成し、名前をFrictionCube1、FrictionCube2とします。

FrictionCube1のインスペクタ

FrictionCube1のインスペクタは↑のようになります。

Box ColliderにPhysic MaterialのFrictionCube1をドラッグ&ドロップしています。

MeshRendererのMaterialsのElement0に床用のマテリアルを設定して、落とす物体と見た目の違いを出しています。

FrictionCube2のインスペクタ

FrictionCube2のインスペクタは↑のようになります。
Box ColliderにはPhysic MaterialのFrictionCube2を設定します。

こちらは上から落とす物体になり、自動で落下させたいのでRigidbodyを取りつけUse Gravityにチェックを入れます。

FrictionCube1とFrictionCube2

FrictionCube1とFrictionCube2は↑のようになります。
FrictionCube1が斜めの床で、FrictionCube2は四角い落とす物体ですね。

Physic Materialの効果を確認する

それでは実行してみましょう。

氷のような物体を斜めの床に落とした時のサンプル

↑のように落下した物体は床を滑らかに滑っていき平らな床の上でも氷のようにすべっています。

それではPhysic MaterialのFrictionCube2の設定を変えてみましょう。

Bouncinessを1、Bounce CombineをMaximumにして再度実行してみます。

落とす物体をスーパーボールのようにする

↑のように落下後にものすごくピョンピョン跳ねてますね!

スーパーボールのようです。
一度飛び跳ねるとなかなか止まりません。

Rigidbodyの空気抵抗を使って物体を止める

落とす物体FrictionCube2に取りつけているRigidbodyのDragを1、Angular Drugの値を1にしてみましょう。

Dragは物体の力に対する空気抵抗でAngularは物体の回転に対する空気抵抗です。

rigidbodyに空気抵抗を設定する

↑のように一定時間後に完全に静止しました。

最後にFrictionCube1の

Dynamic Frictionを1
Static Frictionを1
Bouncinessを0
Friction CombineをAverage
Bounce CombineをAverage

FrictionCube2の

Dynamic Frictionを0.5
Static Frictionを0.5
Bouncinessを0.5
Friction CombineをAverage
Bounce CombineをAverage

に設定します。

床であるFrictionCube1の摩擦を最大にし、Friction CombineをAverageにした事で落とす物体との平均で摩擦が計算されます。

それではUnityの実行ボタンを押して確認してみましょう。

摩擦が最大の床に物体を落とすサンプル

↑のように床の摩擦が大きい為、物体を落とすとすぐに止まってしまいます。

これでPhysic Materialを使って衝突や跳ね返りの設定をする事が出来るようになりました。

CharactereControllerを使っているキャラクターだと物体の影響を受けないのであれですが、
Rigidbody+コライダでキャラクターを動かしている場合は滑る床といったものも作れますね。

Rigidbody+Capsuleコライダでキャラクターを動かす方法

キャラ操作をCharacterControllerからRigidbody+コライダに変更する
Unityでキャラクターを操作する時CharacterControllerを使ってきましたが、物理的な影響を得る為にRigidbody+CapsuleColliderでキャラクターの移動、ジャンプ、坂や段差を登れるようにしてみます。

を参照してください。