Memory (juego de las parejas)

Curso de Unity 3D

21.  
40.  

Por 9.99€ al mes tendrás acceso completo a todos los cursos. Sin matrícula ni permanencia.

Ubicar objetos en el canvas

Creo la siguiente jerarquía de objetos dentro del camvas:

  • Panel (con el componente vertical layout group)
    • panel1 (con el componente horizontal layout group)
      • carta1
      • carta2
      • carta3
      • carta4
      • carta5
    • panel2 (con el componente horizontal layout group)
      • carta1
      • carta2
      • carta3
      • carta4
      • carta5

Voltear cartas

GameController.cs
public class GameManager : MonoBehaviour{
	public Sprite[] cardFace;
	public GameObject[] cards;
    void Start(){
		for (int id = 0; id < 2; id++){
			for (int i = 0; i < cardFace.Length; i++){
				bool test = false;
				int choice = 0;

				while (!test){
					choice = Random.Range(0, cards.Length);
					//Voy buscando hasta encontrar una carta no inicializada
					//Si todas las cartas fueron ya inicializadas, obtendré un bucle infinito
					test = !(cards[choice].GetComponent<Card>().initialized);
				}
				cards[choice].GetComponent<Card>().cardFace = cardFace[i];
				cards[choice].GetComponent<Card>().initialized = true;
			}
		}
	}
}
Card.cs
public class Card : MonoBehaviour{
	public bool initialized = false;

	public Sprite cardFace;
	void Start(){
		GetComponent<Button>().onClick.AddListener(flipCard);
	}

	public void flipCard(){
		GetComponent<Image>().sprite = cardFace;
	}
}

using UnityEngine;
using UnityEngine.UI;

public class Card : MonoBehaviour{
	public bool initialized = false;

	public Image cardBack;
	public Sprite cardFace;
	GameController gc;
	void Start(){
		gc = GameObject.Find("GameController").GetComponent<GameController>();
		cardBack = GetComponent<Image>();
		cardBack.sprite = gc.cardBack;
		GetComponent<Button>().onClick.AddListener(flipCard);
	}

	public void flipCard(){
		GetComponent<Image>().sprite = cardFace;
	}   
}

La carta llama al GameController

Destapo dos cartas

GameController.cs
Card primeraCarta;
Card segundaCarta;

public void EvaluarCartas(Card carta){
	if (primeraCarta == null){
		carta.GetComponent<Image>().sprite = carta.cardFace;
		primeraCarta = carta;
	}else if (segundaCarta == null){
		carta.GetComponent<Image>().sprite = carta.cardFace;
		segundaCarta = carta;
		if (primeraCarta.GetComponent<Image>().sprite == segundaCarta.GetComponent<Image>().sprite){
			Debug.Log("exito");
			primeraCarta = null;
			segundaCarta = null;
		}else{
			StartCoroutine(dejaCartasComoAlPrincipio());
		}
	}
}

IEnumerator dejaCartasComoAlPrincipio(){
	yield return new WaitForSeconds(1f);
	primeraCarta.ShowBack();
	segundaCarta.ShowBack();
	primeraCarta = null;
	segundaCarta = null;
}
Card.cs
void Start(){
	cardBack = GetComponent<Image>().sprite;
	GetComponent<Button>().onClick.AddListener(flipCard);
	gm = GameObject.Find("GameManager").GetComponent<GameManager>();
}

public void flipCard(){
	//GetComponent<Image>().sprite = cardFace;
	gm.EvaluarCartas(GetComponent<Card>());
}

public void ShowBack(){
	GetComponent<Image>().sprite = cardBack;
}

Añadir la detección de cuando se ha ganado la partida

Por 9.99€ al mes tendrás acceso completo a todos los cursos. Sin matrícula ni permanencia.