神経衰弱で数字の一致を判定する

前回の記事でカードをランダムに並べられて、クリックするとカードの裏表を切り替えられるようになりました。これでも神経衰弱はできそうですが、さらに処理を追加してよりゲームらしくします。
具体的には以下の処理を追加します。
➀裏を向いているカードの中から2枚選択し、クリックして表にする。
➁選択した2枚のカードを比較する。
➂2枚のカードの数字が同じであれば、その2枚のカードは表面のままにして➀に戻る。
➃2枚のカードの数字が異なれば、その2枚のカードを裏にして➀に戻る。

CardClick.csを以下のように書き変えると実装できます。

```C#:CardClick.cs
using System.Threading;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CardClick : MonoBehaviour
{
    private GameObject clickedObject1, clickedObject2;
    private SpriteRenderer sprite1, sprite2;
    private int count = 0; //カードを選択している枚数を記憶するための変数

    void Update()
    {
        if (count == 0) //カードを選択していない場合
        {
            if (Input.GetMouseButtonDown(0)) //マウス左ボタンをクリックした場合
            {
                Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); //カメラから左クリックした座標にレイを飛ばす
                RaycastHit hit = new RaycastHit();

                if (Physics.Raycast(ray, out hit))
                {
                    clickedObject1 = hit.collider.gameObject;
                    sprite1 = clickedObject1.GetComponent<SpriteRenderer>();
                    sprite1.sortingOrder = 2; //Order in Layerを2にする
                    Destroy(clickedObject1.GetComponent<BoxCollider>()); //当たり判定をなくす
                    count++;
                }
            }
        }
        else if (count == 1) //カードを1枚選択している場合
        {
            if (Input.GetMouseButtonDown(0))
            {
                Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                RaycastHit hit = new RaycastHit();

                if (Physics.Raycast(ray, out hit))
                {
                    clickedObject2 = hit.collider.gameObject;
                    sprite2 = clickedObject2.GetComponent<SpriteRenderer>();
                    sprite2.sortingOrder = 2;
                    Destroy(clickedObject2.GetComponent<BoxCollider>());
                    count++;
                }
            }
        }
        else //カードを2枚選択した場合
        {
            if (clickedObject1.name.Substring(1) == clickedObject2.name.Substring(1)) //カードの数字が一致しているかを判定
            {
                count = 0; //カード選択の状態を0に戻す
            }
            else
            {
                Thread.Sleep(2000); //2秒待機
                clickedObject1.AddComponent<BoxCollider>(); //当たり判定を復活させる
                clickedObject2.AddComponent<BoxCollider>();
                sprite1.sortingOrder = 0; //Order in Layerを0に戻す
                sprite2.sortingOrder = 0;
                count = 0; //カード選択の状態を0に戻す
            }
        }
    }
}
```

# 解説
➀の処理を実装するには、新たにcountという変数を追加して何枚選択したか記憶します。選択した枚数が0か1の場合に限りカードを左クリックで選択できるようにIf文で処理を分岐します。ここですでに選択されて表になっているカードを再びクリックして選択されないように
```
Destroy(clickedObject1.GetComponent<BoxCollider>());
```
で当たり判定をなくします。
➁の処理はcountが2になった場合、つまりelse文の中に書かれています。選択した2枚のカードを名前で比較しています。数字が一致しているかどうかが基準となるので、Substringメソッドでオブジェクト名の文字列の数字部分を取り出して比較します。
➂の処理はcountを0にするだけで出来ます。これで再び➀に戻ってカードを選択できます。一致したカードは表を向いたままにするので、当たり判定やOrder in Layerはそのままにしておきます。
➃はcountを0に戻すところは➂と同じですが、AddComponentによってBoxColliderを再び追加したり、Order in Layerを0にしてカードを裏向けたりする処理が追加されています。マッチしなかったカードのペアは裏返しにされて再び選択できるようになって➀に戻ります。

# 前回の記事
https://qiita.com/yanagiiiiiii_t/items/a9ff9f1665b7a75be9ac

https://qiita.com/yanagiiiiiii_t/items/607ecd159ade35e58d2d

# 参考
https://nprog256.net/post/2018/11/unity-basic-component-operation/