Diferencia entre revisiones de «Unity Scripts»
Ir a la navegación
Ir a la búsqueda
| Línea 18: | Línea 18: | ||
=Referencias dentro de los Scripts= | =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. | ||
| + | |||
| + | |||
| + | |||
| + | *'''<u>Nota para programadores:</u>''' | ||
| + | :* 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: | ||
| + | |||
| + | <syntaxhighlight lang="java" line enclose="div" highlight="6"> | ||
| + | using UnityEngine; | ||
| + | |||
| + | public class ScriptCubo : MonoBehaviour { | ||
| + | |||
| + | [SerializeField] | ||
| + | public Transform esfera; | ||
| + | |||
| + | // Use this for initialization | ||
| + | void Start () { | ||
| + | Debug.Log(gameObject.transform.position); | ||
| + | } | ||
| + | |||
| + | // Update is called once per frame | ||
| + | void Update () { | ||
| + | |||
| + | } | ||
| + | } | ||
| + | |||
| + | </syntaxhighlight> | ||
| + | |||
| + | * 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. | ||
| + | [[Imagen:Unity3d_scripts_16.jpg|500px|center]] | ||
| + | : 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 <u> de la escena</u> a dicha propiedad. | ||
| + | [[Imagen:Unity3d_scripts_17.jpg|500px|center]] | ||
| + | : 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: | ||
| + | |||
| + | <syntaxhighlight lang="java" line enclose="div" highlight="3"> | ||
| + | void Update () { | ||
| + | |||
| + | esfera.position = transform.position + Vector3.up*2; | ||
| + | } | ||
| + | </syntaxhighlight> | ||
| + | : 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. | ||
| + | [[Imagen:Unity3d_scripts_18.jpg|500px|center]] | ||
| + | |||
| + | |||
| + | : 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... | ||
| + | <syntaxhighlight lang="java" line enclose="div" highlight="6,11"> | ||
| + | public class ScriptCubo : MonoBehaviour { | ||
| + | |||
| + | [SerializeField] | ||
| + | public Transform esfera; | ||
| + | [SerializeField] | ||
| + | public float velocidad; | ||
| + | |||
| + | ..... | ||
| + | void Update () { | ||
| + | |||
| + | esfera.position = Vector3.Lerp(esfera.position, transform.position, velocidad * Time.deltaTime); | ||
| + | } | ||
| + | </syntaxhighlight> | ||
| + | |||
| + | : 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. | ||
| + | [[Imagen:Unity3d_scripts_19.jpg|500px|center]] | ||
| + | |||
<br /> | <br /> | ||
| + | * Al igual que hemos hecho una 'referencia' a la propiedad 'Transform' de un GameObject, podemos '''pasar referencias de cualquier componente de un gameobject e <u>incluso de un GameObject completo</u>'''. | ||
| + | : Vamos a modificar el script para que al pulsar la tecla espaciador, la esfera se destruya. | ||
| + | : Para destruir un GameObject necesitamos hacer uso del [https://docs.unity3d.com/ScriptReference/Object.Destroy.html 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. | ||
| + | |||
| + | :<u>Nota:</u> 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: | ||
| + | <syntaxhighlight lang="java" line enclose="div" highlight="6,16-19"> | ||
| + | using UnityEngine; | ||
| + | |||
| + | public class ScriptCubo : MonoBehaviour { | ||
| + | |||
| + | [SerializeField] | ||
| + | public GameObject esfera; | ||
| + | |||
| + | // Use this for initialization | ||
| + | void Start () { | ||
| + | |||
| + | } | ||
| + | |||
| + | // Update is called once per frame | ||
| + | void Update () { | ||
| + | |||
| + | if (Input.GetKeyDown(KeyCode.Space)) | ||
| + | { | ||
| + | Destroy(esfera, 2); | ||
| + | } | ||
| + | |||
| + | } | ||
| + | } | ||
| + | </syntaxhighlight> | ||
| + | |||
| + | :* 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. | ||
| + | |||
| + | <gallery caption="Cambiando la escala" widths="350" heights="300px" perrow="2"> | ||
| + | Image:Unity3d_scripts_20.jpg| Debemos '''arrastrar''' la esfera nuevamente a la propiedad esfera del script, '''pero ahora lo que guardaremos será la referencia al GameObject'''. | ||
| + | Image:Unity3d_scripts_21.jpg| Si pulsamos la barra espaciador en la ventana de Game, podremos comprobar como el gameobject 'Sphere' desaparece de la 'Proyect Window'. | ||
| + | </gallery> | ||
| + | |||
| + | |||
| + | <br /> | ||
| + | * 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. | ||
| + | |||
| + | |||
| + | <br /> | ||
| + | |||
=Obtener una referencia de cualquier componente= | =Obtener una referencia de cualquier componente= | ||
Revisión del 16:24 25 ene 2019
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).