Menu
CoddyTech

パドルで狙う

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

完全に跳ね返るだけでは、プレイヤーは狙いを定められません。ブロック崩しゲームでは、ボールを打つ位置によってパドルの役割が決まります。左端近くで打つとボールは左上へ飛び、中央で打つと真上へ飛びます。

打った位置を、左端の -1 から右端の 1 までの数値に変換します。これは、パドルの中心からのボールの x 方向のずれを、パドルの幅の半分で割った値です。幅が 4 で中心が x 2 のパドルを x 3 で打った場合、ずれは 1、幅の半分は 2 なので、数値は 0.5 となり、ボールは正規化された (0.5, 1, 0) の方向へ飛びます。ボールが端を少し越えた角に当たることがあるため、この値をクランプします。

OnCollisionEnter は物理演算で跳ね返る方向が計算された後に実行されるため、そこで設定した速度がその方向を置き換えます。壁に当たった場合にもこの処理が実行されますが、壁では通常の跳ね返りを維持するため、まずタグを確認してください。collision.collider.bounds.size.x はワールド空間でのパドルの幅です。

challenge icon

チャレンジ

簡単

パドルでボールの向きを決めましょう。着地する位置によって角度が決まります。

  1. BallにOnCollisionEnter(Collision collision)を追加します。衝突したオブジェクトにPaddleタグが付いていない場合は、処理を返して終了します。
  2. float xを求めます。ボールのx座標からパドルのx座標を引き、その値をcollision.collider.bounds.size.xの半分で割り、-1から1の範囲に制限します。
  3. rb.linearVelocity = new Vector3(x, 1f, 0f).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>();
        PhysicsMaterial bouncy = new PhysicsMaterial("Bouncy");
        bouncy.bounciness = 1f;
        bouncy.dynamicFriction = 0f;
        bouncy.staticFriction = 0f;
        bouncy.bounceCombine = PhysicsMaterialCombine.Maximum;
        bouncy.frictionCombine = PhysicsMaterialCombine.Minimum;
        GetComponent<Collider>().material = bouncy;
    }

    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;
    }

    void FixedUpdate()
    {
        if (!launched) return;
        rb.linearVelocity = rb.linearVelocity.normalized * speed;
    }
}

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

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