Checkpoints e respawn: lógica de salvamento em runtime com Blueprints

Capítulo 12

Tempo estimado de leitura: 8 minutos

+ Exercício

O que é um checkpoint em runtime (e o que ele não é)

Checkpoint, neste capítulo, é um ponto de retorno durante a partida: quando o jogador morre, cai do mapa ou recebe um dano simulado, o personagem é reposicionado no último Transform registrado (Location, Rotation e opcionalmente Scale). Isso é diferente de salvar em disco (SaveGame). Aqui, o estado é mantido em memória enquanto a fase está rodando.

Vamos construir um sistema simples e robusto com:

  • Um Blueprint de checkpoint (BP_Checkpoint) com Trigger (overlap) e feedback visual/sonoro.
  • Um local central para armazenar o último Transform (recomendado: PlayerState ou Character).
  • Uma função de respawn que reposiciona o personagem no último checkpoint válido.

Arquitetura recomendada (sem acoplamento excessivo)

Para evitar que cada checkpoint precise conhecer detalhes do personagem, use uma interface ou um evento no personagem. Uma abordagem prática:

  • No Character: manter LastCheckpointTransform e uma função SetCheckpoint(Transform, CheckpointRef).
  • No BP_Checkpoint: ao overlap, chamar SetCheckpoint no personagem (via cast simples ou interface).
  • Respawn: o próprio Character executa RespawnToLastCheckpoint quando cair/receber dano simulado.

Se você já estiver usando PlayerState para dados do jogador durante a partida, pode guardar o Transform lá também. Para manter o capítulo direto, vamos implementar no Character.

Passo a passo: criando o Blueprint BP_Checkpoint

1) Criar o ator de checkpoint

Crie um Blueprint Actor chamado BP_Checkpoint com os seguintes componentes:

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

  • Scene (Root)
  • Box Collision (ex.: Trigger)
  • Static Mesh (opcional, ex.: um pilar/placa)
  • Point Light ou Niagara (opcional, para feedback)
  • Audio Component (opcional, para som de ativação)

Configuração do Trigger:

  • Collision Presets: OverlapOnlyPawn (ou Custom: Pawn = Overlap, demais = Ignore)
  • Generate Overlap Events: ligado

2) Variáveis no BP_Checkpoint

  • CheckpointID (Integer) – opcional, útil para debug/ordem.
  • bIsActive (Boolean) – indica se este checkpoint está ativo (para visual).
  • ActivateSound (SoundBase) – opcional.
  • ActivateVFX (Niagara System ou Particle System) – opcional.

3) Evento de overlap e registro do Transform

No Event Graph do BP_Checkpoint:

  • Use OnComponentBeginOverlap (Trigger)
  • Do Other Actor, obtenha o personagem (cast para seu BP_Character ou use uma Blueprint Interface).
  • Se o cast/interface for válido, chame uma função no Character para registrar o checkpoint.

O Transform que você vai salvar pode ser:

  • Transform do próprio checkpoint (GetActorTransform), ou
  • Um ponto de spawn (um Scene Component filho, ex.: SpawnPoint) para controlar exatamente onde o jogador aparece.

Recomendação: crie um Scene Component chamado SpawnPoint no BP_Checkpoint e use GetWorldTransform(SpawnPoint).

// Lógica (em nós do Blueprint, descrita em texto): OnBeginOverlap(Trigger) -> Cast to BP_Character (OtherActor) -> If success: Character.SetCheckpoint(SpawnPointTransform, self)

Passo a passo: armazenando o último checkpoint no Character

1) Variáveis no Character

  • LastCheckpointTransform (Transform)
  • bHasCheckpoint (Boolean)
  • ActiveCheckpoint (BP_Checkpoint Reference) – opcional, para desativar visual do anterior

Inicialização recomendada:

  • bHasCheckpoint = false
  • LastCheckpointTransform pode ficar default (0,0,0), mas não use sem validar bHasCheckpoint.

2) Função SetCheckpoint

