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;
}
}