Unityではじめてのテトリス風落ちゲー制作 ~その10 タイトル画面追加編~

Unity

Unityでテトリス風落ちゲーを作ってみたいけど、何から手を付けていいか分からない。私もそんな一人です。ここでは、自分の勉強も含めて、簡単なテトリス風落ちゲーを制作していく過程を掲載していきます。

この連載を最後まで読めば、このようなテトリス風落ちゲーが1人で作れるようになります。

別ウィンドウで開く場合はこちら

今回はタイトル画面追加編です。

前回記事では、最上位列までブロックが積みあがったらゲームオーバーになる機能を追加しました。

今回は、次の機能を追加します。

  • タイトル画面を追加し、Game Startボタンを押したら、ゲームを開始する
  • ゲームオーバーになったら、タイトルに戻るかゲームをやり直すか選択出来るようにする

この記事はこんな人におすすめ!

  • 用意されたアセットを極力使わず、自分の力でゲームを作りたい
  • プログラミング初心者で1つ1つ丁寧に解説した記事が読みたい
  • Unity初心者がスキルを上げながらゲームを制作していく過程を見たい

本ゲーム制作方法は自己流です。もっと簡単に作る方法もあると思いますので、ご了承下さい。

ゲームシーンの移動方法について解説

最初にゲームシーンを移動する方法について解説します。各ゲームシーンにはindexが割り当てられています。確認するには「File > Build Settings」を選択して下さい。

Scenes In Buildの右端の数字が各ゲームシーンのindexです。

ゲームシーンを移動するには、SceneManagement名前空間が必要です。usingで追加し、SceneManager.LoadSceneメソッドでゲームシーンを移動します。引数に先ほど調べたゲームシーンのindexを設定することで、指定したindexのゲームシーンに移動することが出来ます。

using UnityEngine.SceneManagement;

SceneManager.LoadScene(0);

タイトル画面を追加する

タイトル画面のデザインを作成

タイトル画面を作っていきましょう。ScenesフォルダにTitleSceneを作成します。

タイトルテキストとスタートボタンを加えます。

タイトルテキストとスタートボタンの文字大きさ、テキスト、配置を設定しましょう。

こんな感じです。

「GameStart」ボタンが押されたら「GameScene」に移動するスクリプト作成

GameSceneのindexを設定するため、「ファイル > Build Settings」を選択し、

TitleSceneのindexを「0」、GameSceneのindexを「1」にします。

次にGameSceneに移動するスクリプトを作成します。GameStartButton.csを作成し、下のメソッドを作成しましょう。GameSceneのindexは「1」なので、LoadSceneメソッドの引数は「1」に設定します。

public void OnGameStartButtonClick()
{
    SceneManager.LoadScene(1);
}

GameStartButtonスクリプトをStartButtonオブジェクトのコンポーネントに加えます。

Start ButtonオブジェクトのButtonコンポーネントに自オブジェクトをセットします。

ボタンがクリックされたときの動作を「OnGameStartButtonClick()」に設定します。

これでGameStartボタンをクリックすると、GameSceneに移動し、ゲームが開始されます。

ゲームオーバー時のリスタート機能を追加

ボタンデザインを作成

ゲームオーバーになった時、ゲームが中断したままになっていましたので、リスタート機能を追加します。GameSceneからリスタートする「RestartButton」とTitleSceneに戻ってリスタートする「ReturnTitleButton」2つのボタンを追加しました。

こんな感じ。このままだと、GameSceneに移動したときにボタンが表示されていますので、オブジェクトは非表示にしておきます。

GameController.csでこの2つのボタン設定を扱えるよう

public Button restartButton;
public Button returnTitleButton;

追記し、2つのボタンオブジェクトを下図のようにGameControllerスクリプトコンポーネントに設定します。

ゲームオーバーになった時は、リスタートボタンが表示されるようGameController.csに以下追記し、アクティブにします。


void Update() {
    switch(gameStat){
        /* 
        (省略) 
        */
    
        case GAMEOVER:
            gameOverText.gameObject.SetActive(true);
            restartButton.gameObject.SetActive(true);
            returnTitleButton.gameObject.SetActive(true);
            break;
    }
    /* 
    (省略) 
    */
}

「Return to Title」ボタンを押したら「TitleScene」に移動するスクリプト追加

GameController.csでもSceneMangement名前空間を使用するので、以下先頭に追加します。

using UnityEngine.SceneManagement;

タイトル画面に戻るメソッドを作成し、

public void OnReturnTitleButtonClick()
{
    SceneManager.LoadScene(0);
}

ReturnTitleButtonのButtonコンポーネントにセットします。

これでタイトル画面に戻るボタンを押したらタイトル画面に戻れます。

「Restart」ボタンを押したらリスタートするスクリプト作成

「Restart」ボタンが押されたときに動作させるメソッドを作成します。

public void OnRestartButtonClick()
{
    gameOverText.gameObject.SetActive(false);
    restartButton.gameObject.SetActive(false);
    returnTitleButton.gameObject.SetActive(false);
    NextBlockSet();
    setStart();
}

ゲームオーバー時に表示されたテキスト、ボタンを非表示にします。そして、ゲーム開始時の状態に戻します。

setStart()メソッドは下記の通りです。

private void setStart()
{
    gameStat = START;
    fallCountTime = 0;
    groundCountTime = 0;
    downIhbFlg = false;

    score = 0;
    ResetBlock();
}

private void ResetBlock(){
    for(int i=1; i<11; i++){
        for(int j=0; j<18; j++){
            blockStat[j, i] = 0;
        }
    }
}

実際に動かしてみよう

まとめ

今回は、まずタイトル画面を追加し、Game Startボタンを押したら、ゲームを開始するようにしました。次にゲームオーバーになったら、タイトルに戻るかゲームをやり直すか選択出来るようにしました。

ゲームの完成まであと少しです。

次回はハイスコアを記録し、セーブする機能を追加したいと思います。

最後までお読み頂きありがとうございました。