Unity:Manuales:Input System

De WikiGarcia

El nuevo sistema de Input de Unity permite facilitar el manejo de entradas del usuario, en lugar de configurar cosas para cada dispositivo (touchpad, control, flechas), todo se configura desde el sistema y funcionan de la misma forma.

Importar el paquete

  • El paquete se importa desde el Package Manager->Input System.
  • Aparecerá una ventana preguntando si se desea deshabilitar el sistema anterior para el reproductor, salir sin seleccionar nada.
  • Dirigirse a Edit->Project Settings...->Player->Other Settings->Active Input Handling->Both.

Crear el Asset

  • Create->Input Actions

Al abrir el asset se muestra una ventana donde se declaran las acciones.

  • Action Maps: Para agrupar acciones por separado (Ej: Si el conjunto de acciones cambia si el personaje está a pie, en un auto, etc.)
  • Actions: Lista de acciones. Cada acción se le puede asignar un binding que sería la tecla que se le asocia. (Ej: saltar, disparar, mover, etc).
  • Properties: Se selecciona el tipo de acción.

Unity Events

  1. En el GameObject que se le va a asociar la acción agregarle el componente Player Input.
  2. Asignarle el asset de las acciones en el campo Actions y seleccionar el mapa que va a usar.
  3. En el Behavior seleccionar Invoke Unity Event, esto nos permite asociar la acción a una función de Unity que se encuentre en un GameObject.
  4. Crear el método en el GameObject y asociarlo en el Behavior.

C# Events

Es similar a con eventos de Unity, solo que las asociaciones a los eventos se hacen desde código.

  1. En el Behavior seleccionar Invoke C sharp Event.
  2. En el script donde queramos escuchar el evento crear las funciones necesarias.
public class Player : MonoBehaviour
{
    public PlayerInput playerInput;

    private void Awake()
    {
        playerInput = GetComponent<PlayerInput>();
        
        // El evento se dispara para todas las acciones,
        // por lo que hay que filtrarlo en la funcion
        playerInput.onActionTriggered += PlayerInput_onActionTriggered;
    }

    private void PlayerInput_onActionTriggered(InputAction.CallbackContext context)
    {
        Debug.Log(context);
    }
}