Unityの2Dゲームで床や壁に「摩擦」・「跳ね返り(反発)」を設定していきます。
はじめに
Unityのバージョンは2021.3.14f1です。
「PhysicsMaterial2D」を利用して2Dゲームの床に「摩擦」や「跳ね返り」を設定していきます。
実装開始
簡単に画面を作成して動きの違いを見ていきます。
オブジェクトの作成
Hierarchyメニューで右クリックして、「2D Object」→「Sprite」→「Square」と「Circle」を追加。
Squareは床にします。Position、Scale、色を変更して「AddComponent」から「BoxCollider2D」をアタッチ。
Circleには「Rigidbody2D」と「CircleCollider2D」をアタッチ。
この状態で再生するとボールが落ちていき、床で止まります。下記の様な感じですね。
床にもボールにも「跳ね返り(反発)」が設定されていない状態ですね。
跳ね返り(反発)の設定
床にボールが落ちてきたら、跳ね返るようにします。トランポリンのようなイメージですね。
プロジェクトのAssetsフォルダ内で「Create」→「2D」→「PhysicsMaterial2D」を追加。
Inspector画面で、Friction(摩擦係数)とBounciness(弾力性)の設定ができます。下記の様にすると「摩擦が無し(Friction=0)」、「完全跳ね返り(Bounciness=1)」となります。
設定したマテリアルを床のBoxCollider2Dにセット。
この状態で再生すると下記の様に床にぶつかると跳ね返りバウンドします。
摩擦の設定
床に摩擦を設定していきます。まずはボールが回転しないようにRigidbody2DのFreezeRotationZにチェックを入れて固定します。また、Movementと言う名前でスクリプトをアタッチ。
スクリプトの中は下記のように変更します。キーボードの入力でボールに力を加えています。
using UnityEngine; public class Movement : MonoBehaviour { private Vector2 _move; private float _force = 3.0f; private Rigidbody2D _rb; void Start() { _rb = GetComponent<Rigidbody2D>(); } void Update() { _move = new Vector2(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical")); _rb.AddForce(_move * _force); } }
PhysicsMaterial2DのFrictionを0、Bouncinessを0に変更して実行してみます。すると、下記のようにツルツルした床になります。
Frictionの値を上げると摩擦のある床になります。