初心者でもできる! 7日間で作るUnityゲーム開発

Day4:タイムトライアル機能を追加する!

この記事を読むのに必要な時間:およそ 5 分

UI処理を追加する

GameControlクラスに以下のフィールドを追加します。

    const float BASE_WIDTH = 511;
    public GUIStyle style = new GUIStyle();
    public GUIStyle endMsgStyle = new GUIStyle();
    Rect scoreRect = new Rect(400, 10, 70, 30);
    Rect timerRect = new Rect(350, 50, 120, 30);
    Rect endMsgRect = new Rect(50, 10, 200, 35);
    Rect rankMsgRect = new Rect(50, 85, 250, 30);
    Rect replayBtnRect = new Rect(50, 150, 120, 40);

続けて以下のコードを追加します。

    float GetValueByScreenSize(float x) {
        float ratio = Screen.width / BASE_WIDTH;
        return x * ratio;
    }

    Rect MakeRect(Rect defaultRect) {
        float left = GetValueByScreenSize(defaultRect.left);
        float top = GetValueByScreenSize(defaultRect.y);
        float width = GetValueByScreenSize(defaultRect.width);
        float height = GetValueByScreenSize(defaultRect.height);
        Rect newRect = new Rect(left, top, width, height);
        return newRect;
    }

    void OnGUI() {
        GUI.Label(scoreRect, "スコア " + score, style);
        GUI.Label(timerRect, "タイム " + elapsedTime, style);
        if (FinishedGame()) {
            GUI.Label(endMsgRect, "Game Clear!!", endMsgStyle);
            GUI.Label(rankMsgRect, "あなたのタイムは" + elapsedTime + "です!", style);
            if (GUI.Button(replayBtnRect, "もう一度プレイする")) {
                Application.LoadLevel("Teddy Bear Bazooka");
            }
        }
    }

MakeRectメソッドで使用しているGetValueByScreenSizeメソッドでは,引数で指定された現在のスクリーンサイズと既定のスクリーンサイズ(横幅511)の比を掛けた値を返しています。この計算はゲームの画面サイズを変更した際のレイアウト合わせに使用します。既定の横幅を511にした理由は私がUIのレイアウトを調整した際のゲーム画面の幅が511であっただけなので,いくつを基準にしてもかまいません。

MakeRectメソッドでは引数で受け取ったRectのサイズをGetValueByScreenSizeを使って実際の画面の大きさに合わせて変更しています。

OnGUIメソッドで経過時間と現在のスコアの表示,ゲームクリア時のメッセージの表示ともう一度プレイするボタンの制御をしています。

GUI.Label(scoreRect, "スコア " + score, style);でスコアの表示をしています。GUI.Labelメソッドの第一引数でラベル表示する位置と大きさを指定しています。第一引数の型Rectはleft(左からの位置), top(上からの位置), width(横幅), height(高さ)を持っています。

第二引数ではラベルに表示する文字列を指定します。第三引数ではラベルの表示スタイルを指定します。文字の大きさやフォント,色などを指定できます。今回はstyleをpublicフィールドにしたのでUnityのInspector画面からスタイル情報を指定します。この操作は後述します。

if (FinishedGame()) {でゲーム終了時の判定をして,if (GUI.Button(replayBtnRect, "もう一度Playする")) {「もう一度プレイする」ボタンを表示しています。ボタン押下時にはGUI.Buttonがtrueを返すので,このif文の中のApplication.LoadLevel("Teddy Bear Bazooka");が実行され,Teddy Bear Bazookaシーンが読み込まれてゲームが最初から始まります。

最終的にGemeControl.csは以下のようになりました。正しく編集できたか確認してください。

using UnityEngine;
using System.Collections;

public class GameControl : MonoBehaviour {
    public GameObject bear;
    int score = 0;
    float elapsedTime;
    const float BASE_WIDTH = 511;
    public GUIStyle style = new GUIStyle();
    public GUIStyle endMsgStyle = new GUIStyle();
    Rect scoreRect = new Rect(400, 10, 70, 30);
    Rect timerRect = new Rect(350, 50, 120, 30);
    Rect endMsgRect = new Rect(50, 10, 200, 35);
    Rect rankMsgRect = new Rect(50, 85, 250, 30);
    Rect replayBtnRect = new Rect(50, 150, 120, 40);

        void Start () {
        for (int i = 0; i < 9; i++) {
            Instantiate(bear);
        }

        scoreRect = MakeRect(scoreRect);
        timerRect = MakeRect(timerRect);
        endMsgRect = MakeRect(endMsgRect);
        rankMsgRect = MakeRect(rankMsgRect);
        replayBtnRect = MakeRect(replayBtnRect);
    }

        void Update () {
        if (!FinishedGame()) {
            elapsedTime += Time.deltaTime;
        }
    }
    
    public void AddScore() {
        score++;
    }

    bool FinishedGame() {
        return GameObject.FindWithTag("Teddy") == null;
    }

    float GetValueByScreenSize(float x) {
        float ratio = Screen.width / BASE_WIDTH;
        return x * ratio;
    }

    Rect MakeRect(Rect defaultRect) {
        float left = GetValueByScreenSize(defaultRect.left);
        float top = GetValueByScreenSize(defaultRect.y);
        float width = GetValueByScreenSize(defaultRect.width);
        float height = GetValueByScreenSize(defaultRect.height);
        Rect newRect = new Rect(left, top, width, height);
        return newRect;
    }

    void OnGUI() {
        GUI.Label(scoreRect, "スコア " + score, style);
        GUI.Label(timerRect, "タイム " + elapsedTime, style);
        if (FinishedGame()) {
            GUI.Label(endMsgRect, "Game Clear!!", endMsgStyle);
            GUI.Label(rankMsgRect, "あなたのタイムは" + elapsedTime + "です!", style);
            if (GUI.Button(replayBtnRect, "もう一度プレイする")) {
                Application.LoadLevel("Teddy Bear Bazooka");
            }
        }
    }
}

著者プロフィール

やまろう

フリーランスITエンジニア。

業務系SIerに10数年勤務後独立。現在はUnityでスマートフォンのネイティブゲーム開発に従事。仕事の傍ら,個人でフリーゲームを開発している。

URL: http://mikumikuplay.com/

ニコニコ生放送にてプログラミングに関する生放送を配信中。
http://com.nicovideo.jp/community/co2268886