気ままなUnityエンジニアブログ

新米Unityエンジニアが送る解説アウトプットブログです。Twitter : @UjinUnity

MENU

【Unity ゲーム制作】神経衰弱ゲームを作ろう!〜その11 (スタートとリザルト画面を作成しよう!)

スポンサーリンク

前回はEnum (列挙型 )を使って、ゲームのステート管理を実装しました。

今回は 「スタート」と「リザルト」のステート画面の作成を行いましょう!

1 . 「スタート」画面を作成する

まずがUnityのHierarchyにStart画面の作成を作成しましょう。


f:id:Wojtek:20191014152957p:plain


今回は、このような形のスタート画面を作成しました
(センスについては言わないで)


内容はTextとButtonを組み合わせた形式になっています。

f:id:Wojtek:20191014153056p:plain

f:id:Wojtek:20191014153109p:plain


次にスタート画面用のスクリプトを作成します。

「StartStateManager.cs」を作成しましょう。


スタート画面を作成しましたが、何かしらのアニメーションを追加したいと思います。

先ほど作成したGameStartText に拡大縮小アニメーションを追加しましょう。


2. StartStateManager.cs に拡大縮小アニメーションを追加する


StartStateManager.csに以下の処理を実装しましょう。

using System.Collections;
using System.Collections.Generic;
using DG.Tweening;
using UnityEngine;
using UnityEngine.UI;

public class StartStateManager : MonoBehaviour {

    // ゲームの開始テキストの座標
    public RectTransform GameStartTextRt;

    /// <summary>
    /// テキストの拡大アニメーション
    /// </summary>
    public void EnlarAnimation () {

        this.GameStartTextRt.DOScale (Vector3.one * 1.5f, 0.5f)
            .OnComplete (() => {
                // テキストの縮小アニメーション
                this.mShrinkAnimation ();
            });
    }

    /// <summary>
    /// テキストの縮小アニメーション
    /// </summary>
    private void mShrinkAnimation () {

        this.GameStartTextRt.DOScale (Vector3.one * 0.5f, 0.5f)
            .OnComplete (() => {
                // テキストの縮小アニメーション
                this.EnlarAnimation ();
            });
    }
}

これを作成したら「GameStateManager.cs」に StartStateManager の処理を追加しましょう

3. GameStateManager.cs に StartStateManagerの処理を追加する


まずは GameStateManager.cs にスタートステート時の処理を追加しましょう。

先ほど作った「StartArea」に「StartStateManager.cs」をアタッチします。

public class GameSceneManager : MonoBehaviour {

    // 一致したカードIDリスト
    private List<int> mContainCardIdList = new List<int> ();

    // カード生成マネージャクラス
    public CardCreateManager CardCreate;

    // 時間管理クラス
    public TimerManager timerManager;

    // スタートステートクラス
    public StartStateManager startStateManager;
    private void mSetStartState () {
        // テキストの拡大縮小アニメーション
        this.startStateManager.EnlarAnimation ();
    }

    /// <summary>
    /// Readyステートに遷移する
    /// </summary>
    public void OnGameStart () {
        // ゲームステートを初期化
        this.mEGameState = EGameState.READY;

        // ゲームのステート管理
        this.mSetGameState ();
    }

宣言した変数にStartAreaをアタッチしましょう。


次に、Start()関数の初期化処理も変更しましょう

