パドルを広げる
Coddyの「Unityゲーム:ブロック崩し」コースのレッスン 14/16。
Wide パワーアップをパドルでキャッチすると、数秒間パドルの幅が広くなります。パワーアップはキャッチを検知します。トリガーコライダーがパドルのコライダーに触れ、両方のボディがキネマティックであれば、OnTriggerEnter が呼び出されます。落下中にボールを通り抜けるので、タグも確認します。種類を定義した enum を Inspector でプレハブごとに設定すると、それぞれのパワーアップを区別できます。
時間制限のある効果はコルーチンで実装します。変更し、待機して、元に戻します。最初のコルーチンがまだ実行中にもう一度キャッチした場合は、時間を最初から計り直す必要があります。そのため、StartCoroutine が返す Coroutine を保持し、新しいコルーチンを開始する前に停止します。そうしないと、最初のコルーチンが早く終了して、2回目の効果を元に戻してしまいます。スピードブーストの例:
Coroutine boost;
public void Boost()
{
if (boost != null) StopCoroutine(boost);
boost = StartCoroutine(BoostFor(3f));
}
IEnumerator BoostFor(float seconds)
{
speed = normalSpeed * 2f;
yield return new WaitForSeconds(seconds);
speed = normalSpeed;
boost = null;
}ブーストでは、現在の速度を2倍にして後で半分にするのではなく、一度記憶した normalSpeed を基準に速度を設定します。そうしないと、ブーストが2回続けば速度は4倍になります。パドルの移動制限処理は毎ステップ幅を読み取るため、幅が広くなったパドルも壁で止まります。
チャレンジ
難しいPowerUpに、public enum Kind { Wide, Multiball }とpublic Kind kindを追加します(各プレハブでkindを設定します)。OnTriggerEnterを追加します。パワーアップがPaddleタグのオブジェクトに触れたとき、Wideの場合はそのオブジェクトのPaddleスクリプトでWiden()を呼び出し、どちらの種類でもパワーアップを破棄します。Paddleに、public float wideFactor = 1.6fとpublic float wideSeconds = 8fを追加し、Awake()でパドルの通常の幅(xスケール)を記憶します。public void Widen()を記述します。コルーチンを開始し、パドルのxスケールを通常の幅のwideFactor倍に設定して、wideSeconds待機した後、通常の幅に戻します。幅が広がっている間にもう一度取得すると、時間をリセットします。
Multiballパワーアップは取得されますが、まだ何もしません。
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()
{
float input = 0f;
if (Keyboard.current.leftArrowKey.isPressed || Keyboard.current.aKey.isPressed) input -= 1f;
if (Keyboard.current.rightArrowKey.isPressed || Keyboard.current.dKey.isPressed) input += 1f;
Vector3 target = rb.position + Vector3.right * input * speed * Time.fixedDeltaTime;
float halfWidth = transform.localScale.x / 2f;
target.x = Mathf.Clamp(target.x, -wallX + halfWidth, wallX - halfWidth);
rb.MovePosition(target);
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。