게임 디버깅에 도움이 되도록, 테스트 목적으로 특정 게임 데이터를 표시하는 한편 플레이어에게는 해당 정보를 숨길 수 있습니다. 이를 위한 한 가지 방법으로 로깅이 있지만 Debug Draw API를 사용하여 보다 시각적인 방식으로 일부 게임 데이터를 표시할 수 있습니다.
Debug Draw API로 기본 셰이프를 드로하고 위치, 크기, 컬러 및 화면에 표시되는 시간을 설정할 수 있습니다. 예를 들어 NPC의 비저빌리티 범위나 오디오의 원점에서 오디오가 들리는 거리를 시각화할 수 있습니다. 박스 디버그 셰이프를 사용하면 해당 볼륨이 게임에서 보이지 않더라도 어떤 볼륨과도 매칭되는 치수와 위치로 박스를 드로할 수 있습니다. 이는 특정 이펙트가 있는 볼륨의 배치를 파악하는 데 도움이 될 수 있습니다.
NPC의 얼굴에서 비저빌리티 범위의 한도까지 드로한 화살표 디버그 셰이프를 사용하여 가드의 완벽한 배치를 설계할 수 있습니다.
Verse 디버그 드로 활성화
첫 번째 단계는 드로하는 셰이프를 볼 수 있게 하는 것입니다.
-
UEFN 아웃라이너(Outliner)에서 섬 설정(Island Settings)을 선택합니다.
-
디테일(Details) 패널 검색창에 'debug'를 입력합니다. 이렇게 하면 결과가 사용자 옵션 - 디버그(User Options - Debug) 카테고리로 필터링됩니다.
-
디버그(Debug) > Verse 디버그 드로(Verse Debug Draw)를 클릭하여 디버그 기능과 Verse 디버그 드로를 활성화합니다.
Verse 디버그 드로는 UEFN의 플레이 세션 중에만 활성 상태이며 사용자별로 활성화됩니다. 섬 설정에서 이 옵션에 체크하더라도 디버그 셰이프는 UEFN 뷰포트 또는 퍼블리싱된 섬에 표시되지 않습니다.
첫 번째 디버그 셰이프 드로하기
Debug Draw API로 첫 번째 셰이프를 드로하려면 다음 단계를 따르세요.
-
이 임포트 표현식을 Verse 파일에 추가합니다.
using { /UnrealEngine.com/Temporary/Diagnostics }
-
debug_draw_channel
타입에서 상속되는 서브클래스를 선언하여 채널을 생성합니다. 채널은 관련된 셰이프를 함께 그룹화하기 위한 것입니다. 선택사항이지만 사용하는 것이 좋습니다. Debug Draw API에는 많은 셰이프를 모두 한 번에 표시하거나, 숨기거나, 지우는 데 사용할 수 있는 함수가 있지만 표시 및 숨기기는 채널 레벨에서만 작동합니다.my_debug_draw := class(debug_draw_channel) {}
-
debug_draw
타입의 새 상수를 선언합니다. 이는 셰이프를 드로하는 메서드를 호출하는 데 사용하는 오브젝트입니다. 이 예시는 Channel 파라미터(이전 단계에서 생성됨)의 사용을 보여주지만, 선택사항입니다.DebugDraw:debug_draw = debug_draw{Channel := my_debug_draw}
-
DrawSphere
메서드를 호출합니다. 이 예시에서는 2개의 파라미터를 사용합니다.
-
Center:= vector3{Z:= 150.0}
: 이는 스피어의 중심 위치를 결정하는 vector3 타입의 필수 파라미터입니다. 이 예시에서는vector3
타입의 생성자를 사용하여 리터럴 값을 생성합니다. 이렇게 하면 스피어의 중심이0.0, 0.0, 150.0
위치에 설정됩니다. -
?DrawDurationPolicy:= debug_draw_duration_policy.Persistent
: 이 파라미터는 선택사항이지만 몇 초 후에 스피어가 사라지게 하는 것이 디폴트값이므로 Persistent 정책으로 설정합니다. 이는 스피어가 다른 코드에 의해 지워지거나 숨겨질 때까지 섬에 계속 표시됨을 의미합니다.DebugDraw.DrawSphere(Center := vector3{Z:=150.0}, ?DrawDurationPolicy := debug_draw_duration_policy.Persistent)
Verse 코드를 빌드하고 세션을 시작한 후 Center
파라미터로 설정한 위치에 스피어가 나타나는 것을 볼 수 있습니다.
셰이프
Debug Draw API를 사용하면 실행 중인 UEFN 세션에서 단순한 와이어프레임으로 표시되는 여러 셰이프를 드로할 수 있습니다. 각 셰이프는 서로 다른 시나리오에서 유용합니다. 다음 섹션에서는 각 셰이프를 드로하는 메서드와 각 메서드의 고유 파라미터에 대해 설명하고, 이후의 섹션에서는 모든 메서드의 범용 파라미터에 대해 설명합니다. 이 섹션의 각 코드 예시는 첫 번째 디버그 셰이프 드로하기의 코드를 Verse 파일에 추가했다고 가정합니다.
박스
큐브를 드로하려면 DrawBox()
메서드를 사용합니다.
DebugDraw.DrawBox(vector3{Z:=150.0}, rotation{}, ?DrawDurationPolicy := debug_draw_duration_policy.Persistent)
고유 파라미터 | 역할 |
---|---|
Center:vector3 | 박스의 중심을 설정합니다 |
Rotation:rotation | 박스의 회전 방식을 설정합니다 |
?Extent:vector3 | 박스의 길이, 너비, 깊이를 설정합니다 |
캡슐
캡슐을 드로하려면 DrawCapsule()
메서드를 사용합니다. 캡슐은 양쪽 끝에 반구가 달린 원기둥으로 이루어져 있습니다.
DebugDraw.DrawCapsule(vector3{Z:=200.0}, rotation{}, ?DrawDurationPolicy := debug_draw_duration_policy.Persistent)
고유 파라미터 | 역할 |
---|---|
Center:vector3 | 캡슐의 중심을 설정합니다 |
Rotation:rotation | 캡슐의 회전 방식을 설정합니다 |
?Height:float | 캡슐의 길이를 설정합니다 |
?Radius:float | 캡슐의 가장 넓은 지점에서 캡슐 반경을 설정합니다 |
스피어
스피어를 드로하려면 DrawSphere()
메서드를 사용합니다.
DebugDraw.DrawSphere(vector3{Z:=150.0}, ?DrawDurationPolicy := debug_draw_duration_policy.Persistent)
고유 파라미터 | 역할 |
---|---|
Center:vector3 | 스피어의 중심을 설정합니다 |
?Radius:float | 스피어의 가장 넓은 지점에서 스피어 반경을 설정합니다 |
?NumSegments:int | 스피어를 이루는 선의 수를 설정합니다 |
원뿔
원뿔을 드로하려면 DrawCone()
메서드를 사용합니다.
DebugDraw.DrawCone(vector3{Z:=150.0}, vector3{Z:=-1.0}, ?DrawDurationPolicy := debug_draw_duration_policy.Persistent)
고유 파라미터 | 역할 |
---|---|
Origin:vector3 | 원뿔의 꼭짓점 위치를 설정합니다 |
Direction:vector3 | 원뿔 밑면의 방향을 설정합니다 |
?Height:float | 원뿔의 길이를 설정합니다 |
?NumSides:int | 면의 수를 설정합니다 |
?AngleWidthRadians:float | X 방향의 원뿔 너비를 설정합니다 |
?AngleHeightRadians:float | Y 방향의 원뿔 너비를 설정합니다 |
원뿔의 밑면을 완벽한 원으로 만들려면 AngleWidthRadians
와 AngleHeightRadians
가 같아야 합니다.
원기둥
원기둥을 드로하려면 DrawCylinder()
메서드를 사용합니다.
DebugDraw.DrawCylinder(vector3{Z:=100.0}, vector3{Z:=200.0}, ?DrawDurationPolicy := debug_draw_duration_policy.Persistent)
고유 파라미터 | 역할 |
---|---|
Start:vector3 | 원기둥의 한쪽 끝의 위치를 설정합니다 |
End:vector3 | 원기둥의 다른 쪽 끝의 위치를 설정합니다 |
?NumSegments:int | 원기둥의 한쪽 끝을 다른 쪽 끝과 연결하는 선의 수를 설정합니다 |
?Radius:float | 원기둥의 각 끝을 이루는 두 원의 반경을 설정합니다 |
선
선을 드로하려면 DrawLine()
메서드를 사용합니다.
DebugDraw.DrawLine(vector3{Z:=100.0}, vector3{Z:=200.0}, ?DrawDurationPolicy := debug_draw_duration_policy.Persistent)
고유 파라미터 | 역할 |
---|---|
Start:vector3 | 선의 한쪽 끝의 위치를 설정합니다 |
End:vector3 | 선의 다른 쪽 끝의 위치를 설정합니다 |
화살표
화살표를 드로하려면 DrawArrow()
메서드를 사용합니다.
DebugDraw.DrawArrow(vector3{Z:=100.0}, vector3{Z:=200.0}, ?DrawDurationPolicy := debug_draw_duration_policy.Persistent)
고유 파라미터 | 역할 |
---|---|
Start:vector3 | 화살표의 시작 위치를 설정합니다 |
End:vector3 | 화살표의 머리 위치를 설정합니다 |
?ArrowSize:float | 화살표의 머리를 이루는 두 선의 길이를 설정합니다 |
점
점을 드로하려면 DrawPoint()
메서드를 사용합니다.
DebugDraw.DrawPoint(vector3{Z:=200.0}, ?Thickness:= 10.0, ?DrawDurationPolicy := debug_draw_duration_policy.Persistent)
고유 파라미터 | 역할 |
---|---|
Position:vector3 | 점의 위치를 설정합니다. |
DrawPoint
의 디폴트 Thickness
가 너무 작아서 보이지 않습니다. 점이 보이도록 위의 예시와 같이 Thickness
를 더 큰 값으로 설정합니다.
범용 파라미터
다음은 셰이프를 드로하는 모든 메서드의 범용 파라미터입니다. 모두 선택 사항이며 메서드를 호출할 때 실행인자로 포함할 필요는 없습니다. 포함하기로 선택하는 경우 접두사 ?
가 붙은 파라미터 이름을 사용해야 합니다. 명명된 실행인자와 선택 사항인 실행인자에 대한 자세한 내용은 함수의 함수 호출하기를 참조하세요.
컬러
Color
파라미터를 사용하여 셰이프의 색상을 설정합니다. 값은 color
타입이어야 합니다. 유효한 컬러의 목록은 NamedColors 모듈에서 확인할 수 있습니다. Verse 파일의 맨 위에 Colors
모듈에 대한 임포트 표현식이 있어야 합니다. 아래는 점을 다른 컬러로 설정한 예시입니다.
DebugDraw.DrawPoint(Position := vector3{Z:= 200.0}, ?Thickness := 20.0, ?Color := NamedColors.MediumSeaGreen)
DrawDurationPolicy
DrawDurationPolicy
는 디버그 셰이프가 화면에 유지되는 시간을 결정합니다. 가능한 값은 3가지가 있습니다.
-
SingleFrame
: 셰이프가 단일 프레임의 시간 동안 화면에 유지됩니다. 이 정책은 셰이프를 빈번하게 리드로하는 경우에 유용할 수 있습니다. -
FiniteDuration
:Duration
파라미터와 함께 이 정책을 사용하면 일정 시간(초) 동안 셰이프가 표시됩니다. -
Persistent
: Persistent 정책을 사용하면 다른 코드에 의해 지워지거나 숨겨질 때까지 셰이프가 화면에 유지됩니다.
지속 시간
Duration
파라미터를 FiniteDuration
정책과 함께 사용하면 일정 시간(초) 동안 셰이프가 표시됩니다. 아래는 30초 동안 표시되는 셰이프를 드로하는 코드의 예시입니다.
DebugDraw.DrawSphere(vector3{}, ?DrawDurationPolicy := debug_draw_duration_policy.FiniteDuration, ?Duration := 30.0)
두께
Thickness
파라미터는 각 디버그 셰이프를 이루는 선의 두께를 설정합니다. DrawPoint()
의 경우 단일 점의 두께를 설정합니다.
채널
채널을 사용하여 관련 셰이프를 함께 그룹화한 다음, 채널의 모든 셰이프를 한 번에 숨기거나 표시하거나 지울 수 있습니다.
채널을 생성하려면 debug_draw
인스턴스를 선언할 때 Channel
파라미터를 사용합니다.
DebugDraw:debug_draw = debug_draw{Channel := debug_draw_defaults}
이제 DebugDraw
인스턴스를 사용하여 드로하는 모든 셰이프를 단일 메서드로 숨기거나 표시하거나 지울 수 있습니다. 예를 들어 DebugDraw
인스턴스로 점, 스피어, 화살표를 드로하는 경우 잠시 숨겼다가 다시 표시하고, 더 이상 필요하지 않으면 최종적으로 지울 수 있습니다.
# 점
DebugDraw.DrawPoint(vector3{Z := 200.0}, ?Thickness:= 50.0, ?DrawDurationPolicy:= debug_draw_duration_policy.Persistent)
# 스피어
DebugDraw.DrawSphere(vector3{Z := 200.0}, ?DrawDurationPolicy:= debug_draw_duration_policy.Persistent)
# 화살표
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()
디폴트 파라미터 값
파라미터 | 값 |
---|---|
?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 |
예시
오디오 플레이어 장치의 범위 시각화
오디오 플레이어 장치에는 감쇠를 시각화하는 세팅이 있습니다. 그러나 이 시각화는 편집 모드 중에만 볼 수 있습니다. 플레이 세션에서 감쇠 비주얼 이펙트를 다시 생성하는 방법을 알아보려면 다음 단계를 따르세요.
-
오디오 플레이어 장치를 레벨로 드래그 앤 드롭합니다. 디테일 패널에서 감쇠 비주얼 이펙트 사용(Enable Attenuation Visuals) 이 선택되어 있어야 합니다. 이렇게 하면 디버그 셰이프로 비주얼 이펙트를 올바르게 다시 생성하고 있는지 검증할 수 있습니다.
-
Verse 파일에서
DebugDrawAudio
라는 새debug_draw
인스턴스를 생성합니다.debug_draw_audio
라는 이름의 채널을 부여합니다.DebugDrawAudio:debug_draw = debug_draw{Channel := debug_draw_audio}
-
float
타입의@editable
상수 2개를 추가합니다.DebugAttenuationMinDistance
및DebugAttenuationFalloffDistance
로 명명합니다. 이는 오디오 플레이어 장치의 감쇠를 시각화하기 위해 드로한 스피어의 두 반경입니다.@editable DebugAttenuationMinDistance:float = 100.0 @editable DebugAttenuationFalloffDistance:float = 100.0
-
오디오 플레이어 장치를 나타내는 또 다른
@editable
을 추가합니다.AudioPlayerDevice
로 명명합니다.@editable AudioPlayerDevice:audio_player_device = audio_player_device{}
-
DrawAudioDeviceRange()
라는 함수를 선언하고float
타입의 두 파라미터AttenuationMinDistance
및AttenuationFalloffDistance
를 부여합니다.DrawAudioDeviceRange(AttenuationMinDistance:float, AttenuationFalloffDistance:float):void =
-
새 함수에서 오디오 플레이어 장치의 트랜스폼 오브젝트를 얻습니다.
AudioPlayerDeviceTransform:= AudioPlayerDevice.GetTransform()
-
Debug Draw API의
DrawSphere
함수를 사용하여 감쇠 최소 거리와 감쇠 음소거 거리를 나타내는 2개의 스피어를 드로합니다. 두 번째DrawSphere
호출의Radius
는AttenuationMinDistance
와AttenuationFalloffDistance
의 합계로 설정되어야 합니다. 감쇠는 감쇠 최소 거리의 반경 밖에서만 시작되기 때문입니다.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)
-
Verse 파일의
OnBegin()
함수에서DrawAudioDeviceRange()
함수를 호출합니다.OnBegin<override>()<suspends>:void= DrawAudioDeviceRange(DebugAttenuationMinDistance, DebugAttenuationFalloffDistance)
-
Verse 코드를 빌드합니다. Verse 장치의 디테일 패널에서 DebugAttenuationMinDistance 및 DebugAttenuationFalloffDistance의 값을 설정해야 합니다. 이러한 값들은 오디오 플레이어 장치의 감쇠 최소 거리(Attenuation Min Distance) 및 감쇠 음소거 거리(Attenuation FalloffDistance) 값을 100으로 곱한 결과와 동일해야 합니다.
오디오 플레이어 장치는 감쇠 최소 거리 및 감쇠 음소거 거리에 미터를 사용합니다. Debug Draw API는 센티미터를 사용하므로 값을 변환해야 합니다.
-
전체 스크립트
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)