パドル
Coddyの「Unityゲーム:ブロック崩し」コースのレッスン 1/16。
このコースでは、3Dのブリックブレーカーを作ります。画面下部にあるパドル、壁の間を跳ね返るボール、そして壊すブロックの壁が登場します。各レッスンで、ブロック、残機、レベル、ゲームオーバー画面、パドルを広げたりボールを分裂させたりするパワーアップなど、機能を1つずつ追加します。シーンの準備はできています。カメラは正面からプレイフィールドを映し、すべてのオブジェクトは z = 0 の x-y 平面上を動きます。スクリプト Paddle、Ball、Brick、GameManager、PowerUp は、現時点では簡単なスタブです。
パドルにはキネマティックな Rigidbody があり、FixedUpdate 内で MovePosition を使って動かします。これにより、物理演算でパドルの動きが認識され、後でボールが跳ね返る際にその動きを利用できます。キネマティックボディは、Rigidbody を持たないコライダーによって止められることがないため、側面の壁に押し戻されることはありません。スクリプトで範囲内に収めます。壁の位置で中心を制限すると、オブジェクトの半分が壁の中に入り込んでしまうため、制限位置は壁からオブジェクトのサイズの半分だけ内側になります。y = 0 から y = 12 までのシャフト内を動くこのエレベーターは、y軸上で次のように制限されます。
float halfHeight = transform.localScale.y / 2f;
Vector3 target = rb.position + Vector3.up * input * liftSpeed * Time.fixedDeltaTime;
target.y = Mathf.Clamp(target.y, 0f + halfHeight, 12f - halfHeight);
rb.MovePosition(target);ここで input は上昇時に 1、下降時に -1、それ以外の場合は 0 です。高さが2ユニットのエレベーターは、中心が1から11の間に保たれるため、両端はちょうど0と12で止まります。Cube プリミティブは各辺が1ユニットなので、localScale.y はエレベーターの高さです。毎ステップその値を読み取ることで、ゲームの実行中にサイズが変わっても制限が正しく保たれます。
チャレンジ
簡単Paddle の FixedUpdate() にパドルの移動処理を書きます。
float inputを作成します。左矢印キーまたは A キーを押している間は -1、右矢印キーまたは D キーを押している間は 1、それ以外の場合は 0 にします。- 目標位置を計算します。Rigidbody の位置から、右方向に
input * speed * Time.fixedDeltaTimeだけ移動した位置です。 - パドルの端が壁の内側の面
-wallXとwallXで止まるよう、目標位置の x を制限します。パドルの幅はtransform.localScale.xです。 rb.MovePositionでその位置に移動します。
Play を押して、パドルを両方の壁に当ててから、Check を押します。
自分で試してみよう
using UnityEngine;
using UnityEngine.InputSystem;
public class Paddle : MonoBehaviour
{
public float speed = 14f;
public float wallX = 8f; // 左右の壁の内側の面は -wallX と wallX の位置にある
Rigidbody rb;
void Awake()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
// 矢印キーまたは A キーと D キーで移動し、壁の間にとどまる。
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。