LoginSignup
14
9

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-06-19

この解説は

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を消すことが出来る

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

14
9
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
9