Nesta série de tutorial, você usou o design de nível e as mecânicas de jogo para projetar a jogabilidade dos jogadores. Os quebra-cabeças, chaves e portas que você criou fazem parte de um loop de jogabilidade.
Um loop de jogabilidade é uma série de ações que o jogador repete, constituindo o núcleo do seu jogo.
Você ainda precisa fechar o loop para o nível que você construiu. Neste tutorial, você criará uma tela de vitória que comunica ao jogador que ele concluiu o nível atual. Você também criou um ponto de transição de nível que verifica uma condição de vitória e leva o jogador ao próximo nível.
Ao concluir o nível, você explorará maneiras de expandir tudo o que aprendeu nesta faixa.
Uma condição de vitória é um objetivo que o jogador deve cumprir para concluir uma tarefa de jogabilidade, missão, nível ou jogo. O loop de jogo deve fornecer um meio de atender à condição de vitória. Em jogos não lineares, você pode ter mais que uma condição de vitória.
Antes de começar
Este tutorial pressupõe que você já entenda os seguintes tópicos, abordados nas seções anteriores de Como criar uma aventura de quebra-cabeça:
Blueprints de Widget
Blueprints
Variáveis
Volumes de colisão
Modo de Jogar no Editor (JNE)
Ativos pais e filho
Você precisará dos seguintes ativos de Armadilhas de dano:
Blueprint de Widget
WBP_EliminatedScreenClasse de Blueprint
BP_KeyEnumeração
Enum_KeyType
Criar o final do nível
Mesmo que você tenha terminado de criar a jogabilidade central do nível, o ponto de transição é uma boa oportunidade para dar aos jogadores uma maneira interessante de finalizar o nível. Nesse caso, você criará uma plataforma de salto para lançar jogadores para uma plataforma elevada. Depois, você colocará o ponto de transição de nível na plataforma.
Construir uma plataforma
Para criar uma plataforma elevada em uma das suas salas, use as malhas estáticas SM_Cube e SM_Cylinder na pasta LevelPrototyping > Malhas.
O nível de amostra do tutorial usa uma plataforma de 3,5 metros quadrados com quatro colunas, semelhante a esta:
Se quiser copiar esses rascunhos para o nível, copie o trecho de código a seguir. Se você está acompanhando com o nível de amostra, essas formas aparecerão perto do canto de trás da Sala 3. Você pode movê-los como desejar.
Para copiar a plataforma, siga estas etapas:
Clique em Copiar trecho de código completo.
Command LineBegin Map Begin Level Begin Actor Class=/Script/Engine.StaticMeshActor Name=StaticMeshActor_785 Archetype="/Script/Engine.StaticMeshActor'/Script/Engine.Default__StaticMeshActor'" ExportPath="/Script/Engine.StaticMeshActor'/Game/AdventureGame/Designer/Lvl_Adventure.Lvl_Adventure:PersistentLevel.StaticMeshActor_785'" Begin Object Class=/Script/Engine.StaticMeshComponent Name="StaticMeshComponent0" Archetype="/Script/Engine.StaticMeshComponent'/Script/Engine.Default__StaticMeshActor:StaticMeshComponent0'" ExportPath="/Script/Engine.StaticMeshComponent'/Game/AdventureGame/Designer/Lvl_Adventure.Lvl_Adventure:PersistentLevel.StaticMeshActor_785.StaticMeshComponent0'" End Object Begin Object Name="StaticMeshComponent0" ExportPath="/Script/Engine.StaticMeshComponent'/Game/AdventureGame/Designer/Lvl_Adventure.Lvl_Adventure:PersistentLevel.StaticMeshActor_785.StaticMeshComponent0'" StaticMesh="/Script/Engine.StaticMesh'/Game/LevelPrototyping/Meshes/SM_Cylinder.SM_Cylinder'" StaticMeshImportVersion=1 bUseDefaultCollision=False StaticMeshDerivedDataKey="STATICMESH_FD1BFC73B5510AD60DFC65F62C1E933E_228332BAE0224DD294E232B87D83948FQuadricMeshReduction_V2$2e1_6D3AF6A2$2d5FD0$2d469B$2dB0D8$2dB6D9979EE5D2_CONSTRAINED0_100100000000000000000000000100000000000080FFFFFFFFFFFFFFFFFFFFFFFF000000000000803F00000000000000803F0000803F00000000000000003D19FC1626C9B2485E57DB4B8EC731318B8215AE8D46FAD400000000010000000100000000000000010000000100000000000000000000000100000001000000400000000000000001000000000000000000F03F000000000000F03F000000000000F03F0000803F00000000050000004E6F6E65000C00000030000000803FFFFFFFFF0000803FFFFFFFFF0000000000000041000000000000A0420303030000000000000000_RT00_0"No Unreal Editor, confirme que a janela de visualização ou Organizador é o painel ativo e pressione CTRL+V.
Em seguida, adicione uma plataforma de salto que lançará o jogador para a plataforma.
Usar a plataforma de salto
Embora seja possível criar uma plataforma de salto do zero, isso consome tempo. Em um ambiente de desenvolvimento, onde o tempo é frequentemente limitado, pode ser útil importar ativos pré-fabricados (estrutura pré-fabricada) em vez de criar o seu próprio. Escolher uma estrutura pré-fabricada compatível com o estilo visual do seu jogo pode acelerar o desenvolvimento sem se destacar.
Para este tutorial, você usará um ativo fornecido com o modelo em primeira pessoa, oBP_JumpPad.
Para integrar o BP_JumpPad, siga estas etapas:
No Navegador de Conteúdo, vá até LevelPrototyping > Interactable > JumpPad.
Arraste uma instância de
BP_JumpPadpara o nível, na frente da plataforma. Se quiser corresponder à posição exata mostrada neste tutorial, defina aLocalizaçãodo BP_JumpPad como1790,-1460,10.
Seu nível deverá ficar igual a este:
É hora de testar seu trabalho. Primeiro, certifique-se de que BP_Enemy tem uma velocidade máxima de 0. Isso garante que você não lidará com inimigos em movimento durante o teste.
Clique com o botão direito na janela de visualização e selecione Jogar a partir daqui para testar seu nível a partir da sua posição atual. Suba na plataforma de salto e tente alcançar a plataforma.
Observe: mesmo com o impulso da plataforma de salto, seu personagem jogável não consegue alcançar a plataforma. Você pode resolver isso ajustando o parâmetro Velocidade da plataforma de salto.
Como as muitas variáveis editáveis que você criou nos Blueprints, o parâmetro de velocidade é uma variável pré-fabricada e editável na instância para o ativo de plataforma de salto.
Para ajustar a Velocidade, siga estas etapas:
Selecione
BP_JumpPadna janela de visualização.No painel Detalhes, defina a Velocidade (Z) como
1000.
Agora teste o nível de novo. Você deverá conseguir pular na plataforma.
Em seguida, você criará uma tela de vitória que é exibida quando o jogador concluir o nível.
Criar uma tela de vitória
Você criará uma tela de vitória usando um Blueprint de widget, semelhante à tela de fim de jogo WBP_EliminatedScreen que você criou em Armadilhas de dano. Como essas duas telas são muito parecidas, use WBP_EliminatedScreen como ponto de partida.
Para criar uma tela de vitória duplicando a tela de fim de jogo, siga estas etapas:
No Navegador de Conteúdo, acesse AdventureGame > Designer > Blueprints > Widgets.
Clique com o botão direito em
WBP_EliminatedScreene clique em Duplicar.Dê o nome
WBP_WinScreenpara o novo Blueprint de widget e clique duas vezes para abri-lo no editor de widgets. Sua pasta de widgets deverá ficar assim:Para alterar a mensagem, clique no widget Texto na Hierarquia.
No painel Detalhes, no cabeçalho Conteúdo, ao lado de Texto, insira
Nível concluído! ... Carregando o próximo nível.no campo de texto.No cabeçalho Aparência, ao lado de Cor e Opacidade, clique na amostra de cor para abrir o seletor de cores. Escolha uma cor de sua preferência ou defina o valor Hex sRGB como
FFE000FFpara continuar.O texto da tela de vitória é mais curto, então você pode aumentar seu tamanho para preencher melhor a tela. No cabeçalho Fonte, altere o Tamanho para
72ou um tamanho que você considere ser o mais legível.Salve, compile e feche o editor de widget.
Em seguida, você criará um ponto de transição de nível.
Criar uma transição de nível
Uma transição de nível carrega o próximo nível. Você pode acionar uma transição de nível de várias maneiras: quando um jogador termina uma cena, coleta algo ou chega ao final de um nível.
Neste tutorial, a transição de nível será um Blueprint que é acionado quando duas coisas ocorrem:
O jogador se sobrepõe à transição de nível.
A condição de vitória foi cumprida.
Para criar um novo Blueprint, siga estas etapas:
No Navegador de Conteúdo, acesse AdventureGame > Designer > Blueprints
Clique com o botão direito e selecione Nova pasta. Dê o nome de
LevelTransition.Dentro da pasta Transição de nível, clique com o botão direito e selecione Classe de Blueprint para criar um novo Blueprint.
Selecione Ator como a classe-pai.
Dê o nome
BP_LevelTransitionpara o novo Blueprint e clique duas vezes com o botão direito para abri-lo no Editor de Blueprint.
Sua pasta "Transição de nível" deverá ficar assim:
Assim como os outros Blueprints que você criou até agora, sua transição de nível precisa do seguinte:
Uma malha estática que o jogador pode ver durante o tempo de execução.
Uma forma de colisão para detectar quando o jogador colide com ela.
Lógica para alimentar a interação.
Primeiro, vamos criar a malha e a caixa de colisão para depois abordarmos a lógica.
Para criar uma malha estática e um formato de colisão, siga estas etapas:
Na aba Componentes de
BP_LevelTransition, clique no botão Adicionar e procure ocubopara criar uma nova malha estática.Dê o nome de
TransitionPointpara a malha estática.Com TransitionPoint selecionado, no painel Detalhes, defina a Escala para
3,0,3,0,0,1. Ele será dimensionado para caber na plataforma final do nível de amostra. Você pode fazer isso da melhor maneira para o seu nível.Volte parar a aba Componentes, selecione DefaultSceneRoot. Clique no botão Adicionar e procure
caixa de colisãopara criar uma forma de colisão.Dê o nome
LevelTriggerpara a caixa de colisão.Com LevelTrigger selecionado, no painel Detalhes, defina a Escala dele como
4,0,4,0,2,0. Defina a posição Z como55,0.Se a caixa de colisão não tiver a forma correta, verifique se ela não é filho de TransitionPoint.
Salve e compile.
Criar com lógica
BP_LevelTransition deverá fazer cinco coisas em sequência:
Verificar se há sobreposição.
Verificar a condição de vitória.
Desabilitar entrada de jogador.
Exibir a tela de vitória.
Carregar o próximo nível.
Passo a passo, vamos criar a lógica por trás dessas interações.
Verificar se há sobreposição
Para criar uma lógica que verifique a sobreposição, siga estas etapas:
Na aba MyBlueprint de
BP_LevelTransition, na seção Variáveis, clique no botão + para criar uma variável nova e dê o nomeOtherActorpara ela.Defina o tipo do pin como Ator (referência de objeto).
No EventGraph, exclua os três nós de evento existentes. Você não precisará deles.
Na aba Componentes, clique com o botão direito em LevelTrigger e clique em Adicionar Evento > Adicionar OnComponentBeginOverlap. Essa função verifica quando um objeto se sobrepõe à forma de colisão.
Arraste do pin Execução, arraste e crie um nó Set Other Actor.
Conecte os dois pinos Outro ator.
Em seguida, você criará uma lógica que verifica a condição de vitória.
Verificar a condição de vitória
Neste tutorial, a condição de vitória será coletar as três chaves. O motivo da escolha dessa condição específica é antecipar e evitar ações de jogador que interrompam o jogo.
Por exemplo, se a condição de vitória for "jogador sobreposto à transição de nível" e um jogador encontrar uma maneira de transpor as paredes da sala, ele poderá ignorar todo o nível. Ao usar as chaves como condição de vitória, o jogador deve concluir o loop do jogo, mesmo que encontre uma maneira de passar pelas paredes e portas.
Embora seja impossível prever todos os bugs, um design antecipado pode evitar que os jogadores quebrem o jogo.
Para criar uma matriz para armazenar os dados da tecla, siga estas etapas:
Na aba MyBlueprint de
BP_LevelTransitionclique no botão + para criar uma variável e dê a ela o nomeHeldKeys.Defina o tipo de pin como Tipo de chave de enumeração e o tipo de contêiner como Matriz.
No pin Execução do nó Set, arraste e crie fnBPIGetKeys.
Arraste do pin Alvo, arraste e crie um nó Get Other Actor.
Arraste do pin Execução em fnBPIGetKeys, arraste e crie um nó Set Other Actor.
Conecte os dois pins da matriz Chaves mantidas.
Para criar um tipo de chave de enumeração para definir uma condição de vitória, siga estas etapas:
Crie uma variável e dê o nome
RequiredKeyspara ela. Essa é a condição de vitória.Verifique se o tipo de pin é Tipo de chave de enumeração e se o tipo de contêiner é Matriz.
No painel Detalhes, habilite Instância editável e defina a Categoria como
Configuração.Compile o Blueprint para obter acesso ao Valor padrão. Clique no botão + para adicionar três novos elementos à matriz.
Clique nos menus suspensos de índice e defina os índices como Amarelo, Azul e Vermelho.
Você criará um booleano para verificar se a condição foi atendida. Um loop For Each Loop with Break percorrerá a matriz HeldKeys para verificar cada chave e será interrompido se estiver faltando alguma.
Para criar uma lógica que verifica as chaves ausentes, siga estas etapas:
Crie uma nova variável e dê o nome
FoundAllKeys.Defina o tipo de pin como Booleano e o tipo de contêiner como Único.
Do pin Execução de SetHeldKeys, arraste e crie Loop For Each com intervalor.
Arraste do pin Matriz do loop For Each e crie um nó Get Required Keys"
No pin corpo em loop no loop, arraste e crie um Ganlho.
Do pin Condição, arraste e crie qual quer nó Contains Item (Array).
Do pin Matriz-alvo no nó Contains, arraste e crie um nó Get Held Keys.
Conecte o pin Item a ser encontrado no nó Condição ao pin Elemento da matriz no modo loop.
No pin Verdadeiro do nó Branch, arraste e crie Set Found All Keys. Clique na caixa de seleção ao lado de FoundAllKeys para definir como verdadeiro.
No pin False do nó Branch, arraste e crie Set Found All Keys. Deixe a caixa de seleção vazia e conecte o pin Execução ao pin Interromper no loop For Each.
Você ainda precisa executar mais três etapas na sequência que vimos antes, mas somente se o jogador tiver todas as chaves:
Desabilitar entrada de jogador.
Exibir a tela de vitória.
Carregar o próximo nível.
Para usar o resultado de FoundAllKeys para iniciar uma sequência lógica, siga estas etapas:
Arraste do pin Concluído do loop For Each e crie um nó Branch.
Arraste do pin Condição e crie um nó Get FoundAllKeys.
No pin Verdadeiro do nó Branch, arraste e crie um nó Sequence.
Como você precisa criar três ações nessa sequência, clique no botão Adicionar pin.
Vamos para a próxima etapa na sequência: desabilitar a entrada do jogador.
Desabilitar entrada do jogador
Durante a exibição da tela de vitória, desabilitar a entrada do jogador evita que ele se mova e receba dano não intencional.
Para desativar a entrada do jogador, siga estas etapas:
No pin Then 0 do nó Sequence, arraste e crie um nó Disable Input.
No pin Alvo do nó Disable Input, crie um nó Get Other Actor.
No pin Controle do jogador, arraste e crie um nó Get Player Controller.
Em seguida, você criará uma lógica para exibir a tela de vitória.
Exibir a tela de vitória
Para exibir seu widget WBP_Winscreen, siga estas etapas:
No pin Then 1 do nó Sequence, arraste e crie um nó Create Widget.
Defina a Classe como WBP_WinScreen.
No nó Execução do nó Create Widget, arraste e crie um nó Add to Viewport.
Conecte o pin Valor de retorno no nó Create Widget para usar o nó Target em Add to Viewport.
Você vê algum problema nessa lógica? Por ora, siga em frente e crie a etapa final sem corrigir o problema. Depois, você teste o nível para descobrir o problema e criar uma solução.
Carregar o próximo nível
Neste tutorial, você usará o nível atual como marcador de posição para o próximo nível. Ao criar seu próprio jogo, o ponto de transição deve levar os jogadores a um novo nível.
Para criar a lógica que carrega o nível atual, siga estas etapas:
No pin Then 2 do nó Sequence, arraste e crie um nó Open Level (by Object Reference).
No pin Nível do nó Open Level, arraste e procure Promover a variável. Isso forçará a criação de uma variável do tipo Mundo.
Você também pode criar essa variável na aba MyBlueprints, mas o tipo de pin "Mundo" pode ser difícil de localizar.
Com a variável Mundo selecionada, no painel Detalhes, renomeie a variável como
NextLevel.Adicione-a à categoria Configuração e habilite Instância editável.
Compile seu Blueprint para obter acesso ao Valor padrão da variável e defina-a como o nível que você gostaria de carregar. Se você continuar este tutorial, defina como
Lvl_Adventurepara fazer o loop do nível atual.Salve e compile.
É hora de testar seu trabalho. Arraste uma instância de BP_LevelTransition para a plataforma elevada. Em seguida, facilite o acesso às chaves para atender à condição de vitória. Para isso, coloque no mesmo ambiente instâncias das chaves amarelas, azuis e vermelhas criadas em Criar uma chave.
Seu nível ficará mais ou menos assim:
Clique com o botão direito na janela de visualização e selecione Jogar a partir daqui para testar seu nível a partir da sua posição atual. Se você pular na plataforma e ativar a transição de nível, perceberá que a tela congela e o próximo nível abre sem dar tempo ao jogador de ler a mensagem de vitória na tela.
Você resolverá esse problema na próxima seção.
Criar um atraso
Este tutorial usa Abrir nível para fechar o nível atual e abrir o próximo como uma nova instância de jogo. Durante o carregamento, "Abrir nível" congela o jogo. Dependendo do sistema do jogador, o congelamento pode ser muito curto (para ler a tela de vitória) ou muito longo (parecendo que o jogo travou).
Muitos jogos, mesmo aqueles que usam Transmissão de Nível, utilizam telas de carregamento para informar ao jogador que o jogo está funcionando corretamente e que ele deve aguardar. Telas de carregamento também resolvem outro problema: esperas longas, frequentes ou entediantes podem interromper a imersão e causar frustrações. As telas de carregamento geralmente incluem dicas, animação ou áudio para reter a atenção do jogador enquanto ele não está jogando.
Para resolver esse problema técnico com o design, crie um atraso intencional que realizará o seguinte:
Equalizará os tempos de carregamento para todos os jogadores.
Garantirá que o jogador tenha tempo suficiente para ler a tela de vitória.
Disfarçará o tempo de carregamento dando ao jogador algo para olhar.
Para inserir um atraso, siga estas etapas:
Abra
BP_LevelTransition. Na aba MyBlueprint, clique em + para adicionar uma nova variável e dê o nomeLevelLoadDelaya ela.Defina o tipo de pin como Float.
No painel Detalhes, habilite Instância editável e defina a Categoria como Configuração.
Compile o Blueprint para obter acesso ao Valor padrão. Atraso de carregamento de nível definirá a quantidade de tempo que você quer que o atraso dure. Para continuar, defina como
5,0segundos.No EventGraph, navegue até o nó Sequence. Para inserir um atraso, arrastar do pin Then 2 e crie um nó Delay.
No pin Duração, arraste e crie um nó Get LevelLoadDelay.
Salve, compile e feche seu Blueprint.
Seu BP_LevelTransition EventGraph final deverá ficar assim:
Agora teste o nível de novo. Quando você sobrepõe o ponto de transição de nível, a tela de vitória deve ser exibida, o fundo deve ficar desfocado e a entrada do jogador deve ser desabilitada por cinco segundos antes de o personagem jogável aparecer no próximo nível.
Antes de testar o nível pela última vez, lembre-se de remover as chaves da Sala 3 e reverter BP_Enemy como Velocidade máxima para 200.
Do conceito à criação
Vamos conferir o rascunho que criamos em Configuração de projeto e rascunho de nível com o nível final. Desde o design inicial, nosso design de nível e loop de jogabilidade mudaram para resolver bugs, criar novas funcionalidades ou contornar limitações que os testadores descobriram durante o desenvolvimento.
Ao planejar seu nível, trabalhar de forma modular, resolver problemas técnicos com design e manter seus ativos organizados, você poderá manter a flexibilidade quando as limitações ou novas funcionalidades mudarem o curso do desenvolvimento do jogo.
Ao concluir esta faixa, você passou de um nível do conceito para uma demonstração jogável. Agora você tem as bases necessárias para criar mais que apenas um nível. Você pode combinar interruptores, armadilhas, chaves, portas e inimigos de maneiras ilimitadas para criar novos loops de jogabilidade no seu próprio estilo. Quando conectados entre si, cada nível se torna parte de um projeto muito maior: um jogo inteiro.
Projeto de exemplo
Abaixo está um link para baixar o projeto final que você pode criar usando esta série de tutorias de documentação. Você pode usar este projeto de exemplo para ver como será o seu projeto final ou como referência para ver como criamos e projetamos o projeto.
(Tamanho do download: 75 MB.)
Para abrir o projeto, descompacte o arquivo e mova a pasta adventuredesigner para o diretório Unreal Projects (por padrão, eles ficam em C:\Users\UserName\Documents\Unreal Projects).
Próxima
Para continuar trabalhando no seu nível, adicionando materiais, iluminação, efeitos de pós-processamento, som e efeitos visuais, experimente a série de tutoriais Artist Track:
Art Pass for a Puzzle Adventure Game
Learn how you can apply art workflows with materials, sounds, and visual effects to the Puzzle Adventure game.
Se quiser explorar a criação de outro Blueprint, continue para este módulo bônus da série de tutoriais Designer Track:
Bônus: Gere novos cubos
Adicione uma nova mecânica ao seu jogo de aventura e quebra-cabeça em que os atores "BP_Cube" sejam gerados até um limite específico.
Se você tiver interesse em criar um pacote com o seu projeto, em forma de programa independente para testar e compartilhar, confira a seguinte documentação:
Como empacotar projetos na Unreal Engine
Empacotar projetos de jogo para distribuição na Unreal.