パワーアップをキャッチ
Coddyの「Unityゲーム:ブロック崩し」コースのレッスン 15/19。
パワーアップは自分でキャッチを検知します。トリガーコライダーがパドルのコライダーに触れ、両方のボディがキネマティックであれば、OnTriggerEnterが呼び出されます。またボールをすり抜けて落ちるため、まずタグを確認します。
enumで種類を定義し、各プレハブでインスペクターから種類を設定するので、1つのスクリプトで両方に対応できます。
public enum Kind { Wide, Multiball }
public Kind kind;
if (kind == Kind.Multiball) Debug.Log("Three balls");other.GetComponent<Paddle>()は、パワーアップが触れたオブジェクトにあるPaddleスクリプトを見つけます。現時点では、幅を広げる場合はログを出すだけです。次のレッスンでパドルを大きくします。
チャレンジ
難しいパドルで落下してくるパワーアップをキャッチします。
PowerUpにpublic enum Kind { Wide, Multiball }とpublic Kind kind;を追加します(各プレハブでkindを設定します)。OnTriggerEnter(Collider other)を追加します。other.CompareTag("Paddle")でない場合はreturnします。Wideの場合はother.GetComponent<Paddle>().Widen();を呼び出し、その後Destroy(gameObject);を実行します。Paddleに、今のところWide paddleをログに出力するpublic void Widen()を追加します。
「プレイ」を押して緑色のパワーアップをキャッチします。消えて、ConsoleにWide paddleと表示されます。その後、「確認」を押します。
自分で試してみよう
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);
}
}
Unityゲーム:ブロック崩しのすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド