壊す
Coddyの「Unityゲーム:ブロック崩し」コースのレッスン 6/16。
レンガにはRigidbodyがありませんが、ボールにはあり、Unityは衝突時に両方のオブジェクトへOnCollisionEnterを送ります。そのため、レンガ自身が衝突に気づくことができます。レンガのスクリプトでは、gameObjectはレンガを指し、collision.gameObjectはレンガにぶつかったものを指します。
スコアはGameManagerが管理し、レンガはプレハブの複製です。プレハブはシーン外にあるアセットなので、そのフィールドからインスペクターでシーン内のGameManagerを参照することはできません。GameManagerはAwake()で静的なGameManager.Instanceに自身を設定するため、プレハブの複製も含め、どのスクリプトからでもGameManagerにアクセスできます。
プレイヤーがぶつかると砕ける花瓶:
void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.CompareTag("Player")) Shatter();
}
public void Shatter()
{
Destroy(gameObject);
}Destroy(gameObject)は花瓶を削除します。Destroy(collision.gameObject)はプレイヤーを削除し、Destroy(this)はスクリプトだけを削除して花瓶はそのまま残します。破壊処理を独立したpublicメソッドにしておけば、爆弾やパワーアップなど、ほかのコードからも花瓶を壊せます。
チャレンジ
中級GameManagerにint scoreとpublic void BrickBroken(Brick brick)を追加し、ブロックのpointsをscoreに加算します。Brickにpublic void Hit()を記述します。このブロックが壊れたことをGameManager.Instanceに伝え、その後ブロックを破棄します。BrickにOnCollisionEnterを追加します。Ballタグが付いたオブジェクトが衝突したとき、Hit()を呼び出します。
Playを押して、ブロックをいくつか壊してから、Checkを押します。
自分で試してみよう
using UnityEngine;
public class Brick : MonoBehaviour
{
public int points = 10;
// 次に、ボールがブロックを壊し、その得点を獲得します。
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。