パドル
Coddyの「Unityゲーム:ブロック崩し」コースのレッスン 1/19。
このコースでは、3DのBrick Breakerを作ります。パドル、跳ね返るボール、ブロックの壁、ライフ、レベル、パワーアップを備えたゲームです。すべてのオブジェクトは、zが0のx-y平面上を動きます。スクリプトのPaddle、Ball、Brick、GameManager、PowerUpは、今のところスタブです。「プレイ」を押すとゲームが実行され、「確認」を押すと採点されます。
パドルにはキネマティックRigidbodyがあり、FixedUpdate()内でrb.MovePositionを使って動かすため、物理演算はパドルの動きを認識します。キネマティックボディは壁を通り抜けるため、スクリプトで壁の内側に留めます。中心を壁の位置でクランプすると、パドルの半分が壁に入り込んでしまいます。制限位置は、壁の位置から幅の半分を差し引いた値です。壁が-6と6にあり、パドルの幅が2の場合は、次のようになります。
float half = 2f / 2f;
target.x = Mathf.Clamp(target.x, -6f + half, 6f - half);
rb.MovePosition(target);中心は-5から5の間に保たれるため、パドルの端は壁の位置でぴったり止まります。毎ステップtransform.localScale.xから幅を読み取ることで、パドルが大きくなっても制限位置は正しく保たれます。
チャレンジ
簡単パドルを壁の間で動かしましょう。
PaddleのFixedUpdate()で、左矢印キーまたは A キーを押している間はfloat inputを -1、右矢印キーまたは D キーを押している間は 1、それ以外は 0 にします。Vector3 target = rb.position + Vector3.right * input * speed * Time.fixedDeltaTime;を計算します。float half = transform.localScale.x / 2f;として、target.xを-wallX + halfとwallX - halfの間に制限し、その後rb.MovePosition(target);を実行します。
「プレイ」を押して、両方の壁まで滑らせてみましょう。パドルはそれぞれの壁で止まります。その後、「確認」を押します。
自分で試してみよう
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 キーで移動し、壁の間にとどまる。
}
}
Unityゲーム:ブロック崩しのすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド