←(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"); } } }