【Unity】落ちゲーを作ろう!(02)ブロックを落とす

スポンサーリンク

Unityで落ちげーをつくるシリーズの第2弾!
前回はプロジェクトを作るところまで行いましたので、今回は初期ブロックを配置して落下させる事をしてみたいと思います。

この連載では、その時々の機能をどうやって実現させるかに重点を置きます。
その為、必要な実装を必要な時に行うので、常時既に書いていたコードをガシガシ書き換えていきます。
予め完成形を想定しての実装では無いため、効率悪い実装の仕方になるので、ご注意ください。
(普通なら、今後を考えて予め定数やメソッド化するようなものも、必要になるまでやらないと思います)
また、クラス(スクリプト)も極力まとめる予定です。
(これは、クラス構成を考えると、慣れていない人はそこで思考停止してしまう可能性があると思うからです。
スクリプトを分離する場合は、どうして分離するのかの考え方を説明して分離する予定です)

また、どうやって作るかに焦点を当てたい為、基本的な操作に関する説明は省略する予定です。
必要があれば、別記事で説明する形を取ろうと思います。

スポンサーリンク

何から作る?

さて、実際に落ちゲーを作り始めたいと思いますが……まずは何から手を付けましょうか?
ブロックや背景の画像から用意したり、音の素材を用意してBGMを鳴らすところから作ったり…あるいはブロックを左右に動かす処理から作ったり……作り方は人それぞれと思いますし、正解は無いと思います。
ですが、落ちゲーと言えば『ブロックが自動的に落下する動き』がポイントになると思いませんか? 何と言っても落ちゲーですから、落ちないとね!
と言う事で、今回はそこから作っていこうと思います。
自動落下を作って、左右に移動できるようにして、ブロックの移動領域を制限して、ブロックが積み上がるようにして……と、そんな感じで少しずつ進めていければと思います。

ブロックを配置

それでは、まずは落下させるブロックを作りましょう。落下対象が無いと話になりませんからね。
今回はブロック形状をシンプルな四角形とします。
円形でも三角形でも★型でも、何でも良いけど、ここでは分かりやすく四角形にしておきます。

四角形のオブジェクトを配置

四角形のオブジェクトはUnityに予め用意されているので、それを作成するだけで完了です。

Hierarchyで「2D Object」→「Sprites」→「Square」と選択して、四角形(Square)の平面オブジェクトを作成しましょう。
今回作成するゲームでは、3D(立体)表現は無いので、使うのは全て2D Objectとなります。

オブジェクトに名前を付ける

作成したオブジェクトはデフォルトでは「Square」というような名前が付いていると思います。
ですが、このままでは後々に何のオブジェクトなのか分からなくなるので、分かりやすく名前を付けておきましょう。今回は「Block」という名前にしてみました。

これで落下させるブロックの設置が出来ました。ブロックの位置や大きさは、今後変更していくので今は気にしなくて大丈夫です。

ブロックを落下させる

ここまでで、操作するブロックを作ることができました。続けて、ブロックを落下させてみましょう。
落下処理はプログラムを書く必要が出てくるので、少し難易度が上がります。

落下はどうやって行う?

自動落下と書くのは簡単ですが、実際はどのように実現させればよいでしょうか?
今回の自動落下の動作は『1秒間隔でブロックを下に1つ移動する』としましょう。
その場合、必要な処理は
『1秒間隔の判定をして(①)、その判定がTrueだったら、ブロックを下に1マス移動(②)』
となります。
大まかに①と②の2つの処理に分解できます。

それでは、この処理を1つずつ実装していきましょう。

まずは準備、スクリプトファイルを作成する

まずは、プログラムを書く場所が必要ですので、スクリプトファイルを作成しましょう。
ですがその前に、Assetsの中に無造作にファイルを増やすと管理しにくくなりますので、Assetsの下に"Scripts"フォルダを作って、管理しやすい様にしましょう。
ProjectのAssetsで『Create』→『Folder』と選択して、作成されたフォルダ名を"Scripts"に変更です。
今後作成するスクリプトファイルは、全てこのScriptsの中に作成します。

それでは、実際にスクリプトファイルを作成しましょう。
作成したScriptsフォルダ内で『Create』→『C# Script』と選択し、「Block」と言う名前でスクリプトを作成です。
次に、Blockオブジェクト選択状態でInspectorに作成したスクリプトをドラッグ&ドロップして、このスクリプトをBlockオブジェクトのコンポーネントに追加します。

1秒間隔を判定する

この1秒間隔を判定する処理は、Unityの公式リファレンスにそのものが載っているのでそれをそのまま使いましょう。
※ 公式リファレンスではAwakeで初期化処理を書いてありましたが、Startでの初期化に変えました

using UnityEngine;
using System.Collections;

public class Block : MonoBehaviour
{
    private float update;  

    void Start()
    {
        update = 0.0f;
    }

    void Update()
    {
        update += Time.deltaTime;
        if (update >= 1.0f) // 公式は">"だったけど、1秒ピッタリも判定しちゃう
        {
            update = 0.0f;
            // ここでブロック落下の処理を行う
        }
    }
}

フレーム呼び出しの度に、経過時間(Time.deltaTime)をupdateに加算していって、1秒以上になったらupdateをリセットして何か処理を行うコードです。
updateが1秒未満の場合はif文の中に入らないので、これで1秒毎に処理を行えるようになります。

Unityを初めて触る人にはStartやUpdateが何なのか分からないかも知れませんが、その辺を書くと主題がブレてしまうので、こう言うものと思って下さい。(出来れば、この辺も補足記事を書きたいですね…)

ブロックを下に1つ移動させる

次にブロックの移動です。
このBlockスクリプトは、ブロックオブジェクトに割り当てているので、自分自身を下に移動させるだけです。

using UnityEngine;
using System.Collections;

public class Block : MonoBehaviour
{
    private float update;  

    void Start()
    {
        update = 0.0f;
    }

    void Update()
    {
        update += Time.deltaTime;
        if (update >= 1.0f)
        {
            update = 0.0f;
            transform.position += new Vector3(0, -1.0f, 0); // ★追加
        }
    }
}

先ほどのコードに19行目を追加しました。ここで自分のY軸座標を-1しています。
positionは、x,y,zの座標をVector3で保持しているので、そこにY軸を-1にした移動量を加算させることで落下を表現しています。

実行してみる

それでは実際に実行してみましょう。

実行すると分かりますが、ゲームエリアをはみ出してずっと落下し続けてしまいます。
ですが、今は落下の処理しか作っていないので、現状はこれでOKです。

おわり そして、次回予告

今回は仮の落下ブロックを配置して、1秒間隔で落下するところまで作りました。
次はブロックを左右に移動する処理を作りたいと思います。
まだ全然ゲームっぽくないですけど、気長に1歩ずつ考えて進めていきましょう。

スポンサーリンク