Programación: Tutorial videojuegos con Unity 2D en español (Parte 2 Scripts)

Tutorial Unity 2D

Seguimos con nuestro tutorial para realizar videojuegos con Unity 2D en español. Si has llegado aquí directamente de google tal vez te interese ver antes la parte 1 del tutorial de videojuegos con Unity Si por el contrario ya has visitado la parte 1 del tutorial de Unity, sigue leyendo y entra en el mundo de los Scripts de Unity. 

Scripts en Unity

Hasta ahora todo lo que hemos hecho con Unity era estilo arrastrar, soltar y configurar. Pero para realizar videojuegos hay que programar un poquito... Así que vamos a hacerlo en esta parte de nuestro tutorial. Los scripts en Unity pueden hacerse en 3 lenguajes de programación (Boo Script, Javascript, C#), pero para no liarme he decidido usar como lenguaje el C# por ser muy parecido a Java.

Para crear un Script deberemos pinchar con boton derecho encima de la ventana de proyecto->Create->C#Script, esto nos creara un script llamado NewBehaviorScript, podemos renombrarlo con el nombre que queramos. Para editarlo podemos hacer doble click y se nos abrirá el editor MonoDevelop que no es más que un editor que viene integrado con Unity, podríamos usar otro pero ya que nos viene este IDE integrado, pues usémoslo. Veremos que la clase que hemos creado viene con un código por defecto:

Los scripts C# de Unity heredan de la clase MonoBehaviour para comunicarse con el núcleo de Unity. Notad que el nombre de la clase: NewBehaviourScript es igual al nombre del archivo que hemos creado para el script. Si eres programador, habras notado que los Scripts NO llevan constructor, esto es porque no es necesario y además es contraproducente añadirlo porque puede generar problemas.

public class NewBehaviourScript : MonoBehaviour {
    // Este método se llama una sola vez al inicializar el objeto, se usa para dar valores a las variables al iniciar el objeto.
    void Start () { 
      // Este comando sirve para hacer debug y trazas que saldrán por la consola
      Debug.Log("Estoy en el start");
    }
    // Este método es llamado automaticamente entre cada frame. Se usa para hacer acciones durante el juego: respuesta a los controles, movimientos, etc. Aquí hay que tener cuidado de poner cosas que no consuman mucho tiempo en hacerse para evitar ralentizar el juego
    void Update () {
      // Este comando sirve para hacer debug y trazas que saldrán por la consola
     Debug.Log("Estoy en el update");
    }
     // Este método se usa en lugar de Update cuando el sprite usa físicas
     void FixedUpdate(){
     }

}

En los scripts pueden añadirse variables de clase (por defecto tienen visibilidad pública): 
    public string variableObjeto; 
Las variables que creemos en la clase luego serán visibles en la ventana del Inspector, visibles y editables. Unity en el inspector nos mostrará los nombres de variables de una forma peculiar, por legibilidad pone un espacio delante de las mayusculas. De esta forma, si nuestra variable en el Script se llama "variableObjeto", en el inspector nos pondrá: "variable Objeto".

Las variables también pueden ser privadas, en este caso no se verán en el Inspector:

private var variablePrivadaObjeto:string;

Como recomendación: hacer privadas las variables que no requeramos tocar en el Inspector, así no nos saldrán.

Unity nos permite cambiar las variables "en caliente" mientras estamos en modo simulación con ayuda del inspector, una vez terminemos la simulación estos cambios se pierden. Esto es útil para ajustar parámetros del juego mientras jugamos

 Modificar componentes (Components) Unity desde un Script:

Como hemos visto cuando creamos un component, podemos modificarlo desde el Inspector de forma sencilla. Además Unity nos permite usando scripts acceder a components y modificarlos en caliente durante el juego dependiendo de las condiciones del juego. La sintaxis para modificar un component es esta:

// Obtenemos con GetComponent el componente Rigidbody y lo metemos en la variable cuerpoRigido
Rigidbody cuerpoRigido = GetComponent<Rigidbody>();

// Cambiamos la masa de cuerpoRigido a 10 (esto puede hacerse desde el Inspector también)
// Lo hacemos cambiado directamente el atributo mass que es público
cuerpoRigido.mass = 10f;

// Efectuamos una fuerza al cuerpo (esto NO puede hacerse desde el Inspector)
// Lo hacemos llamando a una función pública llamada AddForce
cuerpoRigido.AddForce(Vector3.up * 10f);

Añadir un Component a un objeto (un sprite por ejemplo)

Una vez tenemos creado un Script podemos añadirlo a un objeto de la Scene simplemente arrastrando el script y soltandolo en el objeto. Si nos fijamos en la ventana del Inspector veremos que nos aparece en el listado de componentes que tiene el sprite. También podemos añadirlo pulsando en el Sprite y en la ventana del inspector pulsando en Add Component->Scripts->NOMBRE_DE_NUESTRO_SCRIPT

¿Cómo averiguar qué objetos tienen un determinado Script?

A veces ocurre que por error hemos añadido un script a un objeto que no debería tenerlo, pero no logramos averiguar cuál es. Para averiguar qué objetos incluyen un script es tan sencillo como pinchar con botón derecho encima del script->Find references in Scene y en la ventana Hierarchy veremos los objetos que usan este script. En la ventana de escena veremos en blanco y negro los objetos que no lo usan y en color los que sí lo usan. ¿Util no?

Claro que una vez hecho esto parece que no hay forma de eliminar este filtro en la Hierarchy. Pero si nos fijamos en la ventana de Hierarchy sale el filtro que podemos eliminar dándole a la X, de esta forma volveremos a ver todos los objetos sin el filtro de buscar los objetos que tienen un script.

Ciclo de vida de MonoBehavior

Los scripts que creemos heredarán de MonoBehavior para poderse añadir a los GameObject (sprites). Esta clase de la que heredamos tiene unos métodos (algunos de los cuales podemos sobreescribir) y que se llaman de una determinada forma (ciclo de vida). En este diagrama os ponemos el ciclo de vida de una clase heredada de MonoBehaviour.

Básicamente los métodos que deberemos sobreescribir son start y update (aunque puede haber alguno más)

El método update se llama una vez cada 16ms (1/60 fps) si todo funciona bien.

El método start se llama una vez al inicializar el objeto.

El método onDestroy es llamado al morir el objeto, ahi podremos hacer las acciones necesarias cuando el objeto es destruido

 

 

 

 

 

Continuará...

Votos totales: 402