Unity入門記録 03
ブロック崩しを仕上げる
前回に引き続きブロック崩しを進める。 今回はゲームクリアと、ゲームオーバーを実装する。
ゲームオーバーの実装
簡単そうなのでこちらから。
これは前回と同じように当たり判定OnCollisionEnterを使い、下のバーとの当たり判定を見ればいい。
下のバーのGameObjectを取得できればほぼ終わり。
GameObjectを取得する方法でとりあえず知っているのはFindを使う方法だけなので、Hierarchyパネルで下のバーに一意な名前をつけて取得しやすくする。
BottomBarという名前をつけた。
![]()
ゲームオーバー画面は後で作るとして、ひとまず「ボールを消す」ということでゲームオーバーを表現した。
コードはこんな感じで、BallController内に実装した。
function OnCollisionEnter(col:Collision) {
    var blocks = GameObject.Find("Blocks");
    if (col.transform.IsChildOf(blocks.transform)) {
    	Destroy(col.gameObject);
    }
    var bottomBar = GameObject.Find("BottomBar");
    if (col.gameObject == bottomBar) {
    	Debug.Log("Game Over");
    	Destroy(this.gameObject);
    }
}
BallControllerにゲームオーバー処理などを書いていくのは、プログラムの規模が大きくなると良くないことが起きるのは容易に想像できるが、今回は気にしないでおく。
ゲームクリアの実装
ブロック崩しは、ブロックがなくなったらクリアだ。
すべてのブロックはBlocksの子にしてあるので、Blocksの子が0になったらクリアでいいだろう。
子の数え方がわからないので調べる。
前回の経験上、子関係のものはTransformにありそうなので、ドキュメントのTransformの項を眺めてたらベストなプロパティがあった。
これでできそうだ。
function OnCollisionEnter(col:Collision) {
    var blocks = GameObject.Find("Blocks");
    if (col.transform.IsChildOf(blocks.transform)) {
    	Destroy(col.gameObject);
    	// Check Count of Balls.
    	if (blocks.transform.childCount == 0) {
    		Debug.Log("Clear!!");
    		Destroy(this.gameObject);
    	}
    }
    var bottomBar = GameObject.Find("BottomBar");
    if (col.gameObject == bottomBar) {
    	Debug.Log("Game Over");
    	Destroy(this.gameObject);
    }
}
ブロックとの当たり判定の中で残りのブロック数をチェックして0ならクリアだ。
先ほどと同様に、ボールを消すことでクリアとした。
だが、これではダメだった。
Destroy()の直後はまだ実際にオブジェクトは削除されていないようで、カウントが減らなかった。
ドキュメントを読んでみるとしっかりと書いてあった。
Object.Destroy > Actual object destruction is always delayed until after the current Update loop
ということ毎ループ、ブロックの残りの数を数えることにした。
ブロック崩し位なら対して影響なさそうだが、本当はあまり無駄な処理を毎ループ行うべきではない。
毎ループ処理をしたいときは、Update()の中に処理を書けば良い。
#pragma strict
var speed = 5;
function Start () {
	rigidbody.AddForce((transform.forward + transform.right) * speed, ForceMode.VelocityChange);
}
function Update () {
	var blocks = GameObject.Find("Blocks");
	// Check count of remaining blocks.
	if (blocks.transform.childCount == 0) {
    		Debug.Log("Clear!!");
    		Destroy(this.gameObject);
    }
}
function OnCollisionEnter(col:Collision) {
    var blocks = GameObject.Find("Blocks");
    if (col.transform.IsChildOf(blocks.transform)) {
    	Destroy(col.gameObject);
    }
    var bottomBar = GameObject.Find("BottomBar");
    if (col.gameObject == bottomBar) {
    	Debug.Log("Game Over");
    	Destroy(this.gameObject);
    }
}
とりあえず遊べる感じになった
まとめ
少しわかってきたので、ドキュメントを眺めるようにしよう。
次回は、シーン遷移をやってみたいので、シーン遷移させてゲームクリアの画面を表示させるようにする。
ソースコードはgithub
tagはpractice03です。
