Introdução
Você já abriu um tutorial de movimento, copiou e colou a linha mágica Input.GetKey(KeyCode.Space) e ela funcionou? Ótimo.
Mas, e se você quiser que o pulo funcione também no controle? E se a pessoa estiver jogando em um celular? E se ela quiser remapear os botões?
Se você usa o sistema antigo (Input.GetKey), a resposta é: você vai ter que escrever muitas linhas de código confusas, cheias de if e else, e o seu projeto vai se tornar um M.U.P. de complexidade.
A gente sabe como é. O Legacy Input (o antigo) é fácil, mas ele é uma armadilha.
Este post é o seu mapa para o New Input System. Ele exige um passo extra no começo, mas ele resolve 90% dos seus problemas de input para o MVP do seu jogo.
O Inimigo: O Legacy Input System (O M.U.P. Escondido)
O sistema antigo é baseado em Polling. O que isso significa?
- Você pergunta: A cada frame, o seu código pergunta: “O botão A está apertado? E o B? E o espaço?”
- Problema: Ele é acoplado. Se você muda a tecla, você tem que mudar direto no código.
- Limitação Prática: Ele só entende teclado, mouse e joysticks básicos de forma simples. Suporte a multi-plataforma? Prepare-se para o caos e para anular o MVP.
Analogia Pragmática: Usar o Legacy Input é como ter um interruptor de luz embutido na parede. Você tem que ir lá e mexer no fio toda vez que quiser usar um controle ou um pedal.
O Herói: O New Input System (Pragmatismo e Flexibilidade)
O sistema novo (New Input System) é baseado em Events (Eventos).
- Ação dispara: O sistema avisa o seu código apenas quando uma ação acontece (o botão foi apertado, solto, ou está sendo segurado).
- Flexibilidade: Você define uma Ação (ex: “Pular”) e mapeia essa Ação para vários botões (tecla Espaço, botão A do controle, toque na tela, etc.) em um único arquivo de configuração.
| Recurso | Legacy Input | New Input System |
| Instalação | Integrado na Engine | Pacote Externo (Window > Package Manager) |
| Mapeamento | Apenas via Código (direto) | Arquivo de Ações (Fácil remapeamento) |
| Multi-Plataforma | Difícil e manual | Fácil e automático |
| Performance | Polling (pergunta a cada frame) | Eventos (avisa quando algo acontece) |
Passo a Passo Pragmático para o Novo Sistema
Para o seu próximo projeto, use este processo:
1. Instalação (O Passo Extra)
Vá em Window > Package Manager. No canto superior esquerdo, mude para Unity Registry. Procure por Input System e clique em Install.
2. Criando o Mapa de Ações
Este é o coração do sistema.
- Clique com o botão direito em uma pasta de Assets e vá em Create > Input Actions. Chame de
PlayerInputActions. - Dê dois cliques no arquivo. Ele vai abrir a janela do Input System.
- Crie um Action Map (ex:
Gameplay). - Crie uma Action (ex:
Jump). - Defina o Binding (o botão): Clique no símbolo + em Jump e adicione o caminho (ex:
/Keyboard/space). Adicione outro Binding para o controle (ex:/Gamepad/buttonSouth).
3. Conectando no Código (O Código Limpo)
Agora, você não vai mais perguntar se a tecla está apertada. Você só precisa receber o aviso.
Use o componente Player Input no seu jogador.
- Selecione seu personagem e clique em Add Component > Player Input.
- Arraste o arquivo
PlayerInputActionsque você criou para o campo Actions. - Em Behavior, defina como Invoke Unity Events.
O Código C# (O MVP da Conexão):
No seu script de movimento, você só precisa de uma função que tenha o prefixo On e o nome da sua Action.
using UnityEngine;
using UnityEngine.InputSystem; // Importante para usar o Input System
public class NewInputMovement : MonoBehaviour
{
// Ação chamada automaticamente pelo Unity quando a Ação 'Jump' é disparada
public void OnJump(InputAction.CallbackContext context)
{
// Verifica se o botão foi apertado (started)
if (context.started)
{
// Coloque sua lógica de pulo aqui
Debug.Log("Pulou! (Via New Input System)");
// Exemplo: rb.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);
}
}
// Para movimento contínuo (Horizontal)
public void OnMove(InputAction.CallbackContext context)
{
// O valor do input (ex: -1, 0, 1) é lido aqui
Vector2 inputVector = context.ReadValue<Vector2>();
// Coloque sua lógica de movimento aqui (ex: na FixedUpdate)
// Exemplo: horizontalInput = inputVector.x;
}
}
Conclusão
O New Input System é o pragmatismo disfarçado de complexidade. Você gasta 10 minutos configurando o Action Map, mas ganha horas de manutenção de código e compatibilidade com múltiplos dispositivos.
Pare de lutar contra o código do passado. O MVP do seu jogo precisa de um input que funcione em qualquer lugar. O sistema novo te dá isso.
O que fazer agora: Tente criar um Action Map para Pular e Atirar. Comente aqui qual foi o Binding mais exótico que você configurou (Joystick, toque na tela, etc.).
No nosso próximo post, vamos atacar o coração da marca: como definir metas realistas para que seu projeto não vire um M.U.P.




![Código C# na Unity usando [SerializeField] para expor variáveis privadas no Inspector.](https://perai.dev/wp-content/uploads/2025/11/unity-serializefield-vs-public-inspector-tutorial-1.png)
