Diferencia entre revisiones de «Unity Gestión Dispositivos de Entrada»

De MediaWiki
Ir a la navegación Ir a la búsqueda
Línea 147: Línea 147:
  
 
:* 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.
 
:* 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]]
+
[[Imagen:Unity3d_input_6.jpg|300px|center]]
  
 
:: Y ya está no tenemos que realizar nada más.
 
:: Y ya está no tenemos que realizar nada más.

Revisión del 12:27 16 feb 2019

Introducción

  • 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.


  • 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.


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.
Unity3d input 6.jpg
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.
Unity3d input 7.jpg
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.






-- Ángel D. Fernández González -- (2018).