Acierta imagen en Unity3D

Contactar con el profesor

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

imagen de fondo del juego acierta imagen

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

unity 3d la imagen coincide

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 GameController : MonoBehaviour{
	public Sprite[] caras; 

	void Start(){
		nuevaPartida();
	}

	void NuevaPartida(){
		int c1 = Random.Range(0, 6);
		GameObject.Find("cara1").GetComponent<SpriteRenderer>().sprite = caras[p1];

		...

		//De momento la imágen superior coincidirá con la primera de las de abajo
		GameObject.Find("caraSUP").GetComponent<SpriteRenderer>().sprite = caras[p1];
	}
}

La solución ya no es siempre el primero, es aleatoria

void NuevaPartida(){
	...
	int[] carasPosibles = new int[3] { c1, c2, c3 };
	GameObject.Find("caraSUP").GetComponent<SpriteRenderer>().sprite = caras[carasPosibles[Random.Range(0, 3)]];
}

Las posibles soluciones no deben estar repetidas

while(c2 == c1) c2 = Random.Range (0, 6);
while(c3 == c1 || c3 == c2) c3 = Random.Range (0, 6);

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.

marcador con unity

TextMeshPro

Esta entidad nos permite introducir texto en pantalla.

3D Object -> TextMesh Pro – Text

En el siguiente pantallazo…

Textmeshpro
  • 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

GameController gc;

void Start(){
	gc = GameObject.Find("GameController").GetComponent<GameController>();
}

Aumentar marcador cada vez que acertamos

Definiremos una nueva variable privada que incrementaremos cada vez que el jugador acierte.

GameController.cs
public int marcador;
CaraAbajo.cs
GameController gc;
void Start(){
	gc = GameObject.Find("GameController").GetComponent<GameController>();
}

void OnMouseDown(){
	...
	gc.marcador++;
	GameObject.Find("marcador").GetComponent <TextMeshPro> ().text = "" + gc.marcador;

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 GameController.

CaraAbajo.cs

...

gc.nuevaPartida();
GameController.cs
public void nuevaPartida(){
	...
}

Temporizador

El siguiente código se encarga de llamar a una función recursivamente cada segundo:

void temporizador(){
	Debug.Log("Llamada al código");
	Invoke("temporizador", 1.0f);
}

Utilizando el código anterior, decrementa el contador de tiempo.

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.

← Sprites
Fall Down en Unity3D →

Aviso Legal | Política de privacidad