読者です 読者をやめる 読者になる 読者になる

tanaka's Programming Memo

プログラミングについてのメモ。

(6)ブロックを消す(2015.1改訂版)

←(5)ボールを動かす(2015.1改訂版)
(7)ミスの処理(2015.1改訂版)→

ブロックを壊せるようにする

ここまでで、ボールを跳ね返すことが出来るようになった。次に、ブロックが壊れるようにしてみよう。

作業の流れ

ブロックにボールが衝突すると、
【Unity】では、RigidbodyかCharacterControllerと、何らかのColliderを持っているゲームオブジェクトが、他の何らかのCollierを持っているゲームオブジェクトに接触すると、以下のようなイベントを呼び出してくれる。

  • void OnCollisionEnter(Collision col)
    • 衝突時に呼び出される
  • void OnCollisionStay(Collision col)
    • 衝突状態から、さらに衝突し続けた時に呼び出される
  • void OnCollisionExit(Collision col)
    • 衝突状態が終わったら呼び出される

衝突相手や、接触の仕方などが引数(上ではcol)に渡される。ぶつかった両方とも関数が呼ばれる。

ブロックが消えるというのは、ブロックの行動である。よって、ブロックに処理を実装することにする。

削除プログラムを実装する

  • ブロック用のスクリプトを作成するために、【プロジェクト(Project)】ビューの[Scripts]フォルダを右クリックして、[Create]→[C# Script]を選択
  • 新しく生成されたC#スクリプトファイル名を「CBlock」に変更する
  • 作成した[CBlock]スクリプトをドラッグして、[Block]プレハブと[Block2]プレハブにドロップする
  • 【プロジェクト(Project)】ビューの[Scripts]フォルダから[CBlock]をダブルクリックする
  • MonoDevelop】が開いたら、一番最後の「}」を見つけて、その1行上に以下のプログラムを追加する。
	/** 衝突イベント*/
	void OnCollisionEnter(Collision col) {
		// 自分を削除する
		Destroy (gameObject);
	}
  • Destroy()で、指定したゲームオブジェクトをシーンから削除することができる
  • gameObjectで、自分自身のゲームオブジェクトを指定できるので、以上で自分を削除するコードになる

以上、出来たら実行してみよう。ボールがぶつかったブロックが消えるはずである。

全てのブロックが消えたら、ステージを初期化する

ブロックの数を数える

ブロックを全て壊したかを確認するには、ブロックの数をステージの開始時に覚えておき、ブロックが壊れるごとにその値を減らして、0になったかを判定すればよい。

ブロックの数を覚えておくための変数を「CBlock」スクリプトに追加する。

  • 「CBlock」スクリプトを【MonoDevelop】で開く。
  • 「public class CBlock : MonoBehaviour {」という行を探し、下の行に以下のプログラムを追加する。
	static int iBlockCnt=0;
  • 「static」は【クラス変数】にする宣言である
  • 【クラス変数】とは、クラス側に値を持たせる機能である
  • 今回のプログラムでは、CBlockクラスを持ったブロックが沢山あるが、そのブロック全てが共通のiBlockCntを参照することになる
  • これにより、ブロックが生成された時にiBlockCntを増やすと、自動的にブロックの数がiBlockCntに求められる
  • ブロックが消える時にiBlockCntを減らしていくと、ブロックが全部消えた時にiBlockCntは0になる

では、実装する。

  • 「void Start() {」という行を探して、下の行に以下のプログラムを追加する
		iBlockCnt++;
  • 「Destory(gameObject);」という行を探し、その下に以下のプログラムを追加する
		// ブロックを減らして、全滅したかを確認
		iBlockCnt--;
		if (iBlockCnt <= 0) {
			Application.LoadLevel("Game");
		}

以上のプログラムは以下のような意味である

iBlockCnt--;
  • 「iBlockCnt」を1減らす
if (iBlockCnt <= 0) {
  • 減らした「iBlockCnt」の数が、0以下かを確認する
Application.LoadLevel("Game");
  • シーンの読み出し処理。Gameシーンに切り替えて、面を初期化している
  • 別の面を作った場合は、次の面のシーンを呼び出せば、次の面に移動できる。

以上で、クリア処理が出来上がる。頑張って、全てのブロックを消してみよう。

(2015/2/7以前に、ボールを作った人は、ボールがブロックに当たると速度が落ちて、クリアが難しくなると思われる。(5)の「ボールの摩擦をなくす」の項目を追加したので、設定を確認してみてください)

ここまでの「CBlock.cs」

using UnityEngine;
using System.Collections;

public class CBlock : MonoBehaviour {
	static int iBlockCnt=0;

	// Use this for initialization
	void Start () {
		iBlockCnt++;
	}
	
	// Update is called once per frame
	void Update () {
	
	}

	/** 衝突イベント*/
	void OnCollisionEnter(Collision col) {
		// 自分を削除する
		Destroy (gameObject);
		// ブロックを減らして、全滅したかを確認
		iBlockCnt--;
		if (iBlockCnt <= 0) {
			Application.LoadLevel("Game");
		}
	}
}

←(5)ボールを動かす(2015.1改訂版)
(7)ミスの処理(2015.1改訂版)→