Para ajudar na depuração do seu jogo, você pode exibir determinados dados do jogo para fins de teste enquanto oculta essas informações do jogador. Uma forma de fazer isso é usar registros em log, mas você pode exibir alguns dados do jogo de maneira mais visual com a API Debug Draw.
Usando a API Debug Draw, você pode traçar formas básicas e definir seu local, tamanho, cor e o tempo que aparecem na tela. Por exemplo, você pode querer visualizar a faixa de visibilidade de um PNJ ou a distância a partir da qual o áudio pode ser ouvido do seu ponto de origem. Com a forma de depuração da caixa, você pode traçar uma caixa cujas dimensões e local correspondam a qualquer volume, mesmo que esse volume esteja invisível no seu jogo. O que pode ajudar a descobrir o posicionamento de volumes com certos efeitos.
A forma de depuração de seta traçada do rosto de um PNJ até o limite de sua faixa de visibilidade pode ser usada para ajudar a projetar o posicionamento perfeito dos guardas.
Como habilitar a Verse Debug Draw
O primeiro passo é garantir que você possa ver as formas traçadas.
-
Selecione Configurações da Ilha no Organizador do UEFN.
-
Na barra de pesquisa do painel Detalhes, digite debug (depurar). Isso filtrará os resultados para a categoria "Opções do Usuário - Debug".
-
Clique em Debug e depois em Verse Debug Draw para ativar as funcionalidades Debug e Verse Debug Draw.
A Verse Debug Draw estará ativa apenas durante uma sessão de jogo do UEFN. Ela é habilitada por usuário, o que significa que somente aqueles que ativaram Debug e Verse Debug Draw verão as formas de depuração. As formas de depuração não aparecerão na janela de visualização do UEFN nem em uma ilha publicada, mesmo que essa opção esteja marcada nas Configurações da Ilha.
Como traçar a primeira forma de depuração
Para traçar a primeira forma com a API Debug Draw, siga estas etapas.
-
Adicione esta expressão de importação ao seu arquivo Verse.
using { /UnrealEngine.com/Temporary/Diagnostics }
-
Crie um canal declarando uma subclasse que herde do tipo
debug_draw_channel
. Os canais servem para agrupar formas relacionadas. Eles são opcionais, mas é uma boa prática usá-los. Existem funções na API Debug Draw que você pode usar para exibir, ocultar ou apagar várias formas de uma só vez. Porém, as ações de mostrar e ocultar funcionam apenas no nível do canal.my_debug_draw := class(debug_draw_channel) {}
-
Declare uma nova constante do tipo
debug_draw
. Ela será o objeto que você usará para chamar os métodos para traçar as formas. Este exemplo mostra o uso do parâmetro "Channel" (criado na etapa anterior), mas é opcional.DebugDraw:debug_draw = debug_draw{Channel := my_debug_draw}
-
Chame o método
DrawSphere
. Esse exemplo usa dois parâmetros.
-
Center:= vector3{Z:= 150.0}
: Este é um parâmetro obrigatório do tipo vector3 que determina o local do centro da esfera. Neste exemplo, você usará o constructor do tipovector3
para criar um valor literal. O que definirá o centro da esfera no local0.0, 0.0, 150.0
. -
?DrawDurationPolicy:= debug_draw_duration_policy.Persistent
: Esse parâmetro é opcional, mas seu valor padrão fará com que a esfera desapareça após alguns segundos, então defina-o para a política Persistent. Ou seja, a esfera permanecerá visível na ilha até que seja ocultada ou apagada por outro código.DebugDraw.DrawSphere(Center := vector3{Z:=150.0}, ?DrawDurationPolicy := debug_draw_duration_policy.Persistent)
Depois de criar seu código Verse e iniciar uma sessão, você verá uma esfera aparecer no local definido pelo parâmetro Center
.
Formas
Com a API Debug Draw, você pode traçar várias formas que aparecem como wireframes simples em uma sessão do UEFN em execução. Todas as formas são úteis em diferentes situações. As seções a seguir explicam os métodos para traçar cada forma e os parâmetros exclusivos de cada método. Uma seção posterior explica os parâmetros comuns a todos os métodos. Cada exemplo de código nesta seção pressupõe que você tenha adicionado o código de "Como traçar a primeira forma de depuração" para o arquivo Verse.
Box (Caixa)
Use o método DrawBox()
para traçar um cubo.
DebugDraw.DrawBox(vector3{Z:=150.0}, rotation{}, ?DrawDurationPolicy := debug_draw_duration_policy.Persistent)
Parâmetro exclusivo | O que ele faz |
---|---|
Center:vector3 | Define o centro da caixa. |
Rotation:rotation | Define como a caixa é girada. |
?Extent:vector3 | Define o comprimento, a largura e a profundidade da caixa. |
Capsule (Cápsula)
Use o método DrawCapsule()
para traçar uma cápsula. Uma cápsula é composta de um cilindro com metade de uma esfera em cada extremidade.
DebugDraw.DrawCapsule(vector3{Z:=200.0}, rotation{}, ?DrawDurationPolicy := debug_draw_duration_policy.Persistent)
Parâmetro exclusivo | O que ele faz |
---|---|
Center:vector3 | Define o centro da cápsula. |
Rotation:rotation | Define como a cápsula é girada. |
?Height:float | Define o comprimento da cápsula. |
?Radius:float | Define o raio da cápsula em seu ponto mais largo. |
Sphere (Esfera)
Use o método DrawSphere()
para traçar uma esfera.
DebugDraw.DrawSphere(vector3{Z:=150.0}, ?DrawDurationPolicy := debug_draw_duration_policy.Persistent)
Parâmetro exclusivo | O que ele faz |
---|---|
Center:vector3 | Define o centro da esfera. |
?Radius:float | Define o raio da esfera em seu ponto mais largo. |
?NumSegments:int | Define o número de linhas que compõem a esfera. |
Cone
Use o método DrawCone()
para traçar um cone.
DebugDraw.DrawCone(vector3{Z:=150.0}, vector3{Z:=-1.0}, ?DrawDurationPolicy := debug_draw_duration_policy.Persistent)
Parâmetro exclusivo | O que ele faz |
---|---|
Origin:vector3 | Define o local do ponto do cone. |
Direction:vector3 | Define a direção na qual o cone é aberto. |
?Height:float | Define o comprimento do cone. |
?NumSides:int | Define o número de lados. |
?AngleWidthRadians:float | Define a largura do cone na direção X. |
?AngleHeightRadians:float | Define a largura do cone na direção Y. |
Para tornar a parte inferior do cone um círculo perfeito, AngleWidthRadians
e AngleHeightRadians
devem ser iguais.
Cylinder (Cilindro)
Use o método DrawCylinder()
para traçar um cilindro.
DebugDraw.DrawCylinder(vector3{Z:=100.0}, vector3{Z:=200.0}, ?DrawDurationPolicy := debug_draw_duration_policy.Persistent)
Parâmetro exclusivo | O que ele faz |
---|---|
Start:vector3 | Define o local de uma extremidade do cilindro. |
End:vector3 | Define o local da outra extremidade do cilindro. |
?NumSegments:int | Define o número de linhas conectando uma extremidade do cilindro à outra. |
?Radius:float | Define o raio dos dois círculos que compõem cada extremidade do cilindro. |
Line (Linha)
Use o método DrawLine()
para traçar uma linha.
DebugDraw.DrawLine(vector3{Z:=100.0}, vector3{Z:=200.0}, ?DrawDurationPolicy := debug_draw_duration_policy.Persistent)
Parâmetro exclusivo | O que ele faz |
---|---|
Start:vector3 | Define o local da extremidade de uma linha. |
End:vector3 | Define o local da outra extremidade da linha. |
Arrow (Seta)
Use o método DrawArrow()
para traçar uma seta.
DebugDraw.DrawArrow(vector3{Z:=100.0}, vector3{Z:=200.0}, ?DrawDurationPolicy := debug_draw_duration_policy.Persistent)
Parâmetro exclusivo | O que ele faz |
---|---|
Start:vector3 | Define o local do início da seta. |
End:vector3 | Define o local da ponta da seta. |
?ArrowSize:float | Define o comprimento das duas linhas que compõem a ponta da seta. |
Point (Ponto)
Use o método DrawPoint()
para traçar um ponto.
DebugDraw.DrawPoint(vector3{Z:=200.0}, ?Thickness:= 10.0, ?DrawDurationPolicy := debug_draw_duration_policy.Persistent)
Parâmetro exclusivo | O que ele faz |
---|---|
Position:vector3 | Define o local do ponto. |
Thickness
padrão de DrawPoint
é um ponto muito pequeno para ser visível. Defina Thickness
como um valor maior, conforme mostrado no exemplo acima, para ver o ponto.
Parâmetros comuns
Estes parâmetros são comuns a todos os métodos que traçam formas. Eles também são opcionais e não precisam ser incluídos como argumentos ao chamar um método. Se você optar por incluí-los, certifique-se de usar o nome dos parâmetros precedido por ?
. Consulte Chamando funções para obter mais informações sobre argumentos nomeados e opcionais.
Color (Cor)
Defina a cor das formas usando o parâmetro Color
. Os valores devem ser do tipo color
. A lista de cores válidas pode ser encontrada no módulo NamedColors. Certifique-se de ter a expressão de importação para o módulo Colors
no topo do seu arquivo Verse. Abaixo está um exemplo de como definir um ponto como uma cor diferente.
DebugDraw.DrawPoint(Position := vector3{Z:= 200.0}, ?Thickness := 20.0, ?Color := NamedColors.MediumSeaGreen)
DrawDurationPolicy
DrawDurationPolicy
determina quanto tempo uma forma de depuração permanece na tela. Existem três valores possíveis.
-
SingleFrame
: A forma permanecerá na tela pela duração de um único quadro. Essa política pode ser útil quando você deseja traçar uma forma com frequência. -
FiniteDuration
: essa política é usada com o parâmetroDuration
para exibir uma forma por um determinado número de segundos. -
Persistent
: com a política "Persistent", a forma permanecerá na tela até ser ocultada ou limpa por outro código.
Duration (Duração)
O parâmetro Duration
é usado com a política FiniteDuration
para exibir uma forma por um determinado número de segundos. Abaixo está um exemplo de código que traça uma esfera que é exibida por 30 segundos.
DebugDraw.DrawSphere(vector3{}, ?DrawDurationPolicy := debug_draw_duration_policy.FiniteDuration, ?Duration := 30.0)
Thickness (Espessura)
O parâmetro Thickness
define a espessura das linhas que compõem cada forma de depuração. No caso de DrawPoint()
, ele define a espessura do ponto único.
Channels (Canais)
Você pode usar canais para agrupar formas relacionadas e, em seguida, ocultar, exibir ou apagar todas as formas em um canal de uma só vez.
Para criar um canal, use o parâmetro Channel
ao declarar uma instância de debug_draw
.
DebugDraw:debug_draw = debug_draw{Channel := debug_draw_defaults}
Agora, qualquer forma que você traçar usando a instância DebugDraw
pode ser ocultada, exibida ou apagada com um único método. Por exemplo, se você traçar um ponto, uma esfera e uma seta com a instância DebugDraw
, poderá ocultá-los por algum tempo, depois exibi-los novamente e finalmente apagá-los quando não forem mais necessários.
# Point (Ponto)
DebugDraw.DrawPoint(vector3{Z := 200.0}, ?Thickness:= 50.0, ?DrawDurationPolicy:= debug_draw_duration_policy.Persistent)
# Sphere (Esfera)
DebugDraw.DrawSphere(vector3{Z := 200.0}, ?DrawDurationPolicy:= debug_draw_duration_policy.Persistent)
# Arrow (Seta)
DebugDraw.DrawArrow(vector3{Z := 200.0}, vector3{Z := 400.0}, ?DrawDurationPolicy:= debug_draw_duration_policy.Persistent)
Sleep(5.0)
DebugDraw.HideChannel()
Sleep(5.0)
DebugDraw.ShowChannel()
Sleep(5.0)
DebugDraw.ClearChannel()
Valores de parâmetro padrão
Parâmetro | Valor |
---|---|
?Color:color | NamedColors.Yellow |
?DrawDurationPolicy:debug_draw_duration_policy | debug_draw_duration_policy.FiniteDuration |
?Duration:float | 5.0 |
?Thickness:float | 0.0 |
?Radius:float | 10.0 |
Exemplos
Como visualizar a faixa de um dispositivo Reprodutor de Áudio
O Reprodutor de Áudio tem uma configuração para visualizar sua atenuação. Porém, você só pode acessar essa visualização durante o modo de edição. Siga estas etapas para aprender como recriar os elementos visuais de atenuação em uma sessão de jogo.
-
Arraste um Reprodutor de Áudio até o seu nível. No painel Detalhes, certifique-se de que a opção Habilitar elementos visuais de atenuação esteja marcada. Isso ajudará você a verificar se está recriando os elementos visuais corretamente com as formas de depuração.
-
No arquivo Verse, crie uma nova instância de
debug_draw
chamadaDebugDrawAudio
. Dê a ela um canal com o nomedebug_draw_audio
.DebugDrawAudio:debug_draw = debug_draw{Channel := debug_draw_audio}
-
Adicione duas constantes
@editable
do tipofloat
. Chame-as deDebugAttenuationMinDistance
eDebugAttenuationFalloffDistance
. Elas serão os dois raios das esferas traçadas para visualizar a atenuação do Reprodutor de Áudio.@editable DebugAttenuationMinDistance:float = 100.0 @editable DebugAttenuationFalloffDistance:float = 100.0
-
Adicione outra constante
@editable
para representar o Reprodutor de Áudio. Chame-a deAudioPlayerDevice
.@editable AudioPlayerDevice:audio_player_device = audio_player_device{}
-
Declare uma função chamada
DrawAudioDeviceRange()
e dê a ela dois parâmetros do tipofloat
:AttenuationMinDistance
eAttenuationFalloffDistance
.DrawAudioDeviceRange(AttenuationMinDistance:float, AttenuationFalloffDistance:float):void =
-
Na nova função, obtenha o objeto de transformação do Reprodutor de Áudio.
AudioPlayerDeviceTransform:= AudioPlayerDevice.GetTransform()
-
Usando a função
DrawSphere
da API Debug Draw, trace duas esferas para representar a distância mínima da atenuação e a distância de enfraquecimento da atenuação. ORadius
na segunda chamada deDrawSphere
deve ser definido como a soma deAttenuationMinDistance
eAttenuationFalloffDistance
, pois a atenuação apenas começa fora do raio da distância mínima da atenuação.DebugDrawAudio.DrawSphere( AudioPlayerDeviceTransform.Translation, ?Radius:= AttenuationMinDistance, ?DrawDurationPolicy:= debug_draw_duration_policy.Persistent) DebugDrawAudio.DrawSphere( AudioPlayerDeviceTransform.Translation, ?Radius:= AttenuationMinDistance + AttenuationFalloffDistance, ?DrawDurationPolicy:= debug_draw_duration_policy.Persistent)
-
Na função
OnBegin()
do arquivo Verse, chame a funçãoDrawAudioDeviceRange()
.OnBegin<override>()<suspends>:void= DrawAudioDeviceRange(DebugAttenuationMinDistance, DebugAttenuationFalloffDistance)
-
Compile seu código Verse. No painel Detalhes do dispositivo Verse, certifique-se de definir os valores para DebugAttenuationMinDistance e DebugAttenuationFalloffDistance. Esses valores devem ser equivalentes aos valores da Distância mínima da atenuação e da Distância de enfraquecimento da atenuação para o Reprodutor de Áudio, multiplicados por 100.
O Reprodutor de Áudio usa medidores para a distância mínima da atenuação e a distância de enfraquecimento da atenuação. Como a API Debug Draw usa centímetros, você deve converter os valores.
-
Script completo
using { /Fortnite.com/Devices } using { /Fortnite.com/Characters } using { /Fortnite.com/Playspaces } using { /UnrealEngine.com/Temporary/Diagnostics } using { /UnrealEngine.com/Temporary/SpatialMath } debug_audio_device := class(creative_device): @editable AudioPlayerDevice:audio_player_device = audio_player_device{} @editable DebugAttenuationMinDistance:float = 100.0 @editable DebugAttenuationFalloffDistance:float = 100.0 DebugDrawAudio:debug_draw = debug_draw{Channel := debug_draw_audio} OnBegin<override>()<suspends>:void= DrawAudioDeviceRange(DebugAttenuationMinDistance, DebugAttenuationFalloffDistance) DrawAudioDeviceRange(AttenuationMinDistance:float, AttenuationFalloffDistance:float):void = AudioPlayerDeviceTransform:= AudioPlayerDevice.GetTransform() DebugDrawAudio.DrawSphere( AudioPlayerDeviceTransform.Translation, ?Radius:= AttenuationMinDistance, ?DrawDurationPolicy:= debug_draw_duration_policy.Persistent) DebugDrawAudio.DrawSphere( AudioPlayerDeviceTransform.Translation, ?Radius:= AttenuationMinDistance + AttenuationFalloffDistance, ?DrawDurationPolicy:= debug_draw_duration_policy.Persistent)