UNITY Creando scripts

De MediaWiki
Ir a la navegación Ir a la búsqueda

Introducción



  • A pesar de lo potente que es Unity y de las facilidades que nos ofrece, va a ser necesario realizar al menos ciertas tareas de programación, para gestionar los diferentes eventos que se producen en un juego, movimientos,acciones,...
  • Esto se consigue con la ejecución de ciertos 'scripts' asociados a cada uno de los GameObjets que conforman el juego.


  • Para comprender este punto se debe tener conocimientos de programación en algún lenguaje de programación orientado a objetos y tener claros los conceptos de la POO (herencia, polimorfimo y encapsulación).
Disponéis en esta misma WIKI de un curso de JAVA, en la sección de Programación.


  • Unity hace uso del Visual Studio para implementar la parte de programación de scripts dentro de su programa.
Nota: Hasta la versión 5 Unity hacía uso del IDE MonoDevelop. Actualmente ya no da soporte para este IDE.


Además al estar integrado en dicho programa, es posible definir variables que tendrán un reflejo gráfico en el entorno de Unity.


  • Unity soporta de inicio dos tipos de lenguajes de programación de scripts:
  • C# (C-Sharp)
  • Unity Script (parecido a Javascript), pero este lenguaje se recomienda ya no usarlo a partir de la versión 2017.




Creando scripts

  • Los scripts van a ser archivos con extensión .cs que se van a guardar físicamente en la carpeta Assets de nuestor proyecto.
  • Gráficamente podemos gestionar las carpetas donde se van a guardar los scripts y moverlos de unas a otras arrastrándolos dentro de Unity.
La organización de los mismos es cosa nuestra.
Normalmente, dentro de 'Assets' crearemos una carpeta Scripts:
Unity3d scripts 3.JPG
Presionar el botón derecho del ratón sobre la carpeta Assets


Nota: Podemos hacer los mismo si estando situados sobre la carpeta 'Assets' (pulsar una vez con el botón izquierdo sobre la carpeta 'Assets') vamos a la opción de menú Assets:

Unity3d scripts 4.JPG


Nota: Podemos crear las carpetas-subcarpetas que queramos.


  • Una vez situados en la carpeta, presionamos el botón derecho del ratón (o ir al menú superior de 'Assets') y escogemos la opción 'Create' => 'C# Script' dándole un nombre:
Unity3d scripts 5.JPG


  • Los scripts van estar asociados a diferentes GameObjects.
Para asociar un script a un gameobject podemos hacerlo de varias formas:
  • Arrastrando el script al objeto:
Unity3d scripts 6.JPG
  • Arrastrando el script a las propiedades (ventana de inspector) del GameObject (tiene que estar previamente seleccionado el GameObject):
Unity3d scripts 7.JPG
  • En la ventana Inspector del GameObject, presionamos el botón Add Component y escribimos el nombre del script a asociar. Como se puede observar también se puede crear un script y asociarlo directamente al GameObject en un solo paso escogiendo la última opción al presionar 'Add Component'.
Unity3d scripts 8.JPG


  • IMPORTANTE:: Podemos tener varios scripts asociados al mismo gameobject. Estos se van a ejecutar en orden de 'arriba-abajo' en la ventana de inspector. Podemos arrastrar dichos scripts para cambiar el orden de ejecución.
Más información sobre el orden de ejecución de los scripts en este enlace.




  • Si quisiéramos crear un 'Unity Script' (cosa no aconsejable) podemos hacerlo de la forma siguiente:
Unity3d scripts 9.JPG



  • Avanzado (solo para información): A partir del Unity-2018, permite realizar un diseño de programación 'orientado a los datos' denominado ECS (Entity Component System).
Hasta ahora (y es lo que veremos) cada gameobject tiene 'asociado' diferentes componentes que le permiten:
  • Renderizarse (dibujarse)
  • Aplicar motor de físicas (si añadimos el componente rigidbody, lo veremos más adelante)
  • Moverse (traslación, rotación,escalado)
