Menu
CoddyTech

パドルを広げる

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倍になります。パドルの移動制限処理は毎ステップ幅を読み取るため、幅が広くなったパドルも壁で止まります。

challenge icon

チャレンジ

難しい
  1. PowerUpに、public enum Kind { Wide, Multiball }とpublic Kind kindを追加します(各プレハブでkindを設定します)。OnTriggerEnterを追加します。パワーアップがPaddleタグのオブジェクトに触れたとき、Wideの場合はそのオブジェクトのPaddleスクリプトでWiden()を呼び出し、どちらの種類でもパワーアップを破棄します。
  2. Paddleに、public float wideFactor = 1.6fとpublic float wideSeconds = 8fを追加し、Awake()でパドルの通常の幅(xスケール)を記憶します。
  3. 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);
    }
}
quiz icon腕試し

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

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