『入る学科間違えた高専生』の日記

プログラミングのコードを書いたりする予定です。あとは日記等。あといつまで高専生やねん

【ブロック崩し】Unityを始めて使っていた頃を思い出してみる

Unityを入れて初日にとりあえず何か作ろうということで
まずはブロック崩しを作ろうと思い、ブロック崩しを作り始めました。

作る前にやっぱり予備知識が欲しいというわけでドットインストールをみました

【旧版】Unity入門 (全26回) - プログラミングならドットインストール

一応黒歴史としてGitHubには公開しています。良ければ見てやってください。
プルリクは気軽にどうぞ!

https://github.com/nnsnodnb/Destroy_Blocksgithub.com

それでは見て行きましょう!


f:id:nanashinodonbee:20150401032758p:plain

私がUnityで使っているレイアウトはこんな感じです。

f:id:nanashinodonbee:20150401032858p:plain

デザインはお好きな様にどうぞ


1. 下の画像のようにオブジェクトを適当に置いていってください。

Blockはプレファブ化してあげたほうがいいので2.からやってあげてください

f:id:nanashinodonbee:20150401033211p:plain

2. Blockの設定

あとから必要になるので画像で黄緑にしている「Block」を選択しInspectorよりタグを付けてあげる。適当な名前でいいです。

f:id:nanashinodonbee:20150401033528p:plain

3. ボールが動くようにしてあげる

f:id:nanashinodonbee:20150401034258p:plain

動いた!! これは普通に

function Update()
{
    transform.position.x += 0.48 ;
}

とかで動いてくれます。 Y軸で動かしてる方は重力があるので気をつけてくださいね。ていうかRigidbodyのGravityは外しておいてください。
この時点ではバウンドしないのでGitHubのコードを参考にしてみてください。

4. バーを動かす

はじめはマウスの位置情報を毎フレームゲットしてあげてやっていたんですが、やっぱりしっくりこないということでキーボード入力を受け付けるようにしました。

function Update () {

    if(Input.GetKey(KeyCode.A))
    {
        transform.Translate(transform.forward * 0.2 ) ;
    }
    if(Input.GetKey(KeyCode.D))
    {
        transform.Translate(transform.forward * -0.2 ) ;
    }
}

これで移動ができます。
が!
これでは壁を付き抜けていきますw

さぁどうしようということでとりあえず、考える。

Math.Clampだな。リファレンスをみることを覚えたのであった。

if(transform.position.z <= -14.0 || transform.position.z >= 14.0)
{
    var zPos : float ;
    zPos = Mathf.Clamp(transform.position.z , -14.0 , 14.0) ;
    transform.position = Vector3(1.5 , 0 , zPos) ;
}

数字の部分は各自調整でお願いします。
Update関数に追加してあげてください

これで行けるんじゃないか??

f:id:nanashinodonbee:20150401035730p:plain

位置はまぁまぁだけど移動制限ついたしいんじゃね??

5. ブロックが破棄されるようにしてみよう

とりあえず、ドットインストールで培っただけの知識でBlockのスクリプトを書いてあげる

#pragma strict
function OnColliionEnter()
{
    Destroy(gameObject) ;
}

これで何かしらのオブジェクトが衝突してきたらBlockを削除できる。

6. ゲームオーバー判定

Ballスクリプトに追加してあげよう
BarのX軸をコピペして以下

if(transform.position.x < 1.48)
{
    Application.LoadLevel("GameOver") ;
}

「Application.LoadLevel()」でシーン移動ができます。おい!出来ねーぞ!って方はどうぞコメントください。
説明が面倒くさいのでここでは省かせて頂きます。
Update関数に追加記入でお願いします。

これでGameOverのシーンを追加してあげてBallがBarよりも下に位置するように鳴ったらGameOverシーンに移動してくれます。

7. ゲームクリア判定

もしかしたら以下のコードでちゃんと動いてくれるかもしれませんので参考までに書いておきます。

Ballスクリプトに追加お願いします。

var cnt : int = 15 ;
function OnCollisionEnter(col : Collision)
{

    if(col.gameObject.CompareTag("Block"))
    {
        cnt-- ;
        if(cnt == 0)
        {
            Application.LoadLevel("GameClear") ;
        }
    }
}

簡単に説明すると、Blockの個数を持っているcntという変数を用意して、
Blockに衝突するたびに-1をして、cntが0になったらゲームクリアのシーンに移動する
というものです。

多分これでも行けると思うんですが、一昔の話でどのコードでチャレンジしたか忘れちゃったので
わからないんですが、こんな感じに作ってダメだった記憶があります。

なのでググってC#に手を出しました。
C#っていってもC言語と同じような処理しかしないコード内容なのでいいかなぁって感じです。

GitHubに公開しているコードがこれです。

using UnityEngine ;

public class GameClearScript : MonoBehaviour {

    static int Blockcnt ;

    // Use this for initialization
    void Start () {

        Blockcnt = GameObject.FindGameObjectsWithTag("Block").Length ;

    }

    public void setDamage() {
        Destroy(gameObject) ;

        Blockcnt--;
        if (Blockcnt == 0) {
            Application.LoadLevel("GameClear") ;
        }
    }

}

こんな感じです。
基本的に内容はさっきと同じです。
ただ、BallスクリプトであるJSからデータの呼び出しを受けています。
setDamageはBallがBlockに衝突する度に呼ばれて動作をしています。

Blockcnt = GameObject.FindGameObjectsWithTag("Block").Length ;

ここなんですが、Blockというタグを持つものをゲーム画面から探しだしてその個数を返す
というものになっています。

あとは、JSの時の説明と同じです。JSでも上のようなライブラリがあると思うんですがねw

8. 最終調整

あとはお好みに合わせてどんどん機能やデザインを設定していってください。


最後に

こんな感じに適当にやっていって3時間ちょっとぐらいでブロック崩しがモノとして出来上がりました。

特にいうことがないのでここら辺で閉めさせていただこうと思います。

それではよいUnityライフを!


関連記事

Unityを使ってシューティングゲームもどきを作ったお話 - 『入る学科間違えた高専生』の日記