Curso de Unity 3D | Memory (juego de las parejas) 1

Curso de Unity 3D
Memory (juego de las parejas)

Curso de Unity 3D | Memory (juego de las parejas) 2

Curso de Unity 3D | Memory (juego de las parejas)

3.  
11.  
14.  
15.  
34.  

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