Conceito: Input como intenção do jogador
Em gameplay, o Input representa a intenção do jogador (pressionar, soltar, mover analógico), e o personagem traduz essa intenção em movimento e estados (andar, correr, agachar). No Unreal, você normalmente separa Input em dois tipos: Ações (Action Mappings) para eventos discretos (pressionou/soltou) e Eixos (Axis Mappings) para valores contínuos (ex.: -1 a 1 para movimento). A ideia é mapear teclas/controles no projeto e, no Character Blueprint, reagir a esses eventos alterando variáveis e chamando nós de movimento.
Configurar mapeamentos de Input (Ação e Eixo)
1) Criar Action Mappings
Use Action Mappings para comandos como pular, correr (sprint) e agachar.
- Abra Edit > Project Settings > Input
- Em Action Mappings, adicione:
- Sprint (ex.: Left Shift no teclado, L3/Stick Click no controle)
- Crouch (opcional) (ex.: C no teclado, B/Circle no controle)
- Jump (se ainda não existir) (ex.: Space)
2) Criar Axis Mappings
Use Axis Mappings para movimento e câmera. Mesmo que você use mouse para olhar, é comum manter eixos para pad.
- Em Axis Mappings, adicione:
- MoveForward: W com Scale +1, S com Scale -1 (e/ou Left Stick Y)
- MoveRight: D com Scale +1, A com Scale -1 (e/ou Left Stick X)
- Turn: Mouse X com Scale 1 (e/ou Right Stick X)
- LookUp: Mouse Y com Scale -1 (inverter é comum) (e/ou Right Stick Y)
3) Sensibilidade e escalas
A sensibilidade pode ser controlada de duas formas: (1) ajustando o Scale do Axis Mapping, ou (2) multiplicando o valor do eixo por uma variável de sensibilidade no Blueprint. A segunda opção é melhor porque permite ajuste em runtime (menu de opções).
Crie variáveis no Character:
- Ouça o áudio com a tela desligada
- Ganhe Certificado após a conclusão
- + de 5000 cursos para você explorar!
Baixar o aplicativo
MouseSensitivity(Float, padrão 1.0)GamepadLookSensitivity(Float, padrão 1.0)
Depois, ao receber o Axis, multiplique o valor por uma dessas variáveis antes de aplicar rotação.
Conectar Input ao Character Blueprint
Movimento (andar)
No seu Character Blueprint (ex.: BP_PlayerCharacter), no Event Graph:
- Adicione o evento
InputAxis MoveForward - Use
Add Movement Inputcom: - World Direction:
Get Actor Forward Vector - Scale Value: o valor do eixo
- Adicione o evento
InputAxis MoveRight - Use
Add Movement Inputcom: - World Direction:
Get Actor Right Vector - Scale Value: o valor do eixo
Isso cria movimento básico sem precisar de Tick.
Câmera (virar e olhar)
Se seu Character usa Controller rotation (padrão comum em templates), conecte:
InputAxis Turn→Add Controller Yaw InputInputAxis LookUp→Add Controller Pitch Input
Para aplicar sensibilidade, faça: AxisValue * MouseSensitivity antes de entrar no nó de rotação. Se quiser separar mouse e gamepad, você pode manter eixos diferentes (ex.: TurnMouse e TurnGamepad) ou detectar o dispositivo, mas para iniciantes é suficiente um multiplicador único.
Estados básicos de gameplay: andando, correndo e agachando (opcional)
Em vez de recalcular tudo no Tick, use eventos de Input para ligar/desligar estados e aplique efeitos (velocidade, agachar) apenas quando o estado muda.
Variáveis recomendadas
IsSprinting(Boolean)IsCrouching(Boolean, opcional)WalkSpeed(Float, ex.: 450)SprintSpeed(Float, ex.: 650)
Para controlar velocidade, use o componente CharacterMovement e ajuste Max Walk Speed.
Aplicar velocidade sem Tick
Crie uma função no Character chamada UpdateMoveSpeed:
- Se
IsSprintingfor true: setCharacterMovement.MaxWalkSpeed = SprintSpeed - Senão: set
CharacterMovement.MaxWalkSpeed = WalkSpeed
Chame essa função sempre que IsSprinting mudar (pressionou/soltou Sprint) e também quando stamina zerar (no exercício).
Sprint com Branch (pressionar/soltar)
No Event Graph:
- Evento
InputAction Sprint (Pressed) - Use um
Branchpara checar se pode correr (ex.: stamina > 0, e não está agachado) - Se True:
Set IsSprinting = truee chameUpdateMoveSpeed
- Evento
InputAction Sprint (Released) Set IsSprinting = falsee chameUpdateMoveSpeed
Agachar (opcional) com toggle ou hold
Você pode implementar agachar como toggle (aperta alterna) ou hold (segura para agachar). Exemplo toggle:
- Evento
InputAction Crouch (Pressed) Branchcom condiçãoIsCrouching- Se True: chame
UnCroucheSet IsCrouching = false - Se False: chame
CroucheSet IsCrouching = true
Dica: se você não quer permitir sprint enquanto agachado, adicione uma regra: ao agachar, force IsSprinting = false e chame UpdateMoveSpeed.
Evitar Tick: padrões práticos
Para Input e estados, prefira:
- Eventos de Input para ligar/desligar estados
- Funções para aplicar efeitos quando o estado muda (ex.:
UpdateMoveSpeed) - Timers para efeitos ao longo do tempo (ex.: stamina drenando/recuperando)
Isso reduz custo e deixa a lógica mais previsível.
Exercício: Sprint com stamina (Float) drenando com Timer e recuperando fora do sprint
Objetivo
Implementar stamina simples que:
- Drena enquanto estiver sprintando
- Para de drenar ao soltar sprint (ou ao zerar)
- Recupera automaticamente quando não estiver sprintando
- Usa Timer em vez de Tick
1) Variáveis do sistema de stamina
No Character Blueprint, crie:
Stamina(Float, ex.: 100)StaminaMax(Float, ex.: 100)StaminaDrainPerSecond(Float, ex.: 20)StaminaRegenPerSecond(Float, ex.: 15)StaminaTickInterval(Float, ex.: 0.1)StaminaTimerHandle(TimerHandle)
Observação: usar intervalo 0.1s dá uma sensação suave sem atualizar a cada frame.
2) Funções: Start/Stop e atualização
Crie três funções no Character:
StartStaminaDrain
Clear and Invalidate Timer by Handle(StaminaTimerHandle) para evitar timers duplicadosSet Timer by Function Name(ouSet Timer by Event)- Tempo:
StaminaTickInterval, Looping: true - Função chamada:
TickDrainStamina
StartStaminaRegen
Clear and Invalidate Timer by Handle(StaminaTimerHandle)Set Timer...looping chamandoTickRegenStamina
StopStaminaTimer
Clear and Invalidate Timer by Handle(StaminaTimerHandle)
3) Implementar os “ticks” do Timer (dreno e regen)
TickDrainStamina
Essa função reduz stamina em passos proporcionais ao intervalo:
Delta = StaminaDrainPerSecond * StaminaTickInterval Stamina = Clamp(Stamina - Delta, 0, StaminaMax)Em Blueprint, faça:
Delta = StaminaDrainPerSecond * StaminaTickIntervalStamina = Stamina - DeltaClamp (Float)entre 0 e StaminaMax
Depois, controle o estado:
Branch: seStamina <= 0- Se True:
Set IsSprinting = false- Chame
UpdateMoveSpeed - Chame
StartStaminaRegen(para começar a recuperar automaticamente)
TickRegenStamina
Delta = StaminaRegenPerSecond * StaminaTickInterval Stamina = Clamp(Stamina + Delta, 0, StaminaMax)Depois, pare o timer quando encher (opcional, mas recomendado):
Branch: seStamina >= StaminaMax- Se True: chame
StopStaminaTimer
4) Integrar com InputAction Sprint
Agora conecte o sprint ao sistema de stamina.
No evento InputAction Sprint (Pressed)
Branchcom condição:Stamina > 0- Se True:
Set IsSprinting = true- Chame
UpdateMoveSpeed - Chame
StartStaminaDrain
Regra opcional: se estiver agachado, não permitir sprint. Condição poderia ser: (Stamina > 0) AND (IsCrouching == false).
No evento InputAction Sprint (Released)
Set IsSprinting = false- Chame
UpdateMoveSpeed - Chame
StartStaminaRegen
5) Garantir que regen não aconteça durante sprint
Como você está limpando o timer antes de iniciar outro, o próprio fluxo já impede dois timers ao mesmo tempo. Ainda assim, é útil garantir que StartStaminaRegen só seja chamado quando IsSprinting for false (por exemplo, se você reutilizar a função em outros lugares).
Tabela de referência rápida (valores sugeridos)
| Parâmetro | Valor inicial | Efeito |
|---|---|---|
| WalkSpeed | 450 | Velocidade padrão |
| SprintSpeed | 650 | Velocidade ao sprintar |
| StaminaMax | 100 | Stamina total |
| StaminaDrainPerSecond | 20 | Dreno por segundo no sprint |
| StaminaRegenPerSecond | 15 | Recuperação por segundo fora do sprint |
| StaminaTickInterval | 0.1 | Frequência do Timer |
Extensões rápidas (opcionais)
Bloquear sprint quando stamina estiver baixa
Em vez de permitir sprint com stamina > 0, você pode exigir um mínimo (ex.: 10) para evitar “piscadas” de sprint.
Recuperação com atraso
Para dar sensação de cansaço, inicie a regen com um pequeno delay: ao soltar sprint, use Set Timer (one-shot) de 0.5s para chamar StartStaminaRegen.
Expor stamina para UI
Deixe Stamina como variável acessível (ex.: Public/Instance Editable conforme sua organização) para um Widget ler e exibir uma barra. A lógica do capítulo já mantém o valor atualizado sem Tick.