O Modelo de parkour em Verse mostrará como criar um modo de jogo no qual os jogadores podem manobrar estrategicamente em meio a obstáculos e plataformas para coletar baterias.
Nesse modo de jogo, os jogadores coletarão quatro baterias para completar o nível. O tempo se estenderá se eles encontrarem a bateria secreta. Quando o tempo acabar, o jogador voltará ao início.
Este modelo demonstra algumas funcionalidades básicas da linguagem, como:
-
Loops For
-
Inscrições
-
Matrizes
-
API do dispositivo
Conceitos complexos, como simultaneidade, não serão usados nesse modelo.
Visão geral
A seguir, é apresentada uma visão geral das etapas necessárias para recriar esta ilha na sequência ideal:
-
Crie um novo projeto e modifique as Configurações da ilha para configurar o jogo.
-
Construa a arena.
-
Prepare os dispositivos.
-
Adicione o script Verse.
Como criar um projeto e configurar o jogo
-
Abra o UEFN e crie um novo projeto vazio.
-
Selecione o dispositivo IslandSettings no Organizador e encontre Opções do usuário - Regras do jogo.
-
Modifique as Opções do Usuário conforme mostrado abaixo.
Opção Valor Explicação Condição de Vitória do Jogo Maior Pontuação Vence O jogador com a maior pontuação vencerá o jogo. Dano de Picareta Nenhum A picareta não danificará o ambiente. Começar com Picareta False Os jogadores não começarão o jogo com uma picareta. Coletar Itens Automaticamente Sim Os jogadores pegarão automaticamente os itens com os quais entrarem em contato. Permitir Escalada/Disparada/Deslizar/Pancada True Os jogadores poderão fazer parkour em seus ambientes. Condição de Vitória da Rodada Pontuação Os jogadores com a maior pontuação vencerão a rodada. Primeira Coluna da Tabela de Pontuação Pontuação O placar mostrará a pontuação na primeira coluna.
Como construir a arena
Este mapa usa a Galeria de Adereços da Cidade Cibernética, que pode ser encontrada em Fortnite > Galleries > Props.
Recrie-o com plataformas e obstáculos para os jogadores praticarem parkour.
Como configurar os dispositivos
Este tutorial usa os seguintes dispositivos:
Dispositivo Plataforma de Surgimento de Jogador
Use um dispositivo Plataforma de Surgimento de Jogador para gerar jogadores no mapa. No início do seu mapa, coloque uma plataforma de surgimento para cada jogador, que você pode encontrar em Fortnite > Devices > Plataforma de Surgimento de Jogador.
Para configurar esse dispositivo, defina as Opções do usuário da seguinte maneira:
| Opção | Valor | Explicação |
|---|---|---|
| Visível no Jogo | False | Esse dispositivo não estará visível no jogo. |
Dispositivo Distribuidor de Itens
Na UEFN, arrastar um consumível da Gaveta de Conteúdo o coloca automaticamente em um dispositivo Gerador de Itens. Arraste uma Bateria no mapa, que você pode encontrar em Fortnite > Itens > Bateria.
Para configurar esse dispositivo, defina as Opções do usuário da seguinte maneira:
| Opção | Valor | Explicação | |
|---|---|---|---|
| Tempo Antes do Surgimento | 0.1 | Determina a quantidade de tempo antes que o item apareça. | |
| Ressurgir Item no Temporizador | False | A bateria não ressurgirá depois de ser recolhida. | |
| Base Visível Durante o Jogo | False | O dispositivo não estará visível no jogo. | |
| Munição Extra para Armas | False | Armas não darão munição extra. | |
| Passar por Cima para Coletar | True | Os jogadores coletarão esse item automaticamente. | |
| Escala do Item | 2.0 | Determina o tamanho da bateria. |
Copie e cole esse dispositivo mais quatro vezes e coloque-o no seu mapa.
Dispositivo Fim de Jogo
Coloque um dispositivo Fim de Jogo para encerrar o jogo quando ativado.
Para configurar esse dispositivo, defina as Opções do usuário da seguinte maneira:
| Opção | Valor | Explicação |
|---|---|---|
| Aviso Personalizado de Vitória | inserir texto | Insira o texto que você deseja exibir para o jogador vencedor. |
Dispositivo Volume de Dano
O dispositivo Volume de Dano é um limite que pode causar danos aos jogadores dentro de sua área. Coloque-o abaixo do seu mapa e ajuste a Largura da Área, a Profundidade da Área e a Altura da Área para cobrir o fundo da sua arena e eliminar instantaneamente os jogadores caídos.
Para configurar esse dispositivo, defina as Opções do usuário da seguinte maneira:
| Opção | Valor | Explicação |
|---|---|---|
| Dano | 500 | Esse dispositivo causa danos suficientes para eliminar instantaneamente os jogadores que caem. |
Dispositivo Temporizador
Coloque um dispositivo Temporizador próximo ao dispositivo Fim de Jogo. Esse dispositivo contará o tempo até que o jogador seja eliminado e deva recomeçar.
Para configurar esse dispositivo, defina as Opções do usuário da seguinte maneira:
| Opção | Valor | Explicação |
|---|---|---|
| Duração | 30 | O temporizador durará 30 segundos. |
| Começar no Início do Jogo | True | O temporizador é iniciado quando o jogo começa. |
| Se Aplica A | Jogador | Quando o temporizador começa, ele é aplicável a um jogador específico. |
| Sucesso Quando o Tempo Acabar | False | Quando o temporizador chegar ao fim, não contará como um sucesso. |
| Visível Durante o Jogo | Oculto | O dispositivo ficará oculto no jogo. |
| Texto de Temporizador em Andamento | inserir texto | Insira o texto que você deseja exibir no temporizador. |
Mensagem do HUD
Use um dispositivo Mensagem do HUD para exibir mensagens envolventes para os jogadores.
Para configurar esse dispositivo, defina as Opções do usuário da seguinte maneira:
| Opção | Valor | Explicação |
|---|---|---|
| Tempo de Exibição | 2.0 | A mensagem será exibida por dois segundos antes de desaparecer. |
| Exibir no Começo da Rodada | False | Essa mensagem não será exibida quando a rodada começar, mas quando a bateria for coletada. |
Como adicionar scripts Verse
Adicione os seguintes scripts Verse, começando com uma referência a dispositivos com a função @editable.
Você pode copiar o código na ordem em que foi escrito. Comentários foram adicionados ao script para maior clareza.
~~~(verse) using { /Fortnite.com/Devices } using { /Fortnite.com/Characters } using { /Verse.org/Simulation} using { /UnrealEngine.com/Temporary/Diagnostics }
log_parkour := class(log_channel){}
Este é um dispositivo do Modo Criativo criado em Verse que pode ser colocado em um nível
Este exemplo de script é uma versão do parkour em que o objetivo é reunir 4 baterias antes que o temporizador chegue ao fim
# Primeiros passos:
https://dev.epicgames.com/documentation/en-us/uefn/learn-programming-with-verse-in-unreal-editor-for-fortnite
parkour_race_script := class(creative_device): Logger : log = log{Channel:=log_parkour}
# Referência do dispositivo para a plataforma de surgimento @editable PlayerSpawnDevice : player_spawner_device = player_spawner_device{} # Dispositivo Fim de Jogo para uma vitória @editable EndGameVictoryDevice : end_game_device = end_game_device{} # Temporizador para esse modo de jogo @editable TimerDevice : timer_device = timer_device{} # Feedback da mensagem do HUD para o jogador quando ele obtém uma bateria @editable HUDMessageBattery : hud_message_device = hud_message_device{} # Uma matriz dos Geradores de Itens no projeto. @editable BatteryItemSpawners : []item_spawner_device = array{}
@editable SecretBatteryItemSpawner : item_spawner_device = item_spawner_device{}
# Quantidade de tempo ajustável a ser adicionada quando o jogador pegar a bateria secreta @editable SecretBatteryTimeReward : float = 10.0
# Declaração para um número inteiro que representa o número de baterias que coletamos até o momento. var BatteriesCollected : int = 0
O script acima mostra como usar @editable para expor dispositivos do Modo Criativo, [matrizes](array-in-verse) e [floats](float-in-verse) ao UEFN. Para que seu script os chame posteriormente, os dispositivos primeiro devem ser definidos em Verse.
~~~(verse)
# Mensagem a ser exibida quando uma bateria for coletada.
BatteryCollectedMessage<localizes>(Amount:int) : message = "Você coletou {Amount} bateria"
BatteriesCollectedMessage<localizes>(Amount:int) : message = "Você coletou {Amount} baterias"
# Mensagens para a coleta da bateria secreta e a mensagem de conclusão.
AllBatteriesCollectedMessage<localizes> : message = "Você coletou todas as baterias!"
SecretBatteryCollectedMessage<localizes> : message = "Você coletou a bateria secreta, mais tempo adicionado!"
O script acima mostra como definir uma função que retorna uma mensagem parametrizada com base na quantidade de baterias coletadas. Ele também define as mensagens a serem mostradas quando todas as baterias e a bateria secreta forem coletadas.
~~~(verse)
# É executado quando este device_script é inicializado em um jogo em execução.
OnBegin
# Inscrevendo-se em AgentSpawnedEvent. # Quando o jogador surge, a função "HandleAgentSpawned" é chamada. PlayerSpawnDevice.SpawnedEvent.Subscribe(HandleAgentSpawned) # A mesma coisa vale para o temporizador. Inscreva quando ele expirar. TimerDevice.FailureEvent.Subscribe(HandleTimerExpired)
# Consulte sua matriz de BatteryItemSpawners e, para cada Gerador de Itens, inscreva ItemPickupEvent. # Faça isso para cada Gerador de Itens e não salve o identificador como você fez para AgentSpawnedSubscription e TimeExpiredSubscription acima. # Você não precisa salvar o identificador. Porém, sem ele, não poderá cancelar a inscrição. Ou seja, ela será acionada todas as vezes que um item for coletado. for (BatterySpawner : BatteryItemSpawners): BatterySpawner.ItemPickedUpEvent.Subscribe(HandleBatteryPickedUp)
<# Uma forma alternativa de realizar o loop for acima que usa um número inteiro para percorrer a matriz. for (i:int := 0..BatteryItemSpawners.Length - 1): if (Battery := BatteryItemSpawners[i]): Battery.ItemPickedUpEvent.Subscribe(HandlebatteryPickedUp) #>
SecretBatteryItemSpawner.ItemPickedUpEvent.Subscribe(HandleSecretBatteryPickedUp)
A função OnBegin define o que acontece quando o jogo começa durante o [loop](loop-and-break-in-verse) for até o evento de coleta das baterias.
~~~(verse)
# Uma função chamada quando o agente surge da Plataforma de Surgimento de Jogador.
HandleAgentSpawned(Agent:agent):void=
Logger.Print("Agente gerado!")
# Reinicie o dispositivo Temporizador para garantir que os jogadores que ressurgirem tenham o tempo total.
TimerDevice.Reset(Agent)
TimerDevice.Start(Agent)
~~~
Acima está o código de quando o jogador surge, o que zera o temporizador e o reinicia.
~~~(verse)
# Função chamada quando um item de bateria é retirado dos Geradores de Itens.
HandleBatteryPickedUp(Agent:agent):void=
# Incremente o número de baterias coletadas.
set BatteriesCollected = BatteriesCollected + 1
# É assim que você pode enviar o número de baterias para o log. Útil para depuração.
Logger.Print("Número de baterias coletadas: {BatteriesCollected}")
# Verifique se há baterias suficientes coletadas para o final do jogo
if:
BatteriesCollected >= BatteryItemSpawners.Length
then:
# Verifique se coletamos 4 (ou mais) baterias. Se sim, ganhamos, então chame a função EndGame
spawn { EndGame(Agent) }
else:
# Este código é executado quando o número de baterias é menor que 4. Mostre uma mensagem do HUD para estimular o jogador
# A mensagem do HUD será "bateria" se apenas 1 bateria for coletada. Passará a ser "baterias" se mais de 1 bateria for coletada
if:
BatteriesCollected = 1
then:
HUDMessageBattery.SetText(BatteryCollectedMessage(BatteriesCollected))
HUDMessageBattery.Show(Agent)
else:
HUDMessageBattery.SetText(BatteriesCollectedMessage(BatteriesCollected))
HUDMessageBattery.Show(Agent)
# Em seguida, obtemos o próximo Gerador de Itens na nossa matriz que configuramos
# Fazemos isso "indexando" à matriz. Está dentro da declaração "if" para garantir que NextBatterySpawner seja referenciado corretamente
if:
NextBatterySpawner := BatteryItemSpawners[BatteriesCollected]
then:
# Se tivermos o próximo gerador de itens, chamar SpawnItem, que ativará a próxima bateria a ser coletada
NextBatterySpawner.SpawnItem()
~~~
Acima está o código que controla a coleta de uma bateria. Se todas as baterias tiverem sido coletadas, o método EndGame será chamado. Caso contrário, mensagens do HUD serão exibidas para os jogadores, e a próxima bateria será gerada.
~~~(verse)
HandleSecretBatteryPickedUp(Agent:agent):void=
Logger.Print("Bateria secreta coletada")
# Obtenha o tempo restante para que possamos adicionar mais tempo a ele
var TimeRemaining:float = TimerDevice.GetActiveDuration( Agent )
var TimeToAdd:float = (TimeRemaining + SecretBatteryTimeReward)
# Adicione mais tempo ao dispositivo temporizador, mas não ultrapasse o tempo de início original
TimerDevice.SetActiveDuration(Min(TimeToAdd, TimerDevice.GetMaxDuration()), Agent )
HUDMessageBattery.SetText(SecretBatteryCollectedMessage)
HUDMessageBattery.Show(Agent)
Acima está o código que adiciona tempo ao dispositivo Temporizador quando a bateria secreta é coletada. Ele está configurado para não ultrapassar o tempo de início do dispositivo Temporizador de 30 segundos. Esse código também exibe uma mensagem na tela.
~~~(verse) # Função que é chamada quando o temporizador expira HandleTimerExpired(Agent:agent):void= Logger.Print("Temporizador encerrado")
if (Agent := MaybeAgent?): Agent
# Eliminar o jogador if: FortniteCharacter : fort_character = Player.GetFortCharacter[] then: FortCharacter.Damage(500.0) ~~~
Acima está o código que elimina o jogador quando o tempo acaba. O jogador então ressurge, e o temporizador é reiniciado no método HandleAgentSpawned.
~~~(verse)
# Função assíncrona que controla o final do jogo
EndGame(Agent:agent)
# É executado quando este device_script é interrompido ou o jogo é finalizado
OnEnd
Acima está o código que encerra o jogo. Usar Sleep(3.0) é um exemplo do uso de um método assíncrono.
Como configurar o dispositivo Verse
Compile seu script Verse e localize seu dispositivo na Gaveta de Conteúdo. Arraste o dispositivo Verse até uma área invisível do seu mapa para personalizar as configurações.
No painel Detalhes do dispositivo, defina as configurações para que correspondam a cada dispositivo referenciado, como na foto acima.
Para configurar esse dispositivo, defina as Opções do usuário da seguinte maneira:
| Opção | Valor | Explicação |
|---|---|---|
| PlayerSpawnDevice | Plataforma de Surgimento de Jogador | Selecione essa opção na caixa suspensa para fazer referência a dispositivos. |
| EndGameVictoryDevice | Dispositivo Vitória no Fim de Jogo | Selecione essa opção na caixa suspensa para fazer referência a dispositivos. |
| TimerDevice | Temporizador | Selecione essa opção na caixa suspensa para fazer referência a dispositivos. |
| HUDMessageBattery | Bateria do Dispositivo Mensagem do HUD | Selecione essa opção na caixa suspensa para fazer referência a dispositivos. |
| PlayerSpawnDevice | Plataforma de Surgimento de Jogador | Selecione essa opção na caixa suspensa para fazer referência a dispositivos. |
| BatteryItemSpawners - 0 | Gerador de Bateria 1 | Selecione essa opção na caixa suspensa para fazer referência a dispositivos. |
| BatteryItemSpawners - 1 | Gerador de Bateria 2 | Selecione essa opção na caixa suspensa para fazer referência a dispositivos. |
| BatteryItemSpawners - 2 | Gerador de Bateria 3 | Selecione essa opção na caixa suspensa para fazer referência a dispositivos. |
| BatteryItemSpawners - 3 | Gerador de Bateria 4 | Selecione essa opção na caixa suspensa para fazer referência a dispositivos. |
| SecretBatteryItemSpawner | Gerador de Bateria - Secreta | Selecione essa opção na caixa suspensa para fazer referência a dispositivos. |
| SecretBatteryTimeReward | 10.0 | A recompensa de tempo por coletar a bateria secreta. |
Selecione Iniciar sessão para testar seu nível completo.