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

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

MENU

【Unity ゲーム制作】神経衰弱ゲームを作ろう!〜その7 (カードを2枚選択したら)

スポンサーリンク

前回はカードを選択した時の処理を作りました!

今回はカードを2枚数選択した時の処理を実装していきましょう!

選択したカードを管理するクラスを作ろう!

神経衰弱は2枚とも同じカードを選択していたらカードを獲得できるゲームですね。
そのためにはプレイヤーが選択したカードIDを保管しておく必要があります。

せっかくなので、今回はシングルトンクラスを作成し、選択したカードIDの管理をしてもらいましょう。

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

public class GameStateController : MonoBehaviour {

    // 選択されたカードIDリスト
    public List<int> SelectedCardIdList = new List<int> ();

    // シングルトンの生成
    private static GameStateController mInstance;

    public static GameStateController Instance {
        get {
            // インスタンスが生成されていない場合、自動で生成する
            if (mInstance == null) {
                GameObject obj = new GameObject ("GameStateController");
                mInstance = obj.AddComponent<GameStateController> ();
            }
            return mInstance;
        }
    }
}


GameStateController.csを作成し、処理を記述してください。

では、前回作成した 「Card.cs」のOnClick()関数に選択したカードIDをGameStateControllerに保管する処理を記述します!

カード.csの部分

    /// <summary>
    /// 選択された時の処理
    /// </summary>
    public void OnClick () {

        // カードが表面になっていた場合は無効
        if (this.mIsSelected) {
            return;
        }

        Debug.Log ("OnClick");

        // 選択判定フラグを有効にする
        this.mIsSelected = true;

        // カードを表面にする
        this.CardImage.sprite = this.mData.ImgSprite;

        // 選択したCardIdを保存しよう!
        GameStateController.Instance.SelectedCardIdList.Add (this.mData.Id);
    }

GameStateController.Instance.SelectedCardIdList.Add()にthis.mData.Idを追加しています。
これでGameStateControllerに選択したカードIDを保管することができました。

次は、「選択したカード枚数が2枚数以上になった場合」の処理を記載しましょう。

そのためには、「ゲーム全体を管理するクラス」を作成し、そこに処理を記載したいと思います。

GameSceneManager.csを作成しよう!

まずは GameSceneManager.cs を作成し、Hierarchyにある「GameSceneManager」にアタッチしましょう!
そうしたら、GameSceneManagerのUpdate関数に以下の処理を記述します。

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

public class GameSceneManager : MonoBehaviour {

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

    void Update () {

        // 選択したカードが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);
            }
            // 選択したカードリストを初期化する
            GameStateController.Instance.SelectedCardIdList.Clear ();

        }
    }
}

.SelectedCardIdList.Count 」は、リストに保管されている要素数を取得できます。
そして、最初に選択したCardIdと、次に選択したCardIdが一緒だった場合、 this.mContainCardIdListに選択したカードIDを保管しています。

this.mContainCardIdList は 「獲得したカードIDを保管するリスト」になります。
こちらは次回以降で活用していきます!

最後に 「 GameStateController.Instance.SelectedCardIdList.Clear ()」を宣言しています。
こちらは 「SelectedCardIdList」の中身を初期化する処理です。

では、Gameを起動して動作を見てみましょう!

f:id:Wojtek:20190928180828g:plain


同じカードが選択したら専用のLogが表示されれば成功です!。