Í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. Sprites
  15. Fall Down Game
  16. Galería de tiro
  17. Corrutinas
  18. Flappy Bird
  19. PONG
  20. Carreras
  21. Panel Animator
  22. Plataformas
  23. Plataformas
  24. Puzzle con Raycast
  25. Plataformas con RayCast
  26. Memory (juego de las parejas)
  27. Guardar y recuperar información almacenada
  28. Máscara
  29. Publicación
  30. Ejercicio: First Person Shooter
  31. Multijugador con Photon

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 mailPreguntame lo que quieras!
Pablo Monteserín
contacta conmigoPablo Monteserín

El servicio de resolución de dudas técnicas es sólo para los usuarios premium. Si tienes cualquier otra duda, usa el formulario de contacto. ¡Gracias!