Input e controle do personagem: ações, eixos e resposta de gameplay

Capítulo 9

Tempo estimado de leitura: 6 minutos

+ Exercício

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:

Continue em nosso aplicativo e ...
  • Ouça o áudio com a tela desligada
  • Ganhe Certificado após a conclusão
  • + de 5000 cursos para você explorar!
ou continue lendo abaixo...
Download App

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 Input com:
  • World Direction: Get Actor Forward Vector
  • Scale Value: o valor do eixo
  • Adicione o evento InputAxis MoveRight
  • Use Add Movement Input com:
  • 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 TurnAdd Controller Yaw Input
  • InputAxis LookUpAdd 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 IsSprinting for true: set CharacterMovement.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 Branch para checar se pode correr (ex.: stamina > 0, e não está agachado)
  • Se True: Set IsSprinting = true e chame UpdateMoveSpeed
  • Evento InputAction Sprint (Released)
  • Set IsSprinting = false e chame UpdateMoveSpeed

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)
  • Branch com condição IsCrouching
  • Se True: chame UnCrouch e Set IsCrouching = false
  • Se False: chame Crouch e Set 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 duplicados
  • Set Timer by Function Name (ou Set Timer by Event)
  • Tempo: StaminaTickInterval, Looping: true
  • Função chamada: TickDrainStamina

StartStaminaRegen

  • Clear and Invalidate Timer by Handle (StaminaTimerHandle)
  • Set Timer... looping chamando TickRegenStamina

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 * StaminaTickInterval
  • Stamina = Stamina - Delta
  • Clamp (Float) entre 0 e StaminaMax

Depois, controle o estado:

  • Branch: se Stamina <= 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: se Stamina >= StaminaMax
  • Se True: chame StopStaminaTimer

4) Integrar com InputAction Sprint

Agora conecte o sprint ao sistema de stamina.

No evento InputAction Sprint (Pressed)

  • Branch com 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âmetroValor inicialEfeito
WalkSpeed450Velocidade padrão
SprintSpeed650Velocidade ao sprintar
StaminaMax100Stamina total
StaminaDrainPerSecond20Dreno por segundo no sprint
StaminaRegenPerSecond15Recuperação por segundo fora do sprint
StaminaTickInterval0.1Frequê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.

Agora responda o exercício sobre o conteúdo:

Ao implementar sprint com stamina usando Timer (sem Tick), qual prática ajuda a evitar que dreno e regeneração rodem ao mesmo tempo?

Você acertou! Parabéns, agora siga para a próxima página

Você errou! Tente novamente.

Ao limpar e invalidar o mesmo TimerHandle antes de iniciar outro timer, você evita timers duplicados e garante que apenas dreno ou regeneração estejam ativos por vez.

Próximo capitúlo

HUD básico com UMG: feedback de pontuação e interação

Arrow Right Icon
Capa do Ebook gratuito Unreal Engine para Iniciantes: Fundamentos de Blueprints e Lógica de Gameplay
53%

Unreal Engine para Iniciantes: Fundamentos de Blueprints e Lógica de Gameplay

Novo curso

17 páginas

Baixe o app para ganhar Certificação grátis e ouvir os cursos em background, mesmo com a tela desligada.