Crie uma função no Character: SetCheckpoint(NewTransform, NewCheckpointRef).

Fluxo sugerido:

  • Se ActiveCheckpoint for válido e diferente de NewCheckpointRef, peça para ele desativar o visual (ex.: chamar SetActive(false)).
  • Atualize LastCheckpointTransform = NewTransform
  • bHasCheckpoint = true
  • ActiveCheckpoint = NewCheckpointRef
  • Ative o visual do novo checkpoint (ex.: NewCheckpointRef.SetActive(true))
// SetCheckpoint(NewTransform, NewCheckpointRef): if ActiveCheckpoint != None and ActiveCheckpoint != NewCheckpointRef: ActiveCheckpoint.SetActive(false) LastCheckpointTransform = NewTransform bHasCheckpoint = true ActiveCheckpoint = NewCheckpointRef ActiveCheckpoint.SetActive(true)

3) Função RespawnToLastCheckpoint

Crie uma função no Character: RespawnToLastCheckpoint().

Regras:

  • Se bHasCheckpoint for false, respawn no spawn inicial (ver edge case abaixo).
  • Se for true, teleporte o personagem para LastCheckpointTransform.

Para reposicionar com segurança:

  • Use SetActorLocationAndRotation com Sweep = false (teleporte) ou Teleport quando disponível.
  • Opcional: zere velocidade do Character Movement para evitar que ele continue caindo ao respawn.
// RespawnToLastCheckpoint(): if bHasCheckpoint: SetActorLocationAndRotation(LastCheckpointTransform.Location, LastCheckpointTransform.Rotation, false, true) CharacterMovement.StopMovementImmediately() else: RespawnToStart()

Disparando o respawn: queda do mapa e dano simulado

1) Respawn ao cair (Kill Z / volume de queda)

Existem duas formas comuns:

  • Kill Z do World Settings: quando o ator cai abaixo de um Z, ele pode ser destruído; para nosso caso, preferimos detectar e respawnar antes de destruir.
  • Trigger Volume (recomendado para iniciantes): crie um BP_DeathVolume com Box Collision grande abaixo do mapa; ao overlap com o Character, chama RespawnToLastCheckpoint.

Implementação rápida do BP_DeathVolume:

  • Actor com Box Collision configurado para overlap com Pawn.
  • No OnBeginOverlap, cast para Character e chama RespawnToLastCheckpoint.

2) Respawn ao receber dano simulado

Sem entrar em um sistema completo de vida, você pode simular dano com um evento:

  • Crie uma função no Character: SimulateDamage() que chama RespawnToLastCheckpoint.
  • Dispare essa função por um Trigger (ex.: BP_DamageTrigger) ou por uma tecla de debug (Input Action).

Exemplo com Trigger:

  • BP_DamageTrigger com Box Collision
  • On overlap com Character → SimulateDamage()

Feedback de ativação: visual e áudio

1) Função SetActive no BP_Checkpoint

No BP_Checkpoint, crie uma função SetActive(IsActive):

  • Atualiza bIsActive
  • Altera material/cor do mesh (ex.: emissive mais forte quando ativo)
  • Ativa/desativa luz ou VFX
  • Toca som apenas quando ativar (transição de false → true)

Uma lógica simples para som:

  • Se IsActive == true e bIsActive estava false antes, toque ActivateSound (Spawn Sound at Location).
// SetActive(IsActive): if IsActive and !bIsActive: PlaySound ActivateSound; Spawn VFX ActivateVFX bIsActive = IsActive UpdateVisuals()

2) Evitar reativar o mesmo checkpoint repetidamente

Edge case comum: o jogador fica dentro do Trigger e o overlap pode acontecer mais de uma vez (ou entrar e sair rapidamente). Para evitar spam:

  • No BP_Checkpoint, antes de chamar SetCheckpoint, verifique se ele já está ativo (bIsActive). Se estiver, não faça nada.
  • Ou no Character: se ActiveCheckpoint == NewCheckpointRef, ignore.

Edge cases importantes