    void Start () {

        // ゲームステートを初期化
        this.mEGameState = EGameState.START;

   // スタートエリアを表示
        this.startStateManager.gameObject.SetActive (false);

        // ゲームのステート管理
        this.mSetGameState ();
    }

そして、先ほど作った「GameStateText」のButtonのOnClick に「OnGameState」を追加しましょう。


f:id:Wojtek:20191014154459p:plain


ここまで出来たら、一度UnityのGameを起動してみましょう。


f:id:Wojtek:20191014155013g:plain


上記のような動作になったら成功です!


スタート画面は出来たので、次は「リザルト」画面を作成しましょう!

3. リザルトステート画面を作成しよう!


スタート画面と同様にリザルト画面も作成しましょう。


f:id:Wojtek:20191014160136p:plain

センスとは問わないで


そして、ResultStateManager を作成し変数などをアタッチします。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ResultStateManager : MonoBehaviour {

    // 時間を表示するテキスト
    public Text TimerText;

    /// <summary>
    /// ゲームで経過した時間を表示する
    /// </summary>
    public void SetTimerText (int timer) {
        this.TimerText.text = timer.ToString ();
    }
}


f:id:Wojtek:20191014161254p:plain



RsultStateManagerの準備が整ったら、GameStateManagerにリザルト処理を追加しましょう。

    /// <summary>
    /// ゲームステートで処理を変更する
    /// </summary>
    private void mSetGameState () {

        switch (this.mEGameState) {
            // スタート画面
            case EGameState.START:
                // スタートエリアを表示
                this.startStateManager.gameObject.SetActive (true);
                // ゲームスタートの開始
                this.mSetStartState ();
                break;
                // ゲーム準備期間
            case EGameState.READY:
                // ゲームの準備ステートを開始する
                this.mSetGameReady ();
                break;
                // ゲーム中
            case EGameState.GAME:
                break;
                // 結果画面
            case EGameState.RESULT:
                this.resultStateManager.gameObject.SetActive (true);
                this.mSetResultState ();
                break;
        }
    }
    /// <summary>
    /// リザルトステートの設定処理
    /// </summary>
    private void mSetResultState () {

        this.resultStateManager.SetTimerText ((int) this.mElapsedTime);
    }

    /// <summary>
    /// スタート画面に遷移する
    /// </summary>
    public void OnBackStartState () {

        // ResultAreaを非表示にする
        this.resultStateManager.gameObject.SetActive (false);

        // ゲームステートをStartに変更
        this.mEGameState = EGameState.START;

        // ゲームのステート管理
        this.mSetGameState ();
    }

そして、Update部分で「全てのカードを取得したらリザルトステートに遷移する」処理を実装します

void Update () {

        // GameState が GAME状態なら
        if (this.mEGameState == EGameState.GAME) {
            this.mElapsedTime += Time.deltaTime;

            this.timerManager.SetText ((int) this.mElapsedTime);

            // 選択したカードが2枚以上になったら
            if (GameStateController.Instance.SelectedCardIdList.Count >= 2) {

                // 最初に選択したCardIDを取得する
                int selectedId = GameStateController.Instance.SelectedCardIdList[0];

                // 2枚目にあったカードと一緒だったら
                if (selectedId == GameStateController.Instance.SelectedCardIdList[1]) {

                    Debug.Log ($"Contains! {selectedId}");
                    // 一致したカードIDを保存する
                    this.mContainCardIdList.Add (selectedId);
                }

                // カードの表示切り替えを行う
                this.CardCreate.HideCardList (this.mContainCardIdList);

                // 選択したカードリストを初期化する
                GameStateController.Instance.SelectedCardIdList.Clear ();
            }

            // 配置した全種類のカードを獲得したら
            if (this.mContainCardIdList.Count >= 6) {

                // ゲームをリザルトステートに遷移する
                this.mEGameState = EGameState.RESULT;
                this.mSetGameState ();
            }
        }

今回は 6 と直打ちしていますが、配布するカードの枚数を予め設定しておくのをオススメします!

また、ゲームを繰り返す処理を実装するため、CardCreateManager.csのCreateCard関数の最初に CardCreateParent の子オブジェクトを
削除する処理を実装しましょう。

    public void CreateCard () {

        foreach (Transform child in this.CardCreateParent) {
            Destroy (child.gameObject);
        }

最後に「OnBackStartState」をResutAreaに作成したButtonにアタッチしましょう。


f:id:Wojtek:20191014161524p:plain


これでリザルト画面の準備が整いました。

UnityのGameを起動してみましょう。



f:id:Wojtek:20191014162933g:plain


上記のように画面が切り替われば成功です!