Ícone do site dfilitto

Arquiteturas de Input no Unity: Event-Driven vs. Polling Direct

a person holding a game controller

Photo by Yan Krukau on Pexels.com

No desenvolvimento de jogos 3D com o Unity Input System, uma das primeiras decisões de arquitetura que impacta diretamente a organização do código é: como o script do personagem deve ler os comandos do jogador?

Historicamente, o Unity trabalhou com abordagens baseadas em eventos (callbacks). No entanto, o padrão de Leitura Direta (Polling) vem ganhando forte espaço em controles de personagens em primeira pessoa (FPS) e terceira pessoa.

Neste artigo, analisamos as diferenças técnicas, vantagens e o contexto ideal para cada uma dessas abordagens.

1. Abordagem Event-Driven (Callbacks / OnMove)

Na abordagem baseada em eventos, o componente Player Input do Unity fica responsável por “avisar” o seu script sempre que um botão ou eixo muda de estado.

Como funciona?

O sistema dispara um método específico (como OnMove ou OnJump) via mensagens ou eventos do C#. O script intercepta esse evento, extrai o valor e o armazena em uma variável global da classe para ser utilizada posteriormente no loop principal.

C#

// --- ABORDAGEM VIA CALLBACK (EVENTOS) ---
public class PlayerControllerEvents : MonoBehaviour
{
    private Vector2 moveInput;

    // O Unity aciona este método automaticamente quando o teclado muda de estado
    public void OnMove(InputValue value)
    {
        moveInput = value.Get<Vector2>();
    }

    private void Update()
    {
        // O movimento é executado utilizando o último valor armazenado
        Vector3 move = new Vector3(moveInput.x, 0, moveInput.y);
        transform.Translate(move * Time.deltaTime);
    }
}

Vantagens:

Desvantagens em Controle de Personagens:

2. Abordagem por Leitura Direta (Polling / ReadValue)

A abordagem por Leitura Direta (Polling Direct) inverte esse fluxo. Em vez de esperar ser notificado, o script do personagem consulta o estado atual das ações mapeadas exatamente no momento em que precisa processar a física ou o movimento.

Como funciona?

Obtemos referências diretas para o mapa de ações (InputAction) e executamos o .ReadValue<T>() ou .WasPressedThisFrame() dentro dos métodos do ciclo de vida da Unity (Update / FixedUpdate).

C#

// --- ABORDAGEM VIA LEITURA DIRETA (POLLING) ---
public class PlayerControllerPolling : MonoBehaviour
{
    private InputAction moveAction;
    private CharacterController controller;

    private void Awake()
    {
        // Mapeamento direto da ação
        moveAction = InputSystem.actions.FindAction("Move");
        controller = GetComponent<CharacterController>();
    }

    private void Update()
    {
        HandleMovement();
    }

    private void HandleMovement()
    {
        // Consulta o teclado/controle no exato momento da execução
        Vector2 input = moveAction.ReadValue<Vector2>();

        Vector3 moveDirection = (transform.forward * input.y) + (transform.right * input.x);
        controller.Move(moveDirection * Time.deltaTime);
    }
}

Vantagens:

Tabela Comparativa

CritérioAbordagem por Eventos (OnMove)Leitura Direta (ReadValue)
ParadigmaReativo (Event-Driven)Consultivo (Polling)
Uso de VariáveisExige variáveis membros para estado.Utiliza variáveis locais nos métodos.
Clareza de CódigoEspalhado em callbacks callbacks.Concentrado e sequencial.
Uso IdealInterface de Usuário, Menus, Habilidades de clique único.Movimentação contínua de Personagens (FPS, TPS, Racing).

Conclusão

Embora a abordagem por eventos seja muito poderosa para sistemas reativos (como abrir um menu ao pressionar ESC), a Leitura Direta (ReadValue) se consolida como a escolha mais elegante e legível para sistemas de controle de personagens em tempo real.

Ela simplifica a depuração, torna o código autocontido e garante que a matemática de movimento e física seja aplicada de forma previsível a cada frame.

Sair da versão mobile