Unity Scripts
Revisión del 16:24 25 ene 2019 de Wiki (discusión | contribuciones) (→Referencias dentro de los Scripts)
Sumario
Introducción
- Ya vimos anteriormente en esta Wiki como crear un script y sus dos métodos principales.
- Ahora explicaré unos conceptos básicos de programación para los que no sepan programar y quieran aprender operaciones básicas para mover-interaccionar con las figuras 3D.
- Es resto de alumnos, puede ir a las secciones siguientes.
Programación básica
Referencias dentro de los Scripts
- Los scripts son la base del desarrollo de videojuegos.
- A pesar de las herramientas que nos ofrece Unity para 'crear' una escena, el movimiento-detección de colisiones-acciones deben ser programadas para dar sentido a nuestro videojuego.
- Nota para programadores:
- Los scripts son asociados a un GameObject de la escena.
- Los que sepan de programación orientada a objectos, todos los GameObjects vienen a ser Instancias de una clase en el momento el que se ejecuta el juego.
- Los scripts también son clases que se instancian cuando se inicia la ejecución.
- Dentro del script, podemos acceder a la instancia de la clase Transform y que guarda toda la información de rotación-escalado-posición del GameObject asociado.
- La forma de acceder es mediante la orden: transform (con minúscula) o gameObject.tranform.
- Fijarse que 'gameObject' lleva la primera letra con minúscula, indicando que hace referencia a la instancia 'actual' del gameobject asociado al script.
- Por lo tanto, todas las propiedades que aparecen cuando estamos en un script hacen referencia al 'gameObject' asociado y es lo mismo poner gameObject.propiedad que propiedad.
- Dentro de un script podemos definir propiedades que hagan referencia a otros gamebjects o componentes.
- La forma de hacerlo es la siguiente:
1 using UnityEngine;
2
3 public class ScriptCubo : MonoBehaviour {
4
5 [SerializeField]
6 public Transform esfera;
7
8 // Use this for initialization
9 void Start () {
10 Debug.Log(gameObject.transform.position);
11 }
12
13 // Update is called once per frame
14 void Update () {
15
16 }
17 }
- Como vemos estamos definiendo una propiedad con visibilidad public.
- Al hacerlo, dicha variable aparece reflejada en la ventana Inspector cuando asociemos el script a un GameObject.
- En la imagen hemos 'arrastrado' el script al gameobject Cubo (o lo podemos añadir pulsando el botón add component y buscando el script).
- Como vemos, gráficamente aparece la propiedad Transform que hemos definido en el script.
- Ahora solo tenemos que arrastrar un GameObject de la escena a dicha propiedad.
- Lo que hemos hecho es hacer que la propiedad esfera definida en el script (public Transform esfera) pase a ser el transform de la esfera.
- Por lo tanto, ahora desde el script 'ScriptCubo' el cual está asociado al gameobject Cubo vamos a poder realizar cualquier operación sobre el transform del objeto esfera.
- Por ejemplo, vamos a hacer que el cubo se 'mueva' hacia la posición de la esfera.
- Para ello modificamos el script y añadimos las siguientes líneas al método update:
1 void Update () {
2
3 esfera.position = transform.position + Vector3.up*2;
4 }
- Lo que estamos indicando con esta línea es situar a la esfera 2 unidades por encima (en el eje Y) de donde se encuentre el cubo.
- Se ejecutamos el juego y movemos el cubo en ejecución podemos comprobar como se mueve la esfera.
- Las posibilidades que nos brinda esto son muchas.
- Imaginar un juego en el que quieres que al protagonista (el cubo) siempre lo siga sin fiel robot (la esfera) a una cierta distancia...
- Podríamos modificar el script para que al pulsar la tecla espaciador, la esfera se dirigiera a la posición del cubo a una velocidad determinada...
1 public class ScriptCubo : MonoBehaviour {
2
3 [SerializeField]
4 public Transform esfera;
5 [SerializeField]
6 public float velocidad;
7
8 .....
9 void Update () {
10
11 esfera.position = Vector3.Lerp(esfera.position, transform.position, velocidad * Time.deltaTime);
12 }
- Recordar darle una velocidad en la ventana Inspector y al ejecutar el juego, podéis comprobar como si movemos el cubo (en la ventana Scene) la esfera lo sigue.
- Al igual que hemos hecho una 'referencia' a la propiedad 'Transform' de un GameObject, podemos pasar referencias de cualquier componente de un gameobject e incluso de un GameObject completo.
- Vamos a modificar el script para que al pulsar la tecla espaciador, la esfera se destruya.
- Para destruir un GameObject necesitamos hacer uso del método Destroy(Object obj, float t = 0.0F).
- A dicho método se le debe pasar como parámetro el objeto que queremos destruir y opcionalmente podemos indicar el tiempo que debe pasar desde que indicamos que queremos destruir el objeto hasta que se destruye realmente.
- Nota: Destruir quiere decir que el GameObject se elimina de la escena (y también se libera la memoria asociada al mismo).
- El script modificado es el siguiente:
1 using UnityEngine;
2
3 public class ScriptCubo : MonoBehaviour {
4
5 [SerializeField]
6 public GameObject esfera;
7
8 // Use this for initialization
9 void Start () {
10
11 }
12
13 // Update is called once per frame
14 void Update () {
15
16 if (Input.GetKeyDown(KeyCode.Space))
17 {
18 Destroy(esfera, 2);
19 }
20
21 }
22 }
- Línea 6: Ahora la referencia va a ser un GameObject (con todos sus componentes)
- Línea 16: Comprobamos si pulsamos la tecla barra espaciador.
- Línea 17: Eliminamos de la escena a la esfera después de 2 segundos.
- Cambiando la escala
- Con el anterior ejemplo debéis de tener claro que en Unity todo son clases (todos los componentes de un GameObject, el GameObject en si mismo,...) por lo que vais a poder obtener las referencias a dichas clases y cambiar por programación cualquier propiedad de las mismas o llamar a métodos que estén definidos en las mismas.
Todo son clases.
Obtener una referencia de cualquier componente
- GetComponent()
Métodos de la clase MonoBehaviour
- Awake/Start
- Reset
Orden de ejecución de los scripts / Componentes
-- Ángel D. Fernández González -- (2018).