Menu
CoddyTech

発射

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

ボールは、プレイヤーが発射するまでパドルの上で待機します。それまでは、スクリプトが毎フレーム、ボールをパドルの上に配置するため、パドルが動く場所にボールも移動します。また、発射済みかどうかをboolで記憶します。発射時には、Rigidbody のlinearVelocityを一度設定します。ボールの Rigidbody は重力がオフになっているため、その後は何かにぶつかるまで、その速度でまっすぐ飛び続けます。

釣りのウキも同じように、投げるまで竿先の下にぶら下がっています。

bool cast;

void Update()
{
    if (cast) return;
    transform.position = rodTip.position + Vector3.down * 1.5f;
    if (Keyboard.current.spaceKey.wasPressedThisFrame)
    {
        cast = true;
        rb.linearVelocity = new Vector3(4f, 3f, 0f);
    }
}

wasPressedThisFrameがtrueになるのはキーを押したフレームだけなので、毎フレーム1回実行されるUpdate()で読み取ります。ウキは長さが(4, 3, 0)のベクトルで、秒速5ユニットで飛びます。任意の方向に正確な速度で発射するには、.normalizedを使って方向ベクトルの長さを1ユニットにし、それに速度を掛けます。

challenge icon

チャレンジ

簡単

Ballで:

  1. bool launchedを追加します。
  2. public void Launch(Vector3 direction)を記述します。これはlaunchedをtrueに設定し、RigidbodyのlinearVelocityを、長さが1単位になるようにした方向にspeedを掛けた値に設定します。
  3. Update()を追加します。ボールがまだ発射されていない間、ボールをパドルの位置より0.5単位上に配置し、Spaceキーが押されたときにLaunch(new Vector3(0.3f, 1f, 0f))を呼び出します。

ボールにはまだ跳ね返りがないため、最初に当たった壁で完全に止まります。次のレッスンでこれを修正します。

Playを押し、パドルを動かして発射し、最後にCheckを押します。

自分で試してみよう

using UnityEngine;
using UnityEngine.InputSystem;

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

    Rigidbody rb;

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

    // 次: Spaceで打ち出すまで、ボールはパドルの上に乗ったままにする。
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

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