CGBoxの一部の記事にはアフィリエイト広告が含まれております。
【Unity】オブジェクトに摩擦と跳ね返りを設定する方法

こんにちは!Unityでリアルな動きを表現したい時に使えるのが、摩擦や跳ね返りの設定です。
摩擦と聞くと難しいイメージがありますが、Unity内では簡単な設定で実現できます。
本記事ではそんな摩擦や跳ね返りの設定方法を解説していきます!
摩擦力とは

摩擦力とは、2つのオブジェクトの接触している面が滑るのを防止する力のことです。
摩擦力はさらに下の二つの種類に分けられます。
- 動き出すまでの抵抗力である静止摩擦力
- 動き出した後の抵抗力である動摩擦力
Unity上では、Physic Material (物理マテリアル) というものが用意されており
これをオブジェクトに設定することで摩擦力が実現できます。

摩擦力の設定方法
ここでは摩擦力を設定する方法を以下の場合に分けて解説していきます。
- 2Dの摩擦を計算したい時
- 3Dの摩擦を計算したい時
- 摩擦が効かない・止まらない時
2Dの摩擦を計算したい時
Unityの2Dプロジェクト内で摩擦力を設定したい場合は
下のようなPhysicsMaterial2Dというコンポーネントを使います。

Frictionは摩擦係数を意味し、数値が大きければ大きいほど摩擦力により物体が動きにくくなります。
Bouncinessは物体同士が衝突した時の跳ね返る強さを意味します。
値が 0 の場合は全く弾まず、値が 1 の場合はエネルギーが失われることなく弾みます。
摩擦を設定
下のような手順で2Dの場合の摩擦力が設定できます。
- Physics Material 2Dを作成
- 摩擦を設定したいオブジェクトにColliderを設定
- ColliderにPhysic Material 2Dをセットする
まずプロジェクトビュー内で右クリック→Create→2D→Physics Material 2Dをクリックします。

デフォルトでは摩擦係数が0.4、跳ね返りは全く弾まない設定になっています。

続いてキューブと地面のゲームオブジェクトを作成します。

両方のオブジェクトにBoxCollider2DとRigidbody2Dを設定しておきます。

PhysicsMaterial2Dは、オブジェクトのColliderにセットすることで設定が反映されます。
CubeのBoxCollider2D内のMaterialにPhysicsMaterial2Dをドラッグアンドドロップしましょう。

これで摩擦力が設定できたので、Cubeを動かして動きを確かめてみます。
まずはデフォルトの摩擦係数=0.4の場合です。
摩擦でだんだんとスピードが減速しているのが分かります。

続いて摩擦係数=0の場合です。
氷の上をすべるように、減速せずに進み続けます。

最後に摩擦係数=10.0の場合です。
少し動いただけで止まってしまいます。

ちなみに摩擦力を大きくすると、下のように回転してしまうことがあります。

そんなときはRigidbody2DのFreezeRotationZのチェックを入れることで回転しなくなります。

跳ね返りの設定
続いて、跳ね返りについても設定を変えて動きの変化をみてみましょう。
デフォルトのBounciness=0の場合は、下のように全く跳ね返りません。

続いてBounciness=0.5の場合です。
跳ね返り方がだんだんと小さくなっていきます。

最後にBounciness=1.0の場合です。
ずっと同じ高さで跳ね返り続けます。

3Dの摩擦を計算したい時
3Dの摩擦を計算したい時は、下のようなPhysic Materialを使います。

DynamicFrictionは動いている物体に対する摩擦の大きさです。
0の場合つるつると滑り、1の場合すぐに止まってしまいます。
StaticFrictionは静止している物体に対する摩擦の大きさです。
0の場合は簡単に動き、1の場合は強い力を加えないと物体は動きません
Bouncinessは物体同士が衝突した時の跳ね返る強さです。
Friction Combineは衝突する物体間の摩擦をどう処理するかです。
初期設定のAverageでは2つの物体の摩擦力を平均して計算します。
Bounce Combineは衝突する物体間の跳ね返りをどう処理するかです。
摩擦を設定
3Dの場合も、摩擦の設定手順は2Dの場合と同じです。
- Physics Materialを作成
- 摩擦を設定したいオブジェクトにColliderを設定
- ColliderにPhysic Materialをセットする
まずはプロジェクトビュー内で右クリック→Create→Physics Materialをクリックします。

