Diferencia entre revisiones de «Unity Gestión Dispositivos de Entrada»
Ir a la navegación
Ir a la búsqueda
Pantalla de configuración de un Juego generado por Unity. Podemos ver en la parte izquierda todos los ejes definidos y que teclas/controles están asociados, pudiendo cambiarlos.
| Línea 16: | Línea 16: | ||
=Entrada estándar= | =Entrada estándar= | ||
| − | * La idea que utiliza Unity para detectar entradas de diferentes dispositivos es la de 'inventar' variables que son usadas por los scripts para gestionar los eventos que se producen desde dispositivos externos como teclados o ratones. | + | * La idea que utiliza Unity para detectar entradas de diferentes dispositivos es la de 'inventar' variables (denominados '''ejes''' => Axes) que son usadas por los scripts para gestionar los eventos que se producen desde dispositivos externos como teclados o ratones. |
| − | : Unity va a 'asociar' los diferentes dispositivos a | + | : Unity va a 'asociar' los diferentes dispositivos a estos 'ejes'. |
* Veamos un ejemplo para verlo más claro. | * Veamos un ejemplo para verlo más claro. | ||
: Una variable que crea Unity es '''Input.GetAxis ("Horizontal")''' | : Una variable que crea Unity es '''Input.GetAxis ("Horizontal")''' | ||
| − | : Podemos hacer uso de esta variable desde cualquier script de Unity y devolverá un valor entre -1 y 1, siendo 0 el valor por defecto, -1 cuando cuando mantenemos presionado durante cierto tiempo un dispositivo de entrada (por ejemplo, un joystick desplazando la palanca hacia la izquierda, o presionando y manteniendo la presión de una tecla de un teclado, como la | + | : Podemos hacer uso de esta variable desde cualquier script de Unity y devolverá un valor entre -1 y 1, siendo 0 el valor por defecto, -1 cuando cuando mantenemos presionado durante cierto tiempo un dispositivo de entrada (por ejemplo, un joystick desplazando la palanca hacia la izquierda, o presionando y manteniendo la presión de una tecla de un teclado, como la flecha izquierda,...) y +1 cuando el desplazamiento es hacia el otro sentido y la tecla pulsada es otra (por ejemplo la flecha derecha). |
* Ahora desde Unity podemos indicarle que dispositivo de entrada se va a corresponder con esta variable. | * Ahora desde Unity podemos indicarle que dispositivo de entrada se va a corresponder con esta variable. | ||
| + | : ''Nota:''' Unity tiene definidos unos 'ejes' por defecto, pero será necesario hacer uso de ellos en nuestros scripts para que tengan algún efecto sobre nuestro juego. | ||
| + | |||
| + | <gallery caption="Ejes creados por Unity" widths="350" heights="300px" perrow="2"> | ||
| + | Image:Unity3d_input_1.JPG| Menú 'Edit' => 'Project Settings' => 'Input'. | ||
| + | Image:Unity3d_input_2.jpg| Como vemos aparecen 18 'variables' virtuales ('''ejes''') que están asociadas a diferentes dispositivos de entrada. Estos son controles típicos que suelen tener todos los juegos y que ya vienen predefinidos por defecto. | ||
| + | Image:Unity3d_input_3.jpg| Vemos por ejemplo como Unity tiene definido un 'eje' por defecto de nombre 'Jump'. Analizamos sus valores a continuación. | ||
| + | </gallery> | ||
| + | |||
| + | |||
| + | * '''Eje Jump''': | ||
| + | :* Normalmente será empleado para 'saltar'. | ||
| + | :* Devolverá un valor entre 0 y 1. | ||
| + | |||
| + | :* Propiedad '''Name''': Es utilizada para hacer referencia a ella desde los scripts. | ||
| + | :* Propiedad '''Positive Button''': Indica que parte del dispositivo de entrada provocará que esta variable tenga un valor positivo. Por defecto es la barra espaciador | ||
| + | :* Propiedad '''Gravity''': Indica como se ve afectado este eje por la gravedad cuando llega a su valor máximo negativo o positivo (-1 o 1). Si ponemos un valor muy alto (como viene por defecto) pasaremos de 1 a 0 o de -1 a 0 de forma inmediata cuando dejemos de pulsar la tecla. | ||
| + | :* Propiedad '''Dead''': Es una propiedad que se utiliza en dispositivos de tipo analógico (como Joystick´s ) e indica que valor como mínimo tendría que tomar el dispositivo para que se tuviera en cuenta su pulsación (por ejemplo, al mover la palanca del Joystick, a partir de que punto se detectaría el salto). | ||
| + | :* Propiedad '''Sensitivity''': Es lo contrario de Gravity e indica la velocidad en unidades por segundo en que aumenta el valor del eje al pulsar la tecla espaciador. Si ponemos un valor muy alto pasará inmediatamente de 0 a 1 o de 0 a -1. | ||
| + | :* Propiedad '''Type''': Indica que dispositivos de entrada van a tenerse en cuenta para modificar el valor de este eje. Está indicado 'Key or MouseButton'. En este caso sólo está configurado para que responda a la tecla espaciador, pero el tipo engloba a los dos dispositivos. | ||
| + | :* Propiedad '''Axis''': En este caso no importa el Axis que pongamos ya que la activación la hacemos al pulsar una tecla. Esto tendría sentido si por ejemplo determinamos que el salto se controla con el movimiento de ratón al movernos de izquierda a derecha (pondríamos X axis) o con el movimiento de la palanca de un Joystick subiéndola o bajándola (pondríamos Y axis y en Type pondríamos Joystick Axis) | ||
| + | |||
| − | |||
| − | |||
| + | * Veamos un ejemplo práctico de este eje. | ||
| + | <gallery caption="Ejemplo uso de eje Jump" widths="350" heights="300px" perrow="2"> | ||
| + | Image:Unity3d_input_4.jpg| Creamos una escena nueva (o sobre un EmptyGameObject) formada por un plano, una esfera a la que hemos asociado un Collider y un RigidBody. | ||
| + | Image:Unity3d_input_5.jpg| Después de asociar a la esfera el script que viene a continuación podremos comprobar como al pulsar la barra espaciador (asociado al eje de nombre Space de Unity) se le aplica una fuerza a la esfera. | ||
</gallery> | </gallery> | ||
| + | '''Script UD3_DispositivosEntrada_1''': Asociado a la esfera de la escena de ejemplo. | ||
| + | <syntaxhighlight lang="java" line enclose="div" highlight="24"> | ||
| + | using UnityEngine; | ||
| + | |||
| + | public class UD3_DispositivosEntrada_1 : MonoBehaviour { | ||
| + | |||
| + | [SerializeField] | ||
| + | private Rigidbody rb; | ||
| + | [SerializeField] | ||
| + | private float empuje; | ||
| + | |||
| + | private float saltar; | ||
| + | |||
| + | private void Start() | ||
| + | { | ||
| + | empuje = 20f; | ||
| + | saltar = 0; | ||
| + | } | ||
| + | private void Reset() | ||
| + | { | ||
| + | rb = GetComponent<Rigidbody>(); | ||
| + | } | ||
| + | |||
| + | private void FixedUpdate() | ||
| + | { | ||
| + | saltar = Input.GetAxis("Jump"); // Valores 0 o 1 | ||
| + | Debug.Log(saltar); | ||
| + | rb.AddForce(Vector3.up * empuje * saltar); | ||
| + | } | ||
| + | } | ||
| + | </syntaxhighlight> | ||
| + | |||
| + | :* '''Línea 24''': Como vemos recuperamos el valor del eje por su nombre. | ||
| + | |||
| + | |||
| + | * Y os estaréis preguntando, ¿ por qué es mejor esta forma que esta otra ? | ||
| + | <syntaxhighlight lang="java" line enclose="div" highlight=""> | ||
| + | private void FixedUpdate() | ||
| + | { | ||
| + | //saltar = Input.GetAxis("Jump"); // Valores 0 o 1 | ||
| + | if (Input.GetKeyDown(KeyCode.Space)) | ||
| + | { | ||
| + | Debug.Log(saltar); | ||
| + | saltar = 1; | ||
| + | } | ||
| + | if (Input.GetKeyUp(KeyCode.Space)) | ||
| + | { | ||
| + | saltar = 0; | ||
| + | } | ||
| + | rb.AddForce(Vector3.up * empuje * saltar); | ||
| + | } | ||
| + | |||
| + | </syntaxhighlight> | ||
| + | <br /> | ||
| + | : Por un lado está que el otro código es bastante más sencillo (se podría hacer que saltar fuese booleana e igualarla al Input.GetKeyDown, pero en ese caso no podríamos utilizar valores entre 0-1 para saltar, como podemos hacer si utilizamos los ejes. | ||
| + | : Por otro y quizás el más importante, nos hace dependiente del dispositivo. Es decir, tendría que programar todas las opciones de todos los dispositivos que supusieran realizar un salto. | ||
| + | : Por ejemplo, si quiero que si pulso el botón derecho del ratón también salte tendría que poner: | ||
| + | <syntaxhighlight lang="java" line enclose="div" highlight="4,9"> | ||
| + | private void FixedUpdate() | ||
| + | { | ||
| + | //saltar = Input.GetAxis("Jump"); // Valores 0 o 1 | ||
| + | if (Input.GetKeyDown(KeyCode.Space) || Input.GetMouseButtonDown(0)) | ||
| + | { | ||
| + | Debug.Log(saltar); | ||
| + | saltar = 1; | ||
| + | } | ||
| + | if (Input.GetKeyUp(KeyCode.Space) || Input.GetMouseButtonUp(0)) | ||
| + | { | ||
| + | saltar = 0; | ||
| + | } | ||
| + | rb.AddForce(Vector3.up * empuje * saltar); | ||
| + | } | ||
| + | } | ||
| − | + | </syntaxhighlight> | |
| + | : Y lo mismo para Joystick´s y cualquier otro dispositivo. | ||
| + | : Veamos como sería si hacemos uso del Eje Jump: | ||
| + | :* Dejamos el código como estaba: | ||
| + | :::<syntaxhighlight lang="java" line enclose="div" highlight="3"> | ||
| + | private void FixedUpdate() | ||
| + | { | ||
| + | saltar = Input.GetAxis("Jump"); // Valores 0 o 1 | ||
| + | Debug.Log(saltar); | ||
| + | rb.AddForce(Vector3.up * empuje * saltar); | ||
| + | } | ||
| + | </syntaxhighlight> | ||
| + | :* Modificamos la propiedad 'Alt Positive Button' para indicar que otro dispositivo de entrada provoca un cambio positivo (desde 0 a 1) en el valor del eje. En nuestro caso sería '''mouse 0''' que es un valor predeterminado de Unity para hacer referencia al botón izquierdo del ratón. | ||
| + | [[Imagen:Unity3d_input_6.jpg|500px|center]] | ||
| + | :: Y ya está no tenemos que realizar nada más. | ||
| + | * <u>'''Nota:</u>''' Fijarse que podríamos crear nuevos ejes con el mismo nombre y que funcionaran de acuerdo a otros dispositivos de entrada. Podría crear otro eje 'Jump' que funcionara cuando pulse un determinado botón del Joystick'. | ||
| + | * Otra ventaja que tiene hacer uso de este método es de permitir al jugador configurar las teclas de los diferentes 'ejes' antes de jugar. | ||
| + | [[Imagen:Unity3d_input_6.jpg|800px|center]] | ||
| + | <small><center>Pantalla de configuración de un Juego generado por Unity. Podemos ver en la parte izquierda todos los ejes definidos y que teclas/controles están asociados, pudiendo cambiarlos.</center></small> | ||
Revisión del 12:24 16 feb 2019
Introducción
- Más información en https://docs.unity3d.com/es/current/Manual/Input.html.
- Durante el juego es necesario que el jugador interaccione con el mismo de alguna manera.
- Dependiendo de la plataforma, puede variar el dispositivo de entrada:
- En un PC puede hacer uso del teclado, ratón o joystick
- En un teléfono móvil puede hacer uso de la pantalla táctil o del acelerómetro.
- En una consola de su mando de juegos.
- Con gafas de realidad virtual de su vista o movimiento de cabeza.
Entrada estándar
- La idea que utiliza Unity para detectar entradas de diferentes dispositivos es la de 'inventar' variables (denominados ejes => Axes) que son usadas por los scripts para gestionar los eventos que se producen desde dispositivos externos como teclados o ratones.
- Unity va a 'asociar' los diferentes dispositivos a estos 'ejes'.
- Veamos un ejemplo para verlo más claro.
- Una variable que crea Unity es Input.GetAxis ("Horizontal")
- Podemos hacer uso de esta variable desde cualquier script de Unity y devolverá un valor entre -1 y 1, siendo 0 el valor por defecto, -1 cuando cuando mantenemos presionado durante cierto tiempo un dispositivo de entrada (por ejemplo, un joystick desplazando la palanca hacia la izquierda, o presionando y manteniendo la presión de una tecla de un teclado, como la flecha izquierda,...) y +1 cuando el desplazamiento es hacia el otro sentido y la tecla pulsada es otra (por ejemplo la flecha derecha).
- Ahora desde Unity podemos indicarle que dispositivo de entrada se va a corresponder con esta variable.
- Nota:' Unity tiene definidos unos 'ejes' por defecto, pero será necesario hacer uso de ellos en nuestros scripts para que tengan algún efecto sobre nuestro juego.
- Ejes creados por Unity
- Eje Jump:
- Normalmente será empleado para 'saltar'.
- Devolverá un valor entre 0 y 1.
- Propiedad Name: Es utilizada para hacer referencia a ella desde los scripts.
- Propiedad Positive Button: Indica que parte del dispositivo de entrada provocará que esta variable tenga un valor positivo. Por defecto es la barra espaciador
- Propiedad Gravity: Indica como se ve afectado este eje por la gravedad cuando llega a su valor máximo negativo o positivo (-1 o 1). Si ponemos un valor muy alto (como viene por defecto) pasaremos de 1 a 0 o de -1 a 0 de forma inmediata cuando dejemos de pulsar la tecla.
- Propiedad Dead: Es una propiedad que se utiliza en dispositivos de tipo analógico (como Joystick´s ) e indica que valor como mínimo tendría que tomar el dispositivo para que se tuviera en cuenta su pulsación (por ejemplo, al mover la palanca del Joystick, a partir de que punto se detectaría el salto).
- Propiedad Sensitivity: Es lo contrario de Gravity e indica la velocidad en unidades por segundo en que aumenta el valor del eje al pulsar la tecla espaciador. Si ponemos un valor muy alto pasará inmediatamente de 0 a 1 o de 0 a -1.
- Propiedad Type: Indica que dispositivos de entrada van a tenerse en cuenta para modificar el valor de este eje. Está indicado 'Key or MouseButton'. En este caso sólo está configurado para que responda a la tecla espaciador, pero el tipo engloba a los dos dispositivos.
- Propiedad Axis: En este caso no importa el Axis que pongamos ya que la activación la hacemos al pulsar una tecla. Esto tendría sentido si por ejemplo determinamos que el salto se controla con el movimiento de ratón al movernos de izquierda a derecha (pondríamos X axis) o con el movimiento de la palanca de un Joystick subiéndola o bajándola (pondríamos Y axis y en Type pondríamos Joystick Axis)
- Veamos un ejemplo práctico de este eje.
- Ejemplo uso de eje Jump
Script UD3_DispositivosEntrada_1: Asociado a la esfera de la escena de ejemplo.
1 using UnityEngine;
2
3 public class UD3_DispositivosEntrada_1 : MonoBehaviour {
4
5 [SerializeField]
6 private Rigidbody rb;
7 [SerializeField]
8 private float empuje;
9
10 private float saltar;
11
12 private void Start()
13 {
14 empuje = 20f;
15 saltar = 0;
16 }
17 private void Reset()
18 {
19 rb = GetComponent<Rigidbody>();
20 }
21
22 private void FixedUpdate()
23 {
24 saltar = Input.GetAxis("Jump"); // Valores 0 o 1
25 Debug.Log(saltar);
26 rb.AddForce(Vector3.up * empuje * saltar);
27 }
28 }
- Línea 24: Como vemos recuperamos el valor del eje por su nombre.
- Y os estaréis preguntando, ¿ por qué es mejor esta forma que esta otra ?
1 private void FixedUpdate()
2 {
3 //saltar = Input.GetAxis("Jump"); // Valores 0 o 1
4 if (Input.GetKeyDown(KeyCode.Space))
5 {
6 Debug.Log(saltar);
7 saltar = 1;
8 }
9 if (Input.GetKeyUp(KeyCode.Space))
10 {
11 saltar = 0;
12 }
13 rb.AddForce(Vector3.up * empuje * saltar);
14 }
- Por un lado está que el otro código es bastante más sencillo (se podría hacer que saltar fuese booleana e igualarla al Input.GetKeyDown, pero en ese caso no podríamos utilizar valores entre 0-1 para saltar, como podemos hacer si utilizamos los ejes.
- Por otro y quizás el más importante, nos hace dependiente del dispositivo. Es decir, tendría que programar todas las opciones de todos los dispositivos que supusieran realizar un salto.
- Por ejemplo, si quiero que si pulso el botón derecho del ratón también salte tendría que poner:
1 private void FixedUpdate()
2 {
3 //saltar = Input.GetAxis("Jump"); // Valores 0 o 1
4 if (Input.GetKeyDown(KeyCode.Space) || Input.GetMouseButtonDown(0))
5 {
6 Debug.Log(saltar);
7 saltar = 1;
8 }
9 if (Input.GetKeyUp(KeyCode.Space) || Input.GetMouseButtonUp(0))
10 {
11 saltar = 0;
12 }
13 rb.AddForce(Vector3.up * empuje * saltar);
14 }
15 }
- Y lo mismo para Joystick´s y cualquier otro dispositivo.
- Veamos como sería si hacemos uso del Eje Jump:
- Dejamos el código como estaba:
1 private void FixedUpdate() 2 { 3 saltar = Input.GetAxis("Jump"); // Valores 0 o 1 4 Debug.Log(saltar); 5 rb.AddForce(Vector3.up * empuje * saltar); 6 }
- Modificamos la propiedad 'Alt Positive Button' para indicar que otro dispositivo de entrada provoca un cambio positivo (desde 0 a 1) en el valor del eje. En nuestro caso sería mouse 0 que es un valor predeterminado de Unity para hacer referencia al botón izquierdo del ratón.
- Y ya está no tenemos que realizar nada más.
- Nota: Fijarse que podríamos crear nuevos ejes con el mismo nombre y que funcionaran de acuerdo a otros dispositivos de entrada. Podría crear otro eje 'Jump' que funcionara cuando pulse un determinado botón del Joystick'.
- Otra ventaja que tiene hacer uso de este método es de permitir al jugador configurar las teclas de los diferentes 'ejes' antes de jugar.
-- Ángel D. Fernández González -- (2018).
