lunes, 7 de agosto de 2017

Tutorial de plataformas 2D en Unity (VII)






10.      Moviéndonos por el escenario y colocando enemigos:



Vamos a comenzar este capítulo añadiendo más bloques de suelo, de modo que se salgan de la pantalla. Hasta que quede como en la imagen:








A continuación, crearemos un Script para que la cámara siga a nuestro personaje, guardando una distancia. Una vez entremos en el script, declaramos las siguientes variables:

public Transform personaje;
public float separacion = 6f;

La variable “Transform” es la que indica la posición en la que se encuentra el personaje, mientras que la variable “separación” es el margen que dejará la cámara antes de empezar a seguir al personaje.

Una vez entendido esto, nos vamos a la función “Update” (ya que necesitamos conocer en tiempo real la posición del personaje para que la cámara lo siga) y ahí escribiremos lo siguiente:

transform.position = new Vector3(personaje.position.x + separacion, transform.position.y, transform.position.z);

Esto quiere decir que el objeto que tenga asignado este script transforme su posición (que se mueva) al vector cuyas coordenadas son:

Coordenada X = personaje.position.x + separacion (la posición en el eje X del personaje sumada a la separación que hayamos indicado con el borde de la pantalla).

Coordenada Y = transform.position.y  (no se le pone el personaje, para que la cámara se mantenga a una altura constante).

Coordenada Z = transform.position.z (Tiene que tener coordenada en Z porque es la distancia a la que está la cámara, si la cámara no estuviese a cierta distancia, estaría en el mismo plano que los sprites y no veríamos nada, mira la siguiente imagen donde se aprecia dónde está situada la cámara en el eje Z).








Ahora procederemos a colocar a nuestro primer enemigo, como ya lo hicimos con el sprite de Mario, omitiré este paso dejándoos una imagen del personaje terminado.








Hacemos lo mismo con la animación:








Cuando tenga el ciclo de caminado terminado, vamos a crear un “tag” que se llame “Enemigo” y se lo vamos a asignar al goomba.









Acto seguido tenemos que hacer que el personaje se active cuando aparezca en pantalla. Para ello vamos a colocar un “Box Collider 2D” en la “Main Camera” y haremos click en la opción “Trigger”, así el collider actuará como interruptor cuando algo entre en su campo, en vez de como chocar contra él.










Dentro de nuestro personaje vamos a crear un objeto vacío (recordad, pinchamos con el botón derecho en el personaje -> CREATE EMPTY), lo renombramos como “Activador” y le vamos a poner un Box Collider 2D, donde activaremos la opción “Is Trigger” y que moveremos hasta que encaje con el borde de la pantalla, sobresaliendo un poco para que cuando este collider choque con el collider del goomba, se active. Por último debemos cambiarle el tag y ponerle “Activador” como  tag.















Ahora vamos a crear un script nuevo para que el enemigo se active en cuanto entre en pantalla (cuando choque con “Activador”), una vez creado, escribimos el siguiente código:













Declaramos un “GameObject” público que llamamos “Enemigo”, luego procederemos a crear una función nueva, fuera de las funciones “Start” y “Update”.

void OnTriggerEnter2D(Collider2D collider)
    {
        if (collider.tag == "Activador")
        {
            Enemigo.SetActive(true);
        }
    }

Esta nueva función “OnTriggerEnter2D” se ejecuta cuando algo entra en el “collider” marcado como “trigger” del objeto que tenga este script.
Este código viene a decir:
Si otro objeto que tenga “collider” y un tag Activador entra dentro del collider del objeto al que he asignado el script me vas a activar el “GameObject” “Enemigo” (que declaramos antes como público para poder acceder a él desde Unity).

Ahora a la barra de menús del panel superior y donde pone “GameObject” creamos dos nuevos GameObjects vacíos.
A uno de ellos lo llamaremos “Enemigos” (será donde metamos todos los enemigos) y al otro “Activador Goomba”. Una vez hecho esto, introducimos nuestro Goomba dentro de “Activador Goomba”, y “Activador Goomba” a su vez lo introducimos dentro de “Enemigos”. Parece un poco lioso pero es muy fácil, solo tiene que quedar como en la siguiente imagen:










Clicamos en “Enemigos” y vamos al inspector (la parte derecha de la pantalla), en el apartado “Transform” le ponemos todos los valores de posición y rotación a cero, y los de escala a uno.
En el goomba, hacemos lo mismo SOLO con posición y rotación, ya que la escala del goomba no tiene sentido dejarla a 1, tendrá el tamaño que queramos.








Ahí podéis ver que solo la escala es distinta a cero.

Cuando tengamos esto, pinchamos en “Activador Goomba” (el único al que no hemos cambiado los valores), lo movemos hasta colocar al Goomba en la posición deseada, y una vez allí arrastramos a “Activador Goomba” el script “ActivadorPantalla” y le ponemos un “Box Collider2D” marcado como “Is Trigger” y lo escalamos para que sea un poco más grande (así te aseguras de que choca con el otro colisionador que hemos puesto al personaje). Por último, en el apartado “Enemigo” del script, arrastramos nuestro goomba.
Al final debe quedar todo como en la siguiente imagen.








Ahora vamos a pinchar en el goomba, y le desactivaremos la primera casilla que hay en la parte superior izquierda del inspector, haciendo que el goomba desaparezca.








Si ahora probamos nuestra escena veremos como el goomba aparecerá cuando justo cuando llegamos a pantalla, para facilitar la visualización recomiendo que pongáis las pestañas como las tengo yo en la siguiente imagen, así podréis ver en “Scene” el momento en que aparece.









Ahora falta darle movimiento, volvemos a nuestra carpeta de scripts y creamos otro script llamado MovimientoPersonaje, donde vamos a decirle en cuanto se active venga por nosotros.









Este script valdrá para todos los enemigos. Dice así:

    public float Velocidad;

       // Use this for initialization
       void Start () {
            
       }
      
       // Update is called once per frame
       void Update () {
        GetComponent<Rigidbody2D>().velocity = new Vector2(-Velocidad, GetComponent<Rigidbody2D>().velocity.y);
    }
}

Declaramos nuestra variable pública Velocidad (del mismo modo que hicimos con el personaje).

Luego le decimos que tome el componente “velocity” del objeto que tenga este script asignado y le ponga un Vector2 en el que en su eje X el valor será el que asignemos en Velocidad, pero con signo negativo (esto es porque el goomba se moverá hacia la izquierda, que es el eje X en sentido negativo).


Esto es todo por ahora, recordad que podéis preguntar cualquier duda tanto en los comentarios, como en Twitter: @Lepra_Games o en la página de Facebook: Lepra Games.


No hay comentarios:

Publicar un comentario