Dadas 3 imágenes alineadas horizontalmente en un panel inferior y una imagen superior centrada, si pulsamos en una imagen del panel que coincide con la superior, se disparará una traza.
Cargamos la imagen de fondo

Cargamos tres imágenes abajo y una posible solución arriba

Detectar pulsación sobre las imágenes de abajo
Volvemos a repetir los pasos para escuchar la pulsación sobre un objeto en escena.
Comprobar si el sprite pulsado coincide con el sprite solución
public void OnMouseDown(){
Sprite caraPulsada = GetComponent<SpriteRenderer>().sprite;
Sprite caraSolucion = GameObject.Find("caraSUP").GetComponent<SpriteRenderer>().sprite;
if(caraPulsada == caraSolucion){
Debug.Log("coinciden");
} else {
Debug.Log("no coinciden");
}
}
Generar sprites aleatorios arriba y abajo
public class GameManager : MonoBehaviour{
public Sprite[] caras;
void Start(){
NewGame();
}
void NewGame(){
int c1 = Random.Range(0, caras.Length);
GameObject.Find("Face1").GetComponent<SpriteRenderer>().sprite = caras[c1];
...
//De momento la imágen superior coincidirá con la primera de las de abajo
GameObject.Find("FaceUp").GetComponent<SpriteRenderer>().sprite = caras[c1];
}
}
La solución ya no es siempre el primero, es aleatoria
void NewGame(){
...
int[] carasPosibles = new int[3] { c1, c2, c3 };
GameObject.Find("FaceUp").GetComponent<SpriteRenderer>().sprite = caras[carasPosibles[Random.Range(0, 3)]];
}
Las posibles soluciones no deben estar repetidas
while(c2 == c1) c2 = Random.Range (0, caras.Length);
while(c3 == c1 || c3 == c2) c3 = Random.Range (0, caras.Length);
Muestra un marcador
Utilizaremos un objeto 3D que nos permitirá no recurrir al canvas.
Insertaremos dos objetos, uno para la palabra fija pts y otra para el marcador en si misma.

TextMeshPro
Esta entidad nos permite introducir texto en pantalla.
3D Object -> TextMesh Pro – Text
En el siguiente pantallazo…

- El cuadrado verde es el boxcollider del TextMeshPro.
- El cuadrado con vértices azules delimita los límites del area de margen que puedes cambiar en el propio componente en Extra Settings -> Margins
- El cuadrado amarillo es el area del texto.
A veces el icono [T] del TextMeshPro molesta un poco en pantalla. Para desactivarlo, podemos ir a Desplegable Gizmos -> TextMeshPro -> Pulsamos sobre la foto del icono [T].
Cargar una tipografía
Menú window -> TextMeshPro -> Font Asset Creator -> Arrastramos y soltamos la fuente en Source Font File -> Generate Font Atlas -> save -> El fichero creado es el que puedo arrastar y soltar en el inspector para poder usarlo.
Cuando dentro del inspector, editmos el material de la fuente, realmente estaremos editando el material de todos los casos en los que se esté usando esta fuente.
Llamar a una función de una clase desde otra clase
GameManager gm;
void Start(){
gm = GameObject.Find("GameManager").GetComponent<GameManager>();
}
Aumentar marcador cada vez que acertamos
Definiremos una nueva variable privada que incrementaremos cada vez que el jugador acierte.
GameManager.cs
public int points;
FaceDown.cs
GameManager gm;
void Start(){
gm = GameObject.Find("GameManager").GetComponent<GameManager>();
}
void OnMouseDown(){
...
gm.points++;
GameObject.Find("CounterText").GetComponent <TextMeshPro> ().text = "" + gc.points;
Volver a cargar las imágenes en cada turno
Haremos esto para volver a pintar imágenes cada vez que acertamos.
Para volver a pintar las imágenes en pantalla cuando acertemos, debemos llamar desde la clase CaraAbajo a la clase GameManager.
FaceDown.cs
...
gm.NewGame();
GameManager.cs
public void NewGame(){
...
}
Temporizador
Crear una corrutina para decrementar el contador de tiempo 1 unidad a cada segundo.
Perder el juego
Añadir la programación necesaria para que si se agota el tiempo o el usuario no escoge la solución correcta, se lance una nueva escena indicando que el jugador ha perdido.