100. CLASE INPUT (II)










accelerationEvents:

static var accelerationEvents : AccelerationEvent[]

Variable de sólo lectura que devuelve una lista de mediciones de aceleración ocurridas durante el último frame. Dichas medidas son alojadas en variables temporales.

Dichas variables temporales son un array del tipo AccelerationEvent, que es una estructura con dos valores:

acceleration: De tipo Vector3, es el valor de aceleración.
deltaTime: De tipo float, el tiempo transcurrido desde la última medición de aceleración.


accelerationEventCount:

static var accelerationEventCount : int


Número de mediciones de aceleración ocurrida durante el último frame.


eatKeyPressOnTextFieldFocus:

static var eatKeyPressOnTextFieldFocus : boolean


Propiedad que indica si las teclas impresas son comidas por la entrada de texto si esta tiene el foco (por defecto true).


FUNCIONES DE CLASE:

GetAxis:

static function GetAxis (axisName : String) : float


Devuelve el valor del eje virtual identificado por axisName.

El valor estará en el rango -1...1 para entradas de teclado (tradicionalmente la flechas de desplazamiento) y joystick. Si el axis es indicado por el movimiento del ratón, éste será multiplicado por el eje de sensibilidad y su rango será distinto a -1…1.

Es una de las funciones con las que más tropezaremos cuando programemos con Unity, así que merece la pena que nos detengamos para ilustrarla con algún ejemplo.

El primer ejemplo lo hemos sacado del manual de referencia. Para que funciones bien (recordemos que tenemos en la actualidad MiPrimerScript vinculado a la esfera) es necesario que eliminemos el componente Rigidbody de la esfera. Y acto seguido editamos nuestro script como sigue:


var velocidad : float = 2.0;
var velocidadRotacion : float = 45.0;

function Update () {

var translacion : float = Input.GetAxis ("Vertical") * velocidad;
var rotacion : float = Input.GetAxis ("Horizontal") * velocidadRotacion;

translacion *= Time.deltaTime;
rotacion *= Time.deltaTime;

transform.Translate (0, 0, translacion);
transform.Rotate (0, rotacion, 0);
}


Tratemos de explicar lo que hemos hecho. A través de Input.GetAxis recogemos las entradas de teclado provinentes de las flechas de desplazamiento verticales y horizontales. Así, la flecha de desplazamiento hacia arriba vale 1 y la de desplazamiento hacia abajo vale -1, y lo mismo hacia la derecha (1) y la izquierda (-1). Dichos valores son multiplicados por la velocidad contenida en la variable "velocidad" en el caso del eje arriba/abajo, y por la contenida en la variable "velocidadRotacion" para el eje derecha/izquierda. Ambos valores son almacenados en variables de tipo Vector3 que luego -tras ser reconvertidos en velocidad por frame a velocidad por segundo- se utilizan para participar en el movimiento del game object tanto en el eje delante/detrás de translación como en el eje Y de rotación.

En suma, nos queda un script -muy básico y torpe, eso sí- para manejar el desplazamiento y giro de nuestra esfera en base a las flechas de desplazamiento. Probémoslo un rato.

Hemos dicho que Input.GetAxis también acepta como entrada el provocado por el movimiento vertical y horizontal del ratón, así que ilustrémoslo:


var velocidadHorizontal : float = 20.0;
var velocidadVertical : float = 20.0;

function Update () {
var h : float = velocidadHorizontal * Input.GetAxis ("Mouse X");
var v : float = velocidadVertical * Input.GetAxis ("Mouse Y");
transform.Rotate (v, h, 0);
}


Es un ejemplo sencillo. Se almacena en sendas variables el fruto de multiplicar el valor de los ejes de desplazamiento horizontal y vertical del ratón (que recordemos que no es -1,1) por el valor de velocidad que le hayamos dado a las variables expuestas del inicio de script. En base a ello, nuestra esfera girará sobre su eje X e Y en respuesta a los movimientos vertical y horizontal de nuestro ratón.


GetAxisRaw:

static function GetAxisRaw (axisName : String) : float


Devuelve el valor del eje virtual identificado por el parámetro axisName sin ningún filtro de suavizado aplicado. El valor estará en el rango de -1…1 para entrada de teclado y joystick. Como a la entrada -al contrario de la función anterior- no se le aplica smooth (suavizado),la entrada de teclado será siempre o -1 o cero o 1. Esta función puede sernos útil para el caso de que queramos hacer todo el proceso de suavizado de entrada nosotros mismos manualmente.


GetButton:

static function GetButton (buttonName : String) : boolean


Devuelve true mientras el botón virtual que le pasemos como parámetro en formato string esté presionado. Podemos pensar por ejemplo en un disparador automático, que devolvería true mientras el botón estuviera presionado.

Eso sí, así como esta función es óptima para acciones como disparar un arma, para cualquier tipo de movimiento es mejor usar GetAxis, que a éste le introduce valores de suavizado que en GetButton no hallaremos (ni podremos implementar manualmente, al contrario que en GetAxisRaw.

Un ejemplo:


var proyectil : GameObject;
var frecuenciaDisparo : float = 0.5;
private var proximoDisparo : float = 0.0;

function Update () {
if (Input.GetButton ("Fire1") && Time.time > proximoDisparo) {
proximoDisparo = Time.time + frecuenciaDisparo;
var clon : GameObject =
Instantiate(proyectil, transform.position+Vector3.forward, transform.rotation) as
GameObject;
}
}


Salvamos y arrastramos el cubo a la variable expuesta proyectil. Pulsamos play y observaremos que estamos clonando/disparando cubos cada vez que -dentro del lapso de tiempo permitido- pulsamos el botón izquierdo del ratón o la tecla Ctrl situada a la izquierda del teclado (que son por defecto los dos elementos que tenemos vinculados al evento Fire1. Por otro lado, si mantenemos pulsado de manera ininterrumpida bien el botón o bien la tecla indicados, observaremos que disparamos un cubo cada medio segundo.

En sí el script comprueba si hemos pulsado la tecla o botón que tengamos asignada a Fire1. En caso afirmativo pasa a comprobar si ha transcurrido un lapso de tiempo superior al que le hemos fijado en frecuenciaDisparo (que para el primer disparo valdrá cero). Si también es true esta segunda condición se le añade medio segundo de espera al resto de disparos más el tiempo transcurrido en hacerlo, el script nos permite clonar/disparar otro proyectil más.


GetButtonDown:

static function GetButtonDown (buttonName : String) : boolean


Devuelve true durante el frame en que el jugador aprieta el botón virtual identificado como buttonName. Debemos llamar siempre a esta función desde la función Update, dado que el estado se resetea cada frame. No devolverá true hasta que el usuario libere la tecla y la presione de nuevo, al igual que sucedía con anyKeyDown.


GetButtonUp:

static function GetButtonUp (buttonName : String) : boolean


Devuelve true el primer frame en que el jugador libera el botón virtual identificado como buttonName. Recordemos llamar esta función desde Update ya que se resetea su estado cada frame. No devolverá true hasta que se libere la tecla y se vuelva a presionar.

POSTED BY UnityScripts
POSTED IN
DISCUSSION 0 Comments

Leave a Reply

Con la tecnología de Blogger.