幅広パドル
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倍の速さになってしまいます。パドルの範囲制限は毎ステップ幅を読み取るため、パドルが広くなっても壁で止まります。
チャレンジ
難しい幅広パワーアップを取ると、パドルが8秒間広くなります。
Paddleにpublic float wideFactor = 1.6f;とpublic float wideSeconds = 8f;を追加し、Awakeで通常時のxスケールを保持します。- Widen()は、実行中のコルーチンがあれば停止して、新しいコルーチンを開始します。xスケールを通常時の
wideFactor倍にし、wideSeconds秒待ってから、通常の大きさに戻します。 - コルーチンには
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プレイグラウンド