[超初心者向け]Unityチュートリアル「はじめてのUnity」のブロック崩しと同等をC#で::(5)消えるブロック

  • 4
    Like
  • 0
    Comment
More than 1 year has passed since last update.

この解説は

Unityのサイトに昔からあるチュートリアルに、以下があります。
「はじめてのUnity」(旧)
http://tutorial.unity3d.jp/archive/my-first-unity/

これを独自にC#化したものをベースとしています。以下を
この解説は以下の段階があります、前の内容を実行した上でのものとして参照して下さい。現時点(20151026)では、新しい「はじめてのUnity」の玉転がしゲームが公開されています。本サイトのブロック崩しと併せて学習すると広がりがあり、初期の学習にはとても有効です。

消えるブロック

「ブロック崩し」ですから、ブロックが在って消えないとはじまりません。ブロックを配置しBallと衝突すると消えるようにしましょう。

ブロックを配置する

先ずはブロックを用意します。
上に在るメニューの[GameObject]>[3D Object]>[Cube]を選んで下さい。
Gyazo

名前を他と迷わないよう、Blockにしておきます。
Gyazo

大きさを考える

次に、どう配置するかを考えます。今回のステージの枠の内側は、TopWallの幅と一致していますから、Scaleで10の幅が在ります。
Gyazo

ここにきれいにBlockを並べたいので、整数で割り切れる大きさが望ましいことになります。ここでは判りやすい大きさとして、横の幅を2とし、横に5個を並べることにします。縦はとりあえず、そのまま1にしておきましょう。
Gyazo

位置を考える

Blockをステージの左上に一つ、配置してみましょう。このとき、Blockの座標をいくつにするかを考えます。中心点は以下になっています。

  • 左右の中心点は、幅=2なので左から1のところ
  • 上下の中心点は、高さ=1なので0.5のところ

ステージの端の角は、(-5,0,9.5)のところに在ります。ここにBlockをぴたりとおさめるには、その座標から中心点のオフセットを加算したところを、TransformPositionにすればいいことになります。
以上から、設定する値は、以下になります。

座標
Position.x -5+1=-4
Position.y 0
Position.z 9.5-0.5=9.0

Gyazo

Gyazo

Ballと衝突すると消えるようにする

消えるようにするには、当たり判定で相手がballのときに消える、という動作になります。相手を判断する方法と、消える部分の制作をします。

BallTagを入れる

当たり判定で反応したときに、その当たった相手が何かを判定するのによく用いられるのがTagです。TagはProject毎に設定できる、GameObjectに付与するキーワードです。同じTagを複数のGameObjectに付与することが可能です。
先ず、Tagの一覧にBallを追加します。
[Inspector]タブのTagのところでUntaggedをクリックして出るプルダウンから、Add tag...を選びます。
Gyazo

出てきたTagの一覧の左にある'+'をクリックし、出てきた空欄にBallを追加します。

Gyazo

Gyazo

これでBallというTagが使えるようになりました。

Ballを再度選択します。その状態で[Inspector]タブのTagのプルダウンを選ぶと、Ballが現れるのでそれを選択します。
Gyazo

Gyazo

BlockBallと当たると消える処理の追加

上記のTagを用いて、Block側で当たり判定を用意し、Ballとの当たり判定の処理を加えます。

Block.csを作成しコンポーネントに追加

Blockを選択した状態で、インスペクターの一番下にある[Add compornent]をクリックして、Scriptアセットを作成、追加します。

  • ファイル名はBlockと入力してください。
  • ファイル形式はcsを選びます。

Gyazo

[Create and Add]のボタンを押すと、Block.csが[Asset]タブにできています。
Gyazo

衝突判定の処理を入れる

Block.csをダブルクリックし、編集します。

Block.cs
using UnityEngine;
using System.Collections;

public class Block : MonoBehaviour {

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {

    }
    void OnCollisionEnter(Collision collision) {
        //衝突判定
        if (collision.gameObject.tag == "Ball") {
            //相手のタグがBallならば、自分を消す
            Destroy(this.gameObject);
        }
    }
}

内容を解説します。

code 説明
void OnCollisionEnter(Collision collision) { Scene中のGameobjectでColliderが有効な物同士が衝突すると呼び出される関数です。ぶつかった相手の情報はcollosionに入ってきます。つまり、この関数の中ではcollisionを調べると、相手が判ります。
if (collision.gameObject.tag == "Ball") { 相手のgameObjectの持っているtagの内容が"Ball"かを確認します。
Destroy(this.gameObject); Destroy関数は、引数で指定されたGameObjectをSceneから消去します。

くわしくは、以下を参考にして下さい。

これで衝突すると消えるBlockになりました。Blockになかなか衝突しない場合は、実行中にBlockを[Inspector]タブでTransformの値を変えて、ぶつかりやすくしてみましょう。


まとめ

  • 衝突はSceneにあるColliderコンポーネント同士で検出し、OnCollisionEnterが呼び出される
  • 衝突した相手を判定するには、tagで判定する方法がある
  • Destoroy関数で、Scene中のgameObjectを消すことが出来る

この解説は以下の段階があります、前の内容を実行した上でのものとして参照して下さい。