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:
PlayerStateouCharacter). - 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
LastCheckpointTransforme uma funçãoSetCheckpoint(Transform, CheckpointRef). - No BP_Checkpoint: ao overlap, chamar
SetCheckpointno personagem (via cast simples ou interface). - Respawn: o próprio Character executa
RespawnToLastCheckpointquando 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:
- Ouça o áudio com a tela desligada
- Ganhe Certificado após a conclusão
- + de 5000 cursos para você explorar!
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 seuBP_Characterou 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 = falseLastCheckpointTransformpode ficar default (0,0,0), mas não use sem validarbHasCheckpoint.
2) Função SetCheckpoint
Crie uma função no Character: SetCheckpoint(NewTransform, NewCheckpointRef).
Fluxo sugerido:
- Se
ActiveCheckpointfor válido e diferente deNewCheckpointRef, peça para ele desativar o visual (ex.: chamarSetActive(false)). - Atualize
LastCheckpointTransform = NewTransform bHasCheckpoint = trueActiveCheckpoint = 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
bHasCheckpointfor false, respawn no spawn inicial (ver edge case abaixo). - Se for true, teleporte o personagem para
LastCheckpointTransform.
Para reposicionar com segurança:
- Use
SetActorLocationAndRotationcomSweep = false(teleporte) ouTeleportquando 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_DeathVolumecom Box Collision grande abaixo do mapa; ao overlap com o Character, chamaRespawnToLastCheckpoint.
Implementação rápida do BP_DeathVolume:
- Actor com
Box Collisionconfigurado para overlap com Pawn. - No
OnBeginOverlap, cast para Character e chamaRespawnToLastCheckpoint.
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 chamaRespawnToLastCheckpoint. - Dispare essa função por um Trigger (ex.:
BP_DamageTrigger) ou por uma tecla de debug (Input Action).
Exemplo com Trigger:
BP_DamageTriggercom 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 == trueebIsActiveestava false antes, toqueActivateSound(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 chamarSetCheckpoint, 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 = falseE 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
SpawnPointdo checkpoint em um local livre. - Adicione um pequeno offset para cima no Z (ex.: +50).
- Use
SetActorLocationcomSweep = truee 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 umPoint Lighte deixe com intensidade 0 quando inativo. - Na função
SetActive:
// If IsActive: Light.Intensity = 5000; Mesh material emissive = alto // Else: Light.Intensity = 0; emissive = baixoDesafio extra
- Adicionar um
BillboardouWidget Componentacima do checkpoint que só aparece quando ativo. - Tocar um som diferente para ativação e para desativação (com volume baixo na desativação).
| Problema | Causa comum | Solução |
|---|---|---|
| Checkpoint não ativa | Collision do Trigger não está em Overlap com Pawn | Revisar Preset/Channels do Box Collision e Generate Overlap Events |
| Respawn não acontece | Função não está sendo chamada ou cast falha | Adicionar Print String no overlap e validar referências |
| Som toca toda hora | Checkpoint reativado repetidamente | Ignorar se já estiver ativo ou se ActiveCheckpoint == self |
| Player respawna e continua caindo | Velocidade do movimento não foi zerada | Chamar StopMovementImmediately após teleporte |