En el tipo de enfoque ECS, se basa en crear 'entidades'. Cada una de ellas puede englobar a múltiples componentes.
  • Cada componente tiene datos (por ejemplo, el componente Transform guarda información sobre la posición, el componente Renderer, sobre los materiales,...)
  • Cada uno de esos componentes estará asociado a un sistema que lo gestionará.
Más información:




Formato de un script

  • Para editar un script podemos:
  • Pulsar dos veces sobre el nombre del script
  • En las propiedades del GameObject (su ya tenemos asociado el script), pulsar sobre la rueda dentada del mismo y escoger la opción 'Edit Script':
Unity3d scripts 10.JPG


Al hacerlo se abrirá el editor que por defecto es el Visual Studio, pero que se puede cambiar por otro:



  • El código por defecto de un script es el siguiente:
Unity3d scripts 13.JPG
Al saber programación no creo que haya que explicar nada del mismo.
Comentar los dos métodos que aparecen por defecto, y que ya están comentados en el propio código:
  • Start: Utilizado para inicializar variables.
  • Update: Llamado en cada 'frame' cuando se ejecuta el juego. Aquí es donde irá el código que 'moverá', 'responderá a iteraciones del usuario (pulsar teclas por ejemplo)' y se definirán acciones cuando se produzcan eventos como colisiones de los GameObjects.
Con 'frame' indicamos que este método se va a llamar 30,40,50...veces por segundo, dependiendo de la carga del procesador y de su potencia.
Lo que hace Unity es borrar toda la pantalla y volver a dibujar las figuras 3D, pero al hacerlo tan rápido, nos da la sensación de movimiento.
Una máquina funcionando a 60fps (fotogramas = frames por segundo) llamará 60 veces por segundo a este método.
Dentro del mismo tendremos el código que hará que un figura 3D se mueva.




Depuración

  • Como en cualquier otro IDE vais a poder establecer puntos de interrupción y visualizar el contenido de los atributos en ejecución.
  • Para mandar mensajes al entorno de UNITY podemos hacer uso de la clase Debug.
Entre sus métodos:
  • Log: Manda un mensaje a la consola de UNITY.
  • LogError: Igual que la anterior pero lo muestra de otro color.
  • LogWarning: Igual que la anterior pero lo muestra de otro color.


  • Veamos un ejemplo:


 1 using System.Collections;
 2 using System.Collections.Generic;
 3 using UnityEngine;
 4 
 5 public class prueba : MonoBehaviour {
 6 
 7 	// Use this for initialization
 8 	void Start () {
 9         Debug.Log("Inicializando el GameObjet");
10 	}
11 	
12 	// Update is called once per frame
13 	void Update () {
14 
15             if (transform.position.x==5f)
16             {
17                Debug.LogWarning(transform.position);
18             }
19 		
20 	}
21 }
Nota: En este ejemplo el script se llama 'Prueba' y está asociado a un GameObject (Cubo) en la posición (0,0,0). El objeto 'transform' está asociado al GameObject donde se encuentra el script (en este caso la esfera). Position es un Vector3(x,y,z) con las coordenadas del GameObject y que se encuentran gráficamente en la ventana 'Inspector' de Unity.


  • Ahora ejecutar el juego y podéis ver como en la ventana de consola de Unity aparece el mensaje:
Unity3d scripts 14.JPG
Si ahora (estando en ejecución) colocáis el cubo en la posición 5 de la coordenada X:
Unity3d scripts 15.JPG
No paran de aparecer mensajes de información (tipo warning) sobre la posición del cubo.
¿ Por qué no paran de salir mensajes ?
Porque el mensaje de log se imprime en el método Update, que se llama una vez por cada fotograma (si el ordenador da para 60fps, el método se está llamando 60 veces cada segundo). Veremos esto más adelante en el manual.