unityで、簡単な神経衰弱ゲームを作ってみたいと思います。 前回、1枚カードがあって、それをめくるだけの カードめくりのプログラムを作りました。 今回はそれを使った応用編です。

コード

▼CardScript

using UnityEngine;

public class CardScript : MonoBehaviour
{
    //1)変数関連
    public Sprite imgBack; // 裏
    public Sprite imgFront; // 表
    public GameManager gm; //GameManager
    public int pairId; // ペアID(同じ番号がペア)

    //2)準備
    private SpriteRenderer sr; //画像表示に関する
    private bool isFront = false;//裏表判定(false=裏, true=表)

    // Start is called once before the first execution of Update after the MonoBehaviour is created
    void Start()
    {
        //3)実行
        sr = GetComponent<SpriteRenderer>(); //(カードの)画像情報に関する
        ShowBack(); //最初は裏にセット⇒中身は4へ
    }

    // Update is called once per frame
    void Update()
    {
        //6)マウス左クリックされた時
        if (Input.GetMouseButtonDown(0))
        {
            //マウス位置を取得
            Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            mousePos.z = 0;

            //マウスの位置がColliderの範囲だったら
            //Physics2D.OverlapPoint(mousePos)⇒その座標に「2Dコライダー」が存在するか調べる関数
            //もし当たっていれば、そのコライダー(Collider2D)を返す
            //何もなければ null を返す
            //例えばクリックした位置にカードの BoxCollider2D があれば、それが col に入る
            //これで「自分がクリックされたときだけ反応する」ようになります。
            Collider2D col = Physics2D.OverlapPoint(mousePos);

            //マウスがクリックされた場所に何かコライダーがあって、
            //しかもそれが “このカード自身” だったら実行する
            if(col != null && col.gameObject == this.gameObject)
            {
                // すでに表なら何もしない
                if (isFront)
                {
                    return; //C# では return が出た時点で関数の処理はそこで終了する
                }
                else
                {
                    ShowFront();
                    //カードがめくられたことを GameManager に報告する
                    gm.OnCardOpened(this); //カードがめくられたことを GameManager に報告する
                }
            }
        }

    }

    //4)ShowBack()の中身 / 裏向きにセット
    public void ShowBack()
    {
        sr.sprite = imgBack;
        isFront = false; //「今、裏向きですよ」という状態を保持
    }

    //5)表向きにセット
    public void ShowFront()
    {
        sr.sprite = imgFront;
        isFront = true; //「今、表向きですよ」という状態を保持
    }

}

▼GameManager

using System.Collections; // ← 6)これを追加(or確認)
using UnityEngine;

public class GameManager : MonoBehaviour
{
    //1)変数を準備
    private CardScript first, second; // 1枚目と2枚目
    private int matchedPairs = 0 ; // 揃ったペア数
    private int totalPairs = 2; // 今回は4枚なので2ペア
    private bool gameClear = false; //ゲームクリアしたらtrue

    // Start is called once before the first execution of Update after the MonoBehaviour is created
    void Start()
    {
        // 2)初期化処理
        first = null; //まだ何も入ってない(めくってない)
        second = null;
        matchedPairs = 0;

        Debug.Log("ゲームスタート!");
    }

    // Update is called once per frame
    void Update()
    {
        //3)クリアした時の処理
        // 1. まだクリアしていない  ←この直後にクリアするので、直前ではクリアしてない状態です
        // 2. 全部のペアが揃った
        // この2つが同時に成立したとき
        if (!gameClear && matchedPairs == totalPairs)
        {
            gameClear = true;
            Debug.Log("CLEAR!");
        }
    }

    //4)カードがめくられた処理
    public void OnCardOpened(CardScript cs)
    {
        //1枚目がめくられる
        if(first == null)
        {
            first = cs; //1枚目にめくったカードを記録
            return; // ここで関数を終わりにする
        }
        //もし2枚目だったら
        if(second == null)
        {
            second = cs; //2枚目にめくったカードを記録

            //7)判定処理へ...
            //コルーチンは 作業を途中で止めたり、待ったりしながら進められる特別な関数
            StartCoroutine(Judgement());
        }
    }

    //5)判定の関数
    IEnumerator Judgement()
    {
        //コルーチンの処理を 0.3 秒だけ中断して、時間が経ったら続きから再開する
        yield return new WaitForSeconds(0.3f);

        //ペアが成立した場合
        if(first.pairId == second.pairId)
        {
            first.ShowFront();
            second.ShowFront();
            matchedPairs++; //1加算
        }
        else
        {
            //さらに0.5秒中断
            yield return new WaitForSeconds(0.5f);
            first.ShowBack();
            second.ShowBack();
        }
        first = null;
        second = null;
    }
}

コメントを残す