続いて、摩擦を設定したいオブジェクトにColliderを設定しましょう。
ここでは地面としてPlaneと、Cubeを作成しましたが、デフォルトでColliderが設定されています。

Materialの項目に先ほど作成したPhysics Materialをドラッグアンドドロップします。
これを接触するオブジェクト両方に対して行いましょう。(ここではCubeとPlane)

これで摩擦力の設定ができました。
Cubeに力を加えて動きを見てみましょう。
まずは下のようなデフォルトの設定値です。


摩擦が効いてだんだんと減速しているのが分かります。
続いて下のように動摩擦力を1,静止摩擦力を0に設定してみます。


動き出しのスピードは速いですが、すぐに止まってしまいます。
続いて下のように動摩擦力を0,静止摩擦力を1に設定してみます。


動きだしのスピードは遅いですが、減速することなく同じスピードで進み続けます。
このように設定項目の数値を変えると同じ摩擦でも動きが違ってきます。
跳ね返りの設定
跳ね返りも2Dの場合と同様にBouncinessの数値を設定することで実現できます。

まずはデフォルト値の0の場合を見てみましょう。

0の場合は全く跳ね返りません。
続いてBounciness=0.7の場合を見てみましょう。

跳ね返る度にだんだんと高さが低くなっているのが分かります。
最後にBounciness=1.0の場合を見てみましょう。

ずっと同じ高さで跳ね返り続けます。
摩擦が効かない・止まらない時
摩擦が効かない場合や、止まらないなど思った通りの動きをしない時に確認したい項目を紹介します。
下のFriction Combineの設定を確認してみましょう。

Averageでは2 つの物体の摩擦力が平均化されます。
そのため衝突する二つの物体の両方にPhysic Materialをセットし、摩擦力を設定してあげましょう。
片方だけにPhysic Materialを設定している場合、平均化により摩擦力の数値が変わってしまいます。
Minimumは2 つの摩擦力のうち小さい方の値が使われるので、大きい方の値は無視されます。
Maximumはその逆で大きい方の摩擦力が使われ、小さい方の値は無視されます。
これにより設定した摩擦力の数値が動きに反映されていないことがあるので、確認してみましょう。
スクリプトから摩擦係数を変更する
スクリプトから摩擦係数を変更することができます。
例えばBoxColliderがついているオブジェクトの動摩擦力をスクリプトから1に変更したい場合はこのように書きます。
this.GetComponent<BoxCollider>().material.dynamicFriction = 1;
同じように、跳ね返りもスクリプトから変更することができます。
this.GetComponent<BoxCollider>().material.bounciness = 1;
おすすめアセット
Grabbit – Editor Physics Transforms

こちらはオブジェクトの配置を手助けしてくれるアセットです。
重力や摩擦など物理シミュレーションを行いながら配置してくれるので
乱雑に置かれた本のような、ひとつひとつ配置するのが大変なオブジェクトを簡単に配置できます。
Wheel Controller 3D

こちらはタイヤと地面との摩擦を計算し、リアルな車の運転を実現してくれるアセットです。
タイヤの大きさやパラメータを簡単に調整できたり、地面を検知するシステムも含まれていたりと
車の運転システムを作るのに非常に役立つアセットです。
まとめ
以上、オブジェクトに摩擦と跳ね返りを設定する方法を解説してきました。
摩擦と聞くと難しいイメージもありますが、Unityでは簡単に設定できてとても便利です!
リアルな動きを作るためには摩擦の設定が大事なのでマスターしちゃいましょう!