Menu
CoddyTech

幅広パドル

Coddyの「Unityゲーム:ブロック崩し」コースのレッスン 16/19。

時間制限のある効果はコルーチンで実装します。変更し、待機し、元に戻します。最初の効果が実行中にもう一度キャッチした場合は、時間を最初から数え直す必要があります。そのため、StartCoroutineが返すCoroutineを保持し、新しいコルーチンを開始する前に停止します。そうしないと、最初のコルーチンが早く終了し、2回目の効果を元に戻してしまいます。速度を上げる例:

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;
}

速度は、1か所で保持しているnormalSpeedを基準に設定します。現在の速度を倍にするわけではありません。速度を2回続けて上げると、4倍の速さになってしまいます。パドルの範囲制限は毎ステップ幅を読み取るため、パドルが広くなっても壁で止まります。

challenge icon

チャレンジ

難しい

幅広パワーアップを取ると、パドルが8秒間広くなります。

  1. Paddleにpublic float wideFactor = 1.6f;とpublic float wideSeconds = 8f;を追加し、Awakeで通常時のxスケールを保持します。
  2. Widen()は、実行中のコルーチンがあれば停止して、新しいコルーチンを開始します。xスケールを通常時のwideFactor倍にし、wideSeconds秒待ってから、通常の大きさに戻します。
  3. コルーチンにはusing System.Collections;が必要です。

「プレイ」を押して、緑色のパワーアップを取りましょう。パドルが大きくなり、その後元の大きさに戻ります。その後、「確認」を押します。

自分で試してみよう

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);
    }

    public void Widen()
    {
        Debug.Log("Wide paddle");
    }
}

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

自分で練習してみよう: Unityプレイグラウンド