Í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

Ejercicio: Galería de tiro

Primer paso - todo lo que ya vimos

  1. Colocamos el fondo y los enemigos con sus correspondientes animaciones en escena.
  2. Cuando pulsemos sobre cualquiera de los enemigos, debe mostrarse una traza.
  3. Finalmente, cambiaremos la traza por una animación de explosión.
enemigos con animaciones

Un único animal se mueve

Vector.Lerp hace una traslación desde un punto inicial hasta otro final. Cuando el t vale 0, el objeto estará en PosIni, cuando t vale 1, el objeto estará en PosFin y cuando t tiene cualquier valor intermedio entre 0 y 1, el objeto estará en algún punto intermedio proporcional

posicion = Vector2.Lerp(PosIni, PosFin, Tiempo/1)
public class GameController : MonoBehaviour {
	public GameObject[] personajes; 
	Vector2 posIni;
	Vector2 posFin;
	float t = 0;

	void Start(){
		posIni = new Vector2(personajes[0].transform.position.x,personajes[0].transform.position.y );
		posFin = new Vector2 (posIni.x + 35 , posIni.y);
	}

	void Update () {
		t += 0.1f * Time.deltaTime;
		personajes[0].transform.position = Vector2.Lerp (posIni, posFin, t);
		if (personajes[0].transform.position.x >= posFin.x) {
			personajes[0].transform.position = posIni;
			t = 0;
		}
	}
}

Detectando pulsación

Debemos hacer el objeto tenga un box collider.

Cuando un box collider va a tener movimiento, deberíamos añadirle un RigidBody. Esto evitará el recalculamiento del box collider cada vez que el objeto se desplace. La opción de Kinematic hará que las fuerzas no afecten al objeto.

void comprobarPulsacion(){
	Ray rayo = Camera.main.ScreenPointToRay (Input.mousePosition);
	RaycastHit hit;
	if (Physics.Raycast (rayo, out hit)) {
		if (hit.collider.gameObject == personajes[0].gameObject) {
			Debug.Log ("muerte");
		}
	}
}

Animación de muerte

hit.collider.gameObject.GetComponent ().SetBool ("vivo",false);

Varios animales se mueven

Hacer que sean varios animales los que se mueven ahora horizontalmente.

Si el número de animales es fijo, utilizaremos un array para añadirlos a pantalla. En este caso, si queremos evaluar cuando hemos pulsado sobre un animal, deberemos recorrelos todos con un bucle for.

Modificaremos la llamada a Vector2.Lerp para que las mascotas no comiencen superpuestas.

personajes[i].transform.position = Vector2.Lerp (posIni + Vector2.left * i*5, posFin + Vector2.left * i*5, t);

Contador de muertes

public class MascotaManagement : MonoBehaviour {
	...
	void OnMouseDown(){
		escena.incrementarMuertes ();
		anim.Play ("muerte");
	}
public class EscenaManagement : MonoBehaviour {
	...
	public void incrementarMuertes(){
		this.contadorMuertes = this.contadorMuertes + 1;
		GameObject.Find ("Texto").GetComponent<Text> ().text = ""+this.contadorMuertes;
	}

El GameObject "Texto" será un elemento UI que hay en escena. Tener en cuenta que si el texto que tiene dentro no cabe, no se verá. Para que si el texto no cabe, se vea, deberemos poner las propiedades Horizontal Overflow, y Vertical Overflow con valor Overflow.

Descargar ejercicio

Carga asíncrona de una escena

AsyncOperation asyncOperation;

void Start () {
	StartCoroutine(cargarEscenaAsincronamente());
}

IEnumerator cargarEscenaAsincronamente(){
	asyncOperation = SceneManager.LoadSceneAsync("Escena2", LoadSceneMode.Single);
	asyncOperation.allowSceneActivation = false;
	while (!(asyncOperation.progress > 0.89f)){
		Debug.Log("Progress: " + asyncOperation.progress);
		yield return null;
	}
	Debug.Log("llega el amor");
	yield break;
}

public void irAEscena2(){
	asyncOperation.allowSceneActivation = true;
}

Ejercicio

Carga ambas escenas asíncronamente

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.