Unityでオブジェクト同士の跳ね返りや摩擦を調整したい時に利用する物理マテリアル(正式名称は物理特性マテリアル)について解説します。
例として床にボールを弾ませる(バウンドさせる)、床のキューブを滑らせるの2点について実践してみます。
プロジェクトの準備
プロジェクトを新規作成します。
Hierarchyウインドウから + > 3D Object > Plane を作成します。

y軸に対してx軸が右手になる視点にしておきます。(色は分かりやすいようにマテリアルを使ってつけてあります)

これを床とします。
床に落ちてくるボールも作っておきます。
+ > 3D Object > Sphere として球体を配置します。

ボールは少し床(Plane)の上方に配置しておきます。(色は適当にマテリアルでつけました)

ボールが床に落ちてくるようにします。
Sphereを選択してInspectorウインドウのAdd Componentボタンをクリック、
Phisics > Rigidbody
として重力を適用させておきます。

とりあえずこの状態で実行確認してみます。

物理マテリアルを設定しないと、床に落ちても弾みません。
次に物理マテリアルを作って違いを確認してみます。
物理マテリアルを作る
物理マテリアルを作ります。
Assetsウインドウの中の何もないところで
右クリック > Create > Physic Material を選択します。

名前はyukaとしておきます。(物理マテリアルのアイコンは分かりやすいですね!)

作成したyukaをクリックしてInspectorウインドウを見てみてください。
デフォルトではこのような設定になっているかと思います。

細かい説明は後にして、とりあえず使ってみます。
物理マテリアルを床に適用する
物理マテリアルをシーン上のオブジェクトに適用するにはドラッグ&ドロップするだけです。
作成したyukaをPlaneにドラッグ&ドロップしてください。

物理マテリアルは、オブジェクトのColliderに追加されるようになっています。
Planeをクリックし、Inspectorウインドウを見ると物理マテリアルがMesh Collider(Planeオブジェクトの場合)にMaterialとして追加されているのが分かります。

ドラッグ&ドロップ以外での物理マテリアル追加方法として、ColliderのMaterialにある右端の◎をクリックしてAssetsに存在する物理マテリアルを選択することも出来ます。(物理マテリアルの設定を無効にする場合はこのウインドウでNoneを選択します)

再度、実行確認してみましょう。

全然変わりません!
物理マテリアルのデフォルト設定では弾まないことが分かります。
これでは意味がないので、物理マテリアル(yuka)のプロパティBouncinessを0から1に変更して実行してみます。

これで自然な感じで弾むようになりました。

ちなみにBounceは0.0~1.0の範囲の値をとります。0が弾まない、1が弾む最大値と考えてください。
物理マテリアルをきちんと扱うには物理マテリアルのプロパティについて理解する必要があります。
次の項目で詳しく見ていきます。
物理マテリアルのプロパティ
いきなりですが、公式マニュアルが詳しいです!(当たり前だけど)

まず公式マニュアルを見るのが基本だと思います。
読んでも分からないことも多いんですが、個人的にはマニュアルを読むのが好きです。
一応公式マニュアルを簡略化した説明です。

全然簡略化されていませんね!
Bounce、Bouncinessが弾み関係、Frictionという言葉が摩擦関係と覚えておけば大丈夫です。
実際に使ってみましょう。
【実例1】床にボールを弾ませる
ここまでの状態ですでにボールが弾みますが、プロパティを調整してみます。
yuka(物理マテリアル)のBounce CombineをMaximumにしてみてください。

Bounce CombineのMaximumは、物体同士の弾みの大きい方の値をとるため、実行すると最大の弾みとなります。

この設定は、一見ボールの元の高さまで弾んでいるように見えますが、違います。
5分ほどそのまま実行していたら、ボールが見えない位置まで弾むようになってしまいました。要するにどんどん高く弾んでいく状態です。(重力を無視していますね)
弾み方が予想と違うようならBouncinessの値を0.95などと微調整する必要がありますね。(ちなみに0.98でもどんどん高くなりました)
【実例2】床のキューブを滑らせる
Sphereでは滑り具合が分かりにくい為、Sphereは一旦シーンから削除します。
+ > 3D Object > Cube
として立方体を作って下さい。

立方体(Cube)を床の上方に配置します。

InspectorウインドウのAdd Componentボタンで Physics > Rigidbody を追加します。

物理マテリアル(yuka)のプロパティを変更していなければ、先ほどのSphere同様にCubeは弾むと思います。
床を滑らせてみる為に物理マテリアルのプロパティ値を次のように変更します。

滑らせるため、摩擦関係を全て0(Dynamic FrictionとStatic Frictionを0)としました。
跳ね返りが大きいと滑っているか確認できないため、Bouncinessも0としておきます。
値を全て0としたため、Friction CombineとBounce Combineの双方をMinimumとして、なるべく小さい方の値を採用できるようにしました。
物体を垂直に落としただけでは滑りませんので、床(Plane)を少し傾けておきます。
Planeを選択し、InspectorウインドウのTransformのRolationの項目を変更します。
わたしの場合、Rotation X軸を -20 として手前に滑ってくるように傾けました。
ご自身のシーン上の視点によりX軸またはZ軸方向の傾きの値を変更してみてください。
では実行してみます。

うまく滑り落ちてきました。

試しにUnity-Chan! Modelにある3Dモデルをこの床においてみました。
ちゃんと滑り落ちていきました!

以上、Unity:物理マテリアルの作り方と使い方でした。
コメント