速度を保つ
Coddyの「Unityゲーム:ブロック崩し」コースのレッスン 3/19。
ブリックブレーカーのボールは決して減速しません。物理マテリアルがほとんどの役割を果たします。反発係数を1にすると、跳ね返るときに速度がすべて保たれ、摩擦を0にすると、壁に引きずられて速度が落ちるのを防げます。壁にはマテリアルが設定されておらず、Unityはデフォルトで2つのコライダーの値を平均します。ボールの1と壁の0では、跳ね返ったときの速度は半分になります。bounceCombine = MaximumとfrictionCombine = Minimumを設定すると、ボール自身の値が優先されます。
それでも物理演算は正確ではありません。動いているパドルの速度が加わり、数百回の跳ね返りを繰り返すうちに小さな誤差が積み重なります。そのため、物理演算の各ステップでボールの向きを保ち、速度を設定し直します。
rb.linearVelocity = rb.linearVelocity.normalized * 7f;速度が毎秒2ユニットまで落ちたボールも、次のステップでは再び7の速度で飛びます。
チャレンジ
簡単ボールが一定の速度で永遠に跳ね返るようにしましょう。
BallのAwake()で、反発力を 1、両方の摩擦を 0 にしたnew PhysicsMaterial("Bouncy")を作成し、bounceCombine = PhysicsMaterialCombine.MaximumとfrictionCombine = PhysicsMaterialCombine.Minimumを設定します。それをGetComponent<Collider>().materialに設定します。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プレイグラウンド