Menu
CoddyTech

速度を保つ

Coddyの「Unityゲーム:ブロック崩し」コースのレッスン 3/19。

ブリックブレーカーのボールは決して減速しません。物理マテリアルがほとんどの役割を果たします。反発係数を1にすると、跳ね返るときに速度がすべて保たれ、摩擦を0にすると、壁に引きずられて速度が落ちるのを防げます。壁にはマテリアルが設定されておらず、Unityはデフォルトで2つのコライダーの値を平均します。ボールの1と壁の0では、跳ね返ったときの速度は半分になります。bounceCombine = MaximumとfrictionCombine = Minimumを設定すると、ボール自身の値が優先されます。

それでも物理演算は正確ではありません。動いているパドルの速度が加わり、数百回の跳ね返りを繰り返すうちに小さな誤差が積み重なります。そのため、物理演算の各ステップでボールの向きを保ち、速度を設定し直します。

rb.linearVelocity = rb.linearVelocity.normalized * 7f;

速度が毎秒2ユニットまで落ちたボールも、次のステップでは再び7の速度で飛びます。

challenge icon

チャレンジ

簡単

ボールが一定の速度で永遠に跳ね返るようにしましょう。

  1. Ball の Awake() で、反発力を 1、両方の摩擦を 0 にした new PhysicsMaterial("Bouncy") を作成し、bounceCombine = PhysicsMaterialCombine.Maximum と frictionCombine = PhysicsMaterialCombine.Minimum を設定します。それを GetComponent<Collider>().material に設定します。
  2. FixedUpdate() を追加します。発射済みの場合は、rb.linearVelocity = rb.linearVelocity.normalized * speed;

「プレイ」を押して発射します。ボールは速度を落とさず、すべての壁で跳ね返ります。その後、「確認」を押します。

自分で試してみよう

using UnityEngine;
using UnityEngine.InputSystem;

public class Ball : MonoBehaviour
{
    public Transform paddle;
    public float speed = 9f;

    Rigidbody rb;
    bool launched;

    void Awake()
    {
        rb = GetComponent<Rigidbody>();
    }

    void Update()
    {
        if (launched) return;
        transform.position = paddle.position + Vector3.up * 0.5f;
        if (Keyboard.current.spaceKey.wasPressedThisFrame) Launch(new Vector3(0.3f, 1f, 0f));
    }

    public void Launch(Vector3 direction)
    {
        launched = true;
        rb.linearVelocity = direction.normalized * speed;
    }
}

Unityゲーム:ブロック崩しのすべてのレッスン

自分で練習してみよう: Unityプレイグラウンド