発射
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ユニットにし、それに速度を掛けます。
チャレンジ
簡単Ballで:
bool launchedを追加します。public void Launch(Vector3 direction)を記述します。これはlaunchedをtrueに設定し、RigidbodyのlinearVelocityを、長さが1単位になるようにした方向にspeedを掛けた値に設定します。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で打ち出すまで、ボールはパドルの上に乗ったままにする。
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。