Прокомментировал первый вариант

using System.Collections.Generic;
using UnityEngine;
public class Numbers : MonoBehaviour
{
// класс кнопки, содержит информацию о том,
// открыта ли кнопка и что в ней спрятано
public class Button
{
public bool opend;
public string contents;
}
// Список кнопок
private List<Button> _buttons = new List<Button>();
// Инициализация
void Start()
{
// генерируем кнопки (16 штук, 8 пар с числами 0-7)
for (int i = 0; i < 8; i++)
{
_buttons.Add(new Button { contents = i.ToString() });
}
for (int i = 0; i < 8; i++)
{
_buttons.Add(new Button { contents = (7-i).ToString() });
}
}
// последняя нажатая кнопка
private Button _last = null;
// выиграл ли игрок
private bool _win;
// функция отрисовки кнопок и логика
void OnGUI()
{
// если выиграли, то рисуем текст "You Win!"
if (_win)
{
GUI.Label(new Rect(10,10,100,30), "You Win!" );
return;
}
// рисуем кнопки 4 х 4
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
// индекс кнопки в списке
int index = i*4 + j;
// положение кнопки
var rect = new Rect(10 + i*60, 10 + j*60, 50, 50);
// отрисовка кнопки и обработка нажатия
// если кнопка закрыта - рисуем знак вопроса
if (GUI.Button(rect, _buttons[index].opend ? _buttons[index].contents : "?"))
{
// если нажата открытая кнопка - игнорируем
if (_buttons[index].opend) continue;
// если до этого не была открыта первая кнопка в паре
if(_last== null)
{
// открываем кнопку
_buttons[index].opend = true;
// запоминаем первую кнопку пары
_last = _buttons[index];
}
// если нажата вторая кнопка в паре и контент кнопок совпадает
else if (_last.contents == _buttons[index].contents)
{
// сбрасываем запомненную кнопку для открытия следующей пары
_last = null;
// открываем нажатую кнопку
_buttons[index].opend = true;
// проверка на победу
_win = true;
foreach (var button in _buttons)
{
// если хотя бы одна кнопка закрыта - не победили еще
if(!button.opend)
{
_win = false;
break;
}
}
}
// контент кнопки не совпадает с открытой кнопкой
else
{
// закрываем все кнопки
foreach (var button in _buttons)
{
button.opend = false;
}
// сбрасываем первую кнопку пары
_last = null;
}
}
}
}
}
}