跳ね返りと摩擦
CoddyのUnityジャーニー「物理演算とゲームプレイ」セクションの一部。レッスン 12/71。
コライダーの跳ね返り方や滑り方は、その 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になります。
チャレンジ
簡単トランポリンと氷に、それぞれ独自の反発力と摩擦を設定しましょう。
Start()で、PhysicsMaterial mat = GetComponent<Collider>().material;を使い、mat.bounciness = bounce;、mat.dynamicFriction、mat.staticFrictionにfrictionを設定します。mat.bounceCombine = PhysicsMaterialCombine.Maximum;とmat.frictionCombine = PhysicsMaterialCombine.Minimum;を設定して、表面独自の値が優先されるようにします。
「プレイ」を押すと、ボールはトランポリンで高く跳ね返ります。その後、「確認」を押します。
自分で試してみよう
using UnityEngine;
public class Surface : MonoBehaviour
{
public float bounce = 0f;
public float friction = 0.6f;
void Start()
{
// この collider に bounce と friction を設定した専用の material を割り当てる
}
}
物理演算とゲームプレイのすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド