Tutorial de Scripting Visual (Blocos de Lógica)
Abrindo uma Porta Após Coletar Todos os Itens
Lesson 7 of 10 • 10 XP
Keep your place in this quest
Log in or sign up for free to subscribe, follow lesson progress, and access more learning content.
Nesta lição, usaremos a lógica de item colecionável criada anteriormente para acionar uma ação dentro do jogo.
Como exemplo, faremos uma porta que bloqueia o caminho do jogador ser removida da cena apenas após todos os itens no mapa terem sido coletados.
Esta é uma estrutura de jogabilidade muito comum: o jogador completa um objetivo e o jogo reage desbloqueando algo. Isso pode ser uma porta, uma plataforma, um elevador, uma ponte, uma cena cortada, uma luta contra um chefe, ou qualquer outro evento de progressão.
Nesta lição, você aprenderá como acessar e manipular uma Entity a partir da lógica de outra Entity. Neste caso, o Jogador verificará o progresso da coleta e então removerá a Porta da cena.
1. Criando a Lógica para Remover a Porta
Vamos começar criando um novo Entity Template para nossa porta.
Configure o Mesh que será usado como sua representação visual e adicione um componente de física para que a porta possa bloquear a passagem do Jogador.
Como a porta deve impedir que o personagem passe por ela, não ative a opção Ghost no componente de física.
Um corpo de física Ghost pode detectar colisões, mas não bloqueia fisicamente o movimento. Para o item colecionável, isso era exatamente o que queríamos. Mas para a porta, queremos o oposto: o Jogador não deve conseguir passar até que a condição esteja completa.
Ao pressionar a tecla 3, você pode visualizar a prévia de colisão da Entity. Isso é útil para confirmar se a forma física está correspondendo corretamente à porta.
O Cave oferece diferentes maneiras de configurar a forma de física. Você pode usar o próprio mesh do objeto como a colisão, importar um modelo otimizado diferente feito apenas para física, ou até mesmo usar qualquer outro Mesh do projeto como a forma de colisão.
Escolha a opção que melhor se adapta às necessidades e ao desempenho do seu jogo.

O sistema que criamos anteriormente já nos dá exatamente as informações que precisamos para controlar quando a porta deve ser removida.
Ele calcula automaticamente o número total de itens colecionáveis presentes na cena, não importa quantos itens existam no mapa, e também mantém o controle de quantos deles já foram coletados pelo Jogador.
Isso torna a lógica muito flexível. Não precisamos alterar um número manualmente toda vez que adicionamos ou removemos itens do nível. O contador continuará funcionando corretamente, adaptando-se automaticamente à quantidade de colecionáveis disponíveis na cena.

Com essas duas informações disponíveis — itens coletados e total de itens — podemos simplesmente comparar ambos os valores.
Quando o número de itens coletados é igual ao total de itens no mapa, isso significa que o jogador encontrou todos os colecionáveis e completou o objetivo necessário para abrir o caminho.
A partir dessa condição, executaremos a lógica responsável por remover a porta da cena, permitindo que o jogador avance para a próxima área do jogo.
Após atualizar o TextCollect, verificaremos se todos os itens no mapa já foram coletados.
Para fazer isso, obtenha as propriedades Collected Item e Max Item e use um nó de comparação para verificar se ambos os valores são iguais.
Se a condição for verdadeira, significa que o jogador coletou todos os itens disponíveis na cena e completou o requisito necessário para desbloquear a progressão.

A partir dessa verificação, podemos executar a lógica responsável por remover a porta e permitir acesso à próxima área.
Para isso, acessaremos e manipularemos uma Entity a partir da lógica do Jogador.
Primeiro, obtenha a Scene e use o nó Get Entities With Name, passando o nome da Entity da porta. Neste caso, o nome é Door.
Esse nó retorna uma lista de Entities encontradas com esse nome.
Em seguida, use um nó Get para recuperar o elemento no índice 0, que corresponde à primeira Entity encontrada com esse nome.
Por fim, conecte essa Entity ao nó Kill.
Quando essa lógica for executada, a porta será removida da cena.

É importante entender o que está acontecendo aqui.
O Jogador não está diretamente conectado à Porta como uma Entity filha ou pai. Em vez disso, o Jogador obtém a cena atual, procura uma Entity chamada Door, a recupera da lista de resultados e a remove.
Isso significa que você pode criar lógica onde um objeto afeta outro objeto na cena, o que é essencial para criar interações de jogabilidade.
Uma coisa a ter em mente é que Get Entities With Name retorna uma lista porque pode haver mais de uma Entity com o mesmo nome. Neste exemplo, estamos pegando o índice 0, o que significa que estamos usando o primeiro resultado encontrado. Para este caso simples, isso é aceitável. Mas em projetos maiores, é uma boa ideia manter os nomes importantes das Entities organizados, ou usar tags e outras referências dependendo da situação.
Essa lógica pode ser expandida de muitas maneiras diferentes.
Neste exemplo, usamos a coleta de todos os itens para remover uma porta, mas o mesmo princípio pode ser aplicado a quase qualquer evento dentro do seu jogo.
Em vez de remover uma porta, você poderia:
- mover uma plataforma
- ativar um elevador
- tocar uma cena cortada
- habilitar uma alavanca
- iniciar uma luta contra um chefe
- desbloquear uma nova área
- gerar inimigos
- mudar o objetivo do nível
A coisa mais importante é entender que agora você tem as ferramentas necessárias para criar objetivos e recompensas usando a lógica visual do Cave.
Por causa disso, um ótimo exercício é tentar adaptar esse sistema em algo diferente do exemplo mostrado nesta lição. Você pode criar sua própria condição, sua própria recompensa e explorar novas possibilidades usando tudo que aprendeu até agora.