1) Primeiro checkpoint (nenhum registrado ainda)

Se o jogador morrer antes de ativar qualquer checkpoint, você precisa de um fallback. Duas opções:

  • Salvar o Transform inicial no BeginPlay do Character como checkpoint inicial (e setar bHasCheckpoint = true).
  • Respawn no PlayerStart: guardar uma referência/Transform do spawn inicial e usar quando bHasCheckpoint = false.

Abordagem simples: no BeginPlay do Character, salve o Transform atual como inicial:

// BeginPlay(): InitialSpawnTransform = GetActorTransform() bHasCheckpoint = false

E no respawn:

// if !bHasCheckpoint: SetActorTransform(InitialSpawnTransform)

2) Múltiplos checkpoints e prioridade

Com vários checkpoints no mapa, o último ativado deve sobrescrever o anterior. Para evitar confusão visual:

  • O Character guarda ActiveCheckpoint.
  • Ao ativar um novo, desativa o anterior chamando SetActive(false).

Se você quiser impor ordem (ex.: checkpoint 2 só vale depois do 1), use CheckpointID e ignore ativações com ID menor que o atual.

3) Respawn dentro de colisão / preso em parede

Se o ponto de spawn estiver muito próximo de uma parede, o teleporte pode colocar o personagem em interpenetração. Mitigações:

  • Posicione o SpawnPoint do checkpoint em um local livre.
  • Adicione um pequeno offset para cima no Z (ex.: +50).
  • Use SetActorLocation com Sweep = true e trate o resultado (pode parar antes de colidir).

4) Rotacionar ou não rotacionar no respawn

Alguns jogos mantêm a rotação do jogador; outros alinham com o checkpoint. Você pode:

  • Salvar e aplicar Location + Rotation do SpawnPoint, ou
  • Aplicar apenas Location e manter a rotação atual.

Se estiver usando câmera com controle do mouse, aplicar rotação pode parecer um “tranco”. Teste as duas abordagens.

Exercício prático: indicador visual do checkpoint ativo

Objetivo

Adicionar um indicador claro de qual checkpoint está ativo no momento (ex.: luz verde, material emissivo, ou um ícone flutuante).

Requisitos do exercício

  • Quando um checkpoint for ativado, ele deve mudar para estado Ativo.
  • O checkpoint anteriormente ativo deve voltar para estado Inativo.
  • O estado deve persistir durante a partida (enquanto o nível estiver rodando).

Implementação sugerida (sem UI)

  • No BP_Checkpoint, adicione um Point Light e deixe com intensidade 0 quando inativo.
  • Na função SetActive:
// If IsActive: Light.Intensity = 5000; Mesh material emissive = alto // Else: Light.Intensity = 0; emissive = baixo

Desafio extra

  • Adicionar um Billboard ou Widget Component acima do checkpoint que só aparece quando ativo.
  • Tocar um som diferente para ativação e para desativação (com volume baixo na desativação).
ProblemaCausa comumSolução
Checkpoint não ativaCollision do Trigger não está em Overlap com PawnRevisar Preset/Channels do Box Collision e Generate Overlap Events
Respawn não aconteceFunção não está sendo chamada ou cast falhaAdicionar Print String no overlap e validar referências
Som toca toda horaCheckpoint reativado repetidamenteIgnorar se já estiver ativo ou se ActiveCheckpoint == self
Player respawna e continua caindoVelocidade do movimento não foi zeradaChamar StopMovementImmediately após teleporte

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

Qual abordagem reduz o acoplamento ao registrar um checkpoint e ainda permite que o personagem respawne no último Transform salvo em runtime?

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

Você errou! Tente novamente.

A forma recomendada é centralizar no Character o Transform do último checkpoint e as funções de registro/respawn. Assim, o checkpoint só dispara o evento no overlap, evitando dependência de detalhes do personagem e mantendo o estado apenas em memória durante a fase.

Próximo capitúlo

Áudio para gameplay: efeitos, música e parâmetros simples

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

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.