跳ね返りと摩擦
CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 12/63。
コライダーの跳ね返り方や滑り方は、その PhysicsMaterial(Unity 6での名称。旧バージョンではPhysicMaterialと呼ばれていました)によって決まります。bouncinessは0(跳ね返らない)から1(速度をすべて保つ)までの値です。dynamicFrictionは滑っている物体の速度を落とし、staticFrictionは、静止している物体が滑り始めるまでにどれほど強く押す必要があるかを決めます。マテリアルのないコライダーは、摩擦係数0.6、反発係数0として動作します。このスーパーボールは、自分自身のコライダーに弾むマテリアルを設定します。
void Start()
{
PhysicsMaterial mat = GetComponent<Collider>().material; // このコライダー固有のコピー
mat.bounciness = 0.9f;
mat.bounceCombine = PhysicsMaterialCombine.Maximum;
}接触するコライダーは2つあるため、Unityはそれぞれの値を組み合わせます。各マテリアルは、反発係数にはbounceCombine、摩擦にはfrictionCombineを使って組み合わせ方を指定し、どちらも4つのモード、Average(デフォルト)、Minimum、Multiply、Maximumのいずれかを選びます。2つのコライダーが異なるモードを指定している場合、リストの後ろにあるモードが優先されます。マテリアルのない床では、Averageを使うとボールの値は(0.9 + 0) / 2 = 0.45になります。Maximumを使うと、跳ね返るたびに速度の0.9を保ちます。高さは速度の2乗に比例するため、これは高さの0.9 x 0.9 = 81%に相当します。
.materialは、このコライダーにマテリアルのコピーを作成するため、変更はこのコライダーだけに影響します。.sharedMaterialはマテリアルアセットそのもので、これを使うすべてのコライダーで共有されます。また、マテリアルが設定されたことのないコライダーではnullです。
チャレンジ
簡単プレイグラウンドに表面を設定しましょう。Surfaceスクリプトは、青いトランポリン(bounce 0.8、friction 0.6)と氷の帯(bounce 0、friction 0.1)に付いています。ボールと木箱には、それぞれ独自のマテリアルはありません。
Start()で、このコライダー自身のマテリアルにbounceとfrictionを設定します(動摩擦と静止摩擦の両方)。- 表面に着地したものは表面の
bounceをすべて使って跳ね返り、その上を滑るものには、マテリアルを持たない物体の0.6との混合ではなく、表面固有のfrictionを適用します。
Playを押してボールが跳ねる様子を見てから、Checkを押してください。木箱も氷の上を滑ります。
自分で試してみよう
using UnityEngine;
public class Surface : MonoBehaviour
{
public float bounce = 0f;
public float friction = 0.6f;
void Start()
{
// この collider に bounce と friction を設定した専用の material を割り当てる
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。