【Unity】物理特性マテリアルを使って摩擦を表現する実験

【Unity】物理特性マテリアルを使って摩擦を表現する実験

Unityには、オブジェクトの摩擦や跳ね返りなどを表現するために使われる物理特性マテリアルがあります。

このブログでも初心者チュートリアルの中で物理特性マテリアルを扱いました。

チュートリアルの中では、初心者向けということもあって反発係数に絞った説明を行いました。

今回はこの物理特性マテリアルの摩擦を使って色々と実験をしてみます。

 

環境

macOS 10.13 High Sierra

Unity2018.1.0f2

物理特性マテリアルの作成

物理特性マテリアルはアセットファイルとして保持されます。『Project』ウィンドウで右クリックまたは二本指タップでメニューを開き、[Create] -> [Physic Material]を選択します。

物理特性マテリアルを作成するのだポッター
物理特性マテリアルを作成するのだポッター

 

作られた物理特性マテリアルはこんな感じのアイコンになってます。バウンドしてる感じで分かりやすい。

跳ね返ってるアイコン
跳ね返ってるアイコン

 

設定項目

物理特性マテリアルの設定項目は以下のようになっています。

物理特性マテリアルの設定項目
物理特性マテリアルの設定項目

 

詳細な説明はUnityマニュアルの『物理特性マテリアル』の項目をご覧いただくとして、ここではざっくりと各項目について紹介します。

Dynamic Friction

直訳して『動摩擦』です。値として設定するのは物理で言う所の動摩擦係数ですね。動いている物体にかかる摩擦力で、小さいほど滑りやすい物体になります。

最小値は0、最大値は無限大です。

無限大とか、物体の上を滑らせる気ゼロ。乗ると吸着する床とかに使えそう。

Static Friction

こちらも直訳して『静止摩擦』です。設定するのは静止摩擦係数で、物体が動き始める前の摩擦力です。

最小値は0、最大値は無限大です。

無限大ってもはや動き出す気なし。地面の上を滑る運動はさせたくないけど、空に向かって運動します、みたいな感じでしょうか。

Bounciness

直訳すると『跳ね返り』です。設定しているのは反発係数で、オブジェクト同士が衝突した時の反発を設定できます。

最小値は0、最大値は1です。こちらは無限大までいきません。

0だと、例えば地面に落ちた時に跳ね返らずに止まります。

Friction CombineとBounce Combine

衝突するオブジェクト間の摩擦(反発係数)をどう計算するかの設定で、『Average(平均)』、『Minimum(最小値)』、『Maximum(最大値)』、『Multiply(乗算)』の4種類があります。

例えば、Dynamic Frictionの値が0.4のオブジェクトと0.8のオブジェクトがあった場合、選択した計算方法によって以下のようになります。

Friction Combine オブジェクトA オブジェクトB 結果
Average 0.4 0.8 0.6
Minimun 0.4 0.8 0.4
Maximum 0.4 0.8 0.8
Multiply 0.4 0.8 0.32

この中で若干分かりにくいのが『Multiply(乗算)』でしょうか。両方のオブジェクトに設定されている摩擦の値よりも小さくなるので、滑りやすい物体同士の摩擦をイメージするといいかも。

 

摩擦力の違いで実験

設定項目だけ見ていてもイメージが湧かないので、実際に摩擦力を変えて実験してみましょ。

地面のColliderに物理特性マテリアルをセットし、オブジェクトの滑っていく様子を観察します。

画面奥から順に、Dynamic Frictionの値を1.0/Maximum(赤)、0.5/Minimum(白)、0.1/Minimum(青)としています。なお、左側のスタート用地面と黄色いCubeオブジェクトのDynamic Frictionは白と同じく0.5にしています。

トリコロールな実験
トリコロールな実験

 

ゲーム開始時に、黄色いCubeオブジェクトに対してAddForceで力を与えます。

これらのオブジェクトにアタッチしているRigidbodyでは、ConstraintsのRotation Zを固定し、Z軸周りの回転をさせないようにしています。というのは、地面を滑る際は一定の摩擦力がかかっていて欲しいため。

この状態で実行すると以下のようになります。

Bonne chance!
Bonne chance!

 

赤の床は止まりやすく、青は滑りやすい床となりました。動摩擦係数の値がきっちり現れています。

Dynamic Frictionの値は1でも結構ブレーキがかかるので、1より大きくする必要もそこまでないかな? という感じ。

また、Sohereオブジェクトを使った場合はこちら。Cubeと同じ条件になるように、Z軸周りの回転を固定し、同じ大きさの力を加えました。

C'est la vie.
C’est la vie.

 

Sphereの回転を固定しない場合は、床によって減速された後もトルクで回転して運動を続けます。トルクで運動する分に関しては、床からの摩擦を受けていないように見えます。

Très bien.
Très bien.

 

回転するオブジェクトを減速させたい場合は、物理特性マテリアルのDynamic Frictionだけでなく、RigidbodyのAngular Dragの値も一緒に変えた方が良さそうです。

まとめ

物理特性マテリアルの中でも、摩擦に注目して動きの確認を行いました。

物体を地面の上で滑らせる時はDynamic Frictionの設定をすると吉。特に氷の上を滑る表現を使う時に便利です。

やりすぎてプレイヤーの操作が効かない! とかだとストレス要因になりがちなので、調整しつつうまく配置できるといいなぁ。

アセット作ってます!

CTA-IMAGE

Unityでの開発に役立つアセットを作っています。

3DダンジョンRPGを開発するスピードを200%加速するAssetや、ファンタジーRPGのダンジョンを彩るパーツを取り揃えています。

特に3DダンジョンRPGのゲームを1から作るのは結構時間がかかります。ダンジョン部分の作成はこうしたアセットを使って、開発をブーストさせてみませんか?