Input Convencional de Juego
Teclado móvil

Input de Dispositivo Móvil

En dispositivos móviles, la clase Input ofrece acceso al input de la pantalla táctil, acelerómetro y geográfico/ubicación.

Acceso al teclado en los dispositivos móviles se proporciona a través de iOS keyboard.

Pantalla Multi-Touch (multi-táctil)

Los dispositivos iPhone y iPod Touch son capaces de rastrear hasta cinco dedos tocando la pantalla al mismo tiempo. Puede recuperar el estado de cada dedo tocando la pantalla durante el último cuadro accediendo a la matriz de propiedad Input.touches.

Los dispositivos Android no tienen un limite unificado en cuántos dedos pueden rastrear. En vez, esto varia de dispositivo en dispositivo y puede ser cualquiera desde dos dedos en dispositivos viejos hasta cinco dedos en algunos nuevos dispositivos.

Note: Touch API is also supported in Windows Standalone and Windows Editor (game view window) when running on the device with touch screen.

Cada toque de dedo es representado por una estructura de dato Input.Touch:

Propiedad: Función:
fingerId El único índice para un toque.
position La posición en la pantalla del tacto.
deltaPosition El cambio de la posición en la pantalla desde el último cuadro.
deltaTime El tiempo que ha pasado desde el último cambio de estado.
tapCount La pantalla del Iphone/Ipad es capaz de distinguir tactos rápidos del dedo hechos por el usuario. Este contador le va a permitir saber qué tantas veces el usuario a tocado la pantalla sin mover un dedo a los lados. Los dispositivos Android no tienen un número contable de tactos, este campo siempre es 1.
phase Describe lo que se llama “phase (fase)” o el estado del toque. Le puede ayudar a determinar si el toque acaba de empezar, si el usuario movió el dedo o si levanto el dedo.

La fase puede ser una de las siguientes:

Began Un dedo acaba de tocar la pantalla.
Moved Un dedo se movió en la pantalla.
Stationary Un dedo está tocando la pantalla pero no se ha movido desde el último cuadro.
Ended Un dedo fue alzado desde la pantalla. Esta es la fase final de un toque.
Canceled El sistema ha cancelado el rastreo para el toque, como cuando (por ejemplo) el usuario pone el dispositivo a su cara o más de cinco toques pasan simultáneamente. Esta es la fase final del toque.

A continuación se muestra un script de ejemplo que disparará un rayo cuando el usuario golpee la pantalla:

var particle : GameObject;
function Update () {
    for (var touch : Touch in Input.touches) {
        if (touch.phase == TouchPhase.Began) {
            // Construct a ray from the current touch coordinates
            var ray = Camera.main.ScreenPointToRay (touch.position);
            if (Physics.Raycast (ray)) {
                // Create a particle if hit
                Instantiate (particle, transform.position, transform.rotation);
            }
        }
    }
}


Simulación del Mouse

Encima del soporte nativo táctil Unity iOS/Android proporciona una simulación de mouse. Usted puede utilizar una funcionalidad de mouse desde la clase estándar Input. Tenga en cuenta que dispositivos iOS/Android están diseñados para soportar múltiples toques de dedos. Utilizar la funcionalidad mouse, solo va a soportar un solo toque de dedo. También, el toque de dedo en dispositivos móviles se puede mover de una área a otra sin un movimiento entre ellos. La simulación de mouse en dispositivos móviles va a proporcionar movimiento, por lo que es muy diferente comparado a un input táctil. La recomendación es utilizar la simulación mouse durante un desarrollo temprano pero utilizar input táctil tan pronto como sea posible.

Acelerómetro

A medida que el dispositivo móvil se mueva, un acelerómetro integrado reporta una aceleración lineal. cambios a lo largo de los tres principales ejes en un espacio tridimensional. Aceleración a lo largo de cada eje es reportado directamente por el hardware como valores de una fuerza gravitacional(G-force values). Un valor de 1.0 representa una carga de aproximadamente +1g a lo largo del eje determinado mientras un valor de –1.0 representa –1g. Si mantiene el dispositivo en posición vertical (con el botón de inicio en el fondo) al frente de usted, el eje X es positivo a lo largo de la derecha, el eje Y es positivo directamente arriba, y el eje Z es apuntando positivamente hacia usted.

Usted puede recuperar el valor del acelerómetro accediendo a la propiedad Input.acceleration.

El siguiente es un ejemplo de script que moverá un objeto utilizando el acelerómetro:

var speed = 10.0;
function Update () {
    var dir : Vector3 = Vector3.zero;

    // we assume that the device is held parallel to the ground
    // and the Home button is in the right hand

    // remap the device acceleration axis to game coordinates:
    // 1) XY plane of the device is mapped onto XZ plane
    // 2) rotated 90 degrees around Y axis
    dir.x = -Input.acceleration.y;
    dir.z = Input.acceleration.x;

    // clamp acceleration vector to the unit sphere
    if (dir.sqrMagnitude > 1)
        dir.Normalize();

    // Make it move 10 meters per second instead of 10 meters per frame...
    dir *= Time.deltaTime;

    // Move object
    transform.Translate (dir * speed);
}


Low-Pass Filter (Filtro de Paso Bajo)

Las lecturas de acelerómetros pueden ser bruscas y ruidosas. Aplicando filtro de paso bajo(low-pass filtering) en la señal le permite a usted suavizarlo y deshacerse de ruidos de alta frecuencia.

El siguiente script le muestra a usted cómo aplicar un filtro de paso bajo(low-pass filtering) a las lecturas del acelerómetro:

var AccelerometerUpdateInterval : float = 1.0 / 60.0;
var LowPassKernelWidthInSeconds : float = 1.0;

private var LowPassFilterFactor : float = AccelerometerUpdateInterval / LowPassKernelWidthInSeconds; // tweakable
private var lowPassValue : Vector3 = Vector3.zero;
function Start () {
    lowPassValue = Input.acceleration;
}

function LowPassFilterAccelerometer() : Vector3 {
    lowPassValue = Vector3.Lerp(lowPassValue, Input.acceleration, LowPassFilterFactor);
    return lowPassValue;
}


Cuanto mayor sea el valor de LowPassKernelWidthInSeconds, más lento será el valor filtrado convergiendo hacia la muestra del input actual (y vice versa).

Quisiera la mayor precisión posible al leer el acelerómetro. ¿Qué debo hacer?

Leyendo la variable deInput.acceleration no es igual al sampling del hardware. Puesto simplemente, Unity prueba el hardware a una frecuencia de 60Hz y almacena el resultado a una variable. En realidad, las cosas son un poco más complicadas – el sampling del acelerómetro no ocurre en un intervalo de tiempo consistente, si bajo cargas significativas de CPU. Como un resultado, el sistema puede reportar 2 ejemplos durante un cuadre, luego un ejemplo durante el siguiente cuadro.

Usted puede acceder a todas las mediciones realizadas por el acelerómetro durante el cuadro. El siguiente código ilustrará un simple promedio de todos los eventos del acelerómetro recolectados dentro el último cuadro:

var period : float = 0.0;
var acc : Vector3 = Vector3.zero;
for (var evnt : iPhoneAccelerationEvent in iPhoneInput.accelerationEvents) {
    acc += evnt.acceleration * evnt.deltaTime;
    period += evnt.deltaTime;
}
if (period > 0)
    acc *= 1.0/period;
return acc;


Input Convencional de Juego
Teclado móvil