Com as tags de jogabilidade, você pode localizar atores marcados com uma tag específica enquanto o jogo está em execução. As tags de jogabilidade permitem que você trabalhe com vários atores sem precisar configurar propriedades e atribuir referências no Unreal Editor para Fortnite (UEFN). Tags de jogabilidade são criadas no código Verse e atribuídas no UEFN.
O uso de tags de jogabilidade pode abrir oportunidades interessantes de jogabilidade, como:
Alterando a configuração do nível sem ter que adicionar ou modificar as referências do dispositivo criado com Verse.
Localizando todos os atores com uma tag específica e operá-los com base em seu tipo, como "acender luzes" ou "alternar barreiras".
Alterar dinamicamente quais atores ficam ativos à medida que o jogador avança no jogo.
Habilitando atores condicionalmente para uma corrida de obstáculos com base em uma opção de dificuldade selecionada pelo jogador.
O que pode receber tags?
Atualmente, tags de jogabilidade podem ser atribuídas ao seguinte:
As seções a seguir mostram como criar e trabalhar com tags de jogabilidade no seu projeto.
Como criar uma tag de jogabilidade
Siga estas etapas para criar uma nova tag de jogabilidade usando Verse:
Abra seu arquivo Verse no Visual Studio Code com o Explorador de Verse.
Na parte superior do seu arquivo Verse, adicione o seguinte código para habilitar referências à classe
tag.Verseusing { /Verse.org/Simulation/Tags }Crie uma nova classe que herde da classe
tag. O nome da sua classe determina o nome da tag. Neste exemplo, a classe se chamamytag, então o nome da tag de jogabilidade é mytag.Verse# Derive from the `tag` class in the Verse.org/Simulation/Tags module to create a new gameplay tag. mytag := class(tag){}Seu arquivo Verse deve ficar assim:
Verseusing { /Fortnite.com/Devices } using { /Verse.org/Simulation } using { /Verse.org/Simulation/Tags } # Derive from the `tag` class in the Verse.org/Simulation/Tags module to create a new gameplay tag. mytag := class(tag){}Salve seu arquivo Verse e clique em Compilar código Verse na barra de ferramentas do UEFN para compilar seu código para poder usar a nova tag de jogabilidade.
Tags de jogabilidade são rótulos hierárquicos. Essas tags podem ter inúmeros níveis hierárquicos, separados pelo caractere _ no nome da classe.
Quando o nome da tag de jogabilidade aparece no editor, os caracteres _ são convertidos em ".".
Por exemplo, uma tag de jogabilidade com três níveis teria o nome de family_genus_species e apareceria no editor como "family.genus.species", Com "family" sendo o identificador mais amplo na hierarquia e "species", o mais específico.
Observe que a existência de "family.genus.species" não significa implicitamente que as tags de jogabilidade "family.genus" e "family" também existam. Você deve criar essas tags de jogabilidade em Verse com os nomes de classe family e family_genus para criar os níveis hierárquicos.
Como atribuir uma tag de jogabilidade
Siga estas etapas para atribuir uma tag de jogabilidade. Este exemplo usa um dispositivo, mas as etapas são as mesmas para outros atores.
No UEFN, no Organizador, selecione o dispositivo que deseja marcar para abrir o painel Detalhes dele. Neste exemplo, o dispositivo é um dispositivo Botão.
No painel Detalhes, clique em Adicionar novo componente e escolha Marcação de tag em Verse no menu suspenso.
Selecione o componente VerseTagMarkup para visualizar configurações dele no painel Detalhes.
Em Tags de Jogabilidade, edite a propriedade de Tags e adicione sua tag de jogabilidade. Neste exemplo, mytag é adicionada ao dispositivo.
Você pode adicionar várias tags ao mesmo ator, para que cada ator possa pertencer a vários grupos ao mesmo tempo. Quando você tiver um ator com várias tags, poderá encontrar esse ator por qualquer tag que ele tenha.
Por exemplo, um ator com as tags mytag1 e mytag2 será encontrado ao chamar GetCreativeObjectsWithTag(mytag1{}) ou GetCreativeObjectsWithTag(mytag2{}).
Como localizar atores com uma tag de jogabilidade
Depois de atribuir atores com tags de jogabilidade, você pode localizá-los por tags de jogabilidade durante um jogo usando a função Verse GetCreativeObjectsWithTag(). No exemplo a seguir, chamar GetCreativeObjectsWithTag(mytag{}) faz com que TaggedDevices que contém todos os atores que têm mytag atribuída a eles:
TaggedActors := GetCreativeObjectsWithTag(mytag{})A chamada da função GetCreativeObjectsWithTag() retorna uma matriz de todos os objetos que implementam creative_object_interface. Por exemplo, se você atribuísse mytag a um dispositivo Botão e a um dispositivo de Luz Personalizável no nível, essa chamada de função retornaria ambos os dispositivos.
Você pode converter o resultado de GetCreativeObjectsWithTag() em uma de suas classes de implementação (chamada conversão de tipo) usando a sintaxe NewObjectReference := object_type_to_cast_to[ObjectReference], em que object_type_to_cast_to é o tipo de objeto desejado. Por exemplo, se você quiser ligar ou desligar um dispositivo Luz Personalizável, deverá converter o resultado em customizable_light_device antes de chamar a função TurnOff() ou TurnOn().
A conversão de tipo é uma expressão falível, porque falhará se o dispositivo não puder ser convertido nesse tipo, como quando for um tipo diferente de dispositivo. Por exemplo, você não pode converter um dispositivo Botão em uma classe customizable_light_device, porque um dispositivo Botão e um dispositivo Luz personalizável não são o mesmo tipo de dispositivo.
Com expressões for, você pode usar expressões falíveis como um filtro e criar novas variáveis para usar no bloco de código for. Por exemplo, você pode adicionar a conversão de tipo de customizable_light_device à expressão de iteração em for. Como o dispositivo será convertido em customizable_light_device, você poderá usar as funções específicas dessa classe, como TurnOff(), para apagar a luz.
TaggedActors := GetCreativeObjectsWithTag(mytag{})
for (TaggedActor : TaggedActors, LightDevice := customizable_light_device[TaggedActor]):
LightDevice.TurnOff()O exemplo a seguir mostra como verificar condicionalmente o tipo do ator e chamar funções diferentes com base no tipo. O exemplo verifica se o ator marcado é um dispositivo Luz Personalizável que pode chamar TurnOff() para apagar a luz ou se é um dispositivo Barreira que pode chamar Disable() para apagá-la.
TaggedActors := GetCreativeObjectsWithTag(mytag{})
for (TaggedActor : TaggedActors):
if (LightDevice := customizable_light_device[TaggedActor]):
# If the tagged actor is a Customizable Light device, turn it off
LightDevice.TurnOff()
else if (BarrierDevice := barrier_device[TaggedActor]):
# If the tagged actor is a Barrier device, turn it off
BarrierDevice.Disable()Ao chamar GetCreativeObjectsWithTag(), a lista resultante não é ordenada por nenhum método que você possa conhecer ou afetar antecipadamente. Nos casos em que você adiciona ou remove atores entre chamadas para GetCreativeObjectsWithTag() usando a mesma tag, a lista resultante pode estar em uma ordem diferente para cada resultado de chamada.
Se o jogo tiver que lidar com atores em uma ordem específica, você deverá usar uma matriz editável em vez de tags de jogabilidade, já que o resultado de GetCreativeObjectsWithTag() é uma lista não ordenada de atores.
Como localizar a posição por tipo com tags de jogabilidade
Aqui está um exemplo de como filtrar os atores retornados de GetCreativeObjectsWithTag() por tipo e imprimir sua posição.
# find all actors with the all_tag
AllCreativeObjects : []creative_object_interface := GetCreativeObjectsWithTag(all_tag{})
# Print the position of all creative_prop actors with the all_tag
for (Prop : AllCreativeObjects):
if (Prop := creative_prop[Prop]):
Print("Prop found with all_tag at position: {Prop.GetTransform().Translation}")
# Print the position of all device actors with the all_tag
for (Device:AllCreativeObjects):
Explorando tutoriais que usam tags de jogabilidade
Os tutoriais a seguir mostram como usar tags de jogabilidade em um jogo.
Quebra-cabeça de luzes marcadas
Crie um quebra-cabeça em que o jogador deve encontrar a combinação certa de luzes acesas e apagadas para gerar um item, usando um dispositivo criado com Verse.