Índice del curso de Unity 3D

  1. Introducción
  2. Instalación
  3. Interfaz
  4. Conceptos básicos
  5. Ejercicio: cubos
  6. Cambiar el color de algo
  7. Introducción a C#
  8. Conceptos para realización de juegos 2D
  9. Acceder a componentes desde código
  10. Uso del transform
  11. User Interface
  12. Elije tu propia aventura
  13. Acierta imagen
  14. Fall Down Game
  15. Galería de tiro
  16. Flappy Bird
  17. PONG
  18. Carreras
  19. Panel Animator
  20. Plataformas
  21. Plataformas
  22. Puzzle
  23. Plataformas con RayCast
  24. Memory (juego de las parejas)
  25. Máscara
  26. Publicación
  27. Ejercicio: First Person Shooter

Acierta imagen

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.

imagen del juego acierta imagen

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.

3D Object -> TextMesh Pro - Text

A veces el icono [T] del TextMeshPro molesta un poco en pantalla. Para desactivarlo, podemos ir a Desplegable Gizmos -> TeshMeshPro -> Pulsamos sobre la foto del icono [T].

Insertaremos dos objetos, uno para la palabra fija pts y otra para el marcador en si misma.

marcador con unity

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.cspublic int marcador;
CaraAbajo.csGameController gc;
void Start(){
	gc = GameObject.Find("GameController").GetComponent<GameController>();
}

void OnMouseDown(){
	...
	gc.marcador++;
	GameObject.Find("marcador").GetComponent <TeshMeshPro> ().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.cspublic 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.

icono de mandar un mail¡Contacta conmigo!
Pablo Monteserín
contacta conmigoPablo Monteserín

Para dudas técnicas sobre los ejercicios de mis cursos es necesario estar suscrito.