블루프린트 디버깅은 에디터에서 플레이(Play In Editor, PIE ) 또는 에디터에서 시뮬레이션(Simulate In Editor, SIE ) 모드 도중 게임 실행을 일시 정지할 수 있는 강력한 기능입니다. 디버깅할 때 중단점(Breakpoint)을 사용하여 블루프린트 또는 레벨 블루프린트의 그래프를 단계별로 살펴볼 수 있습니다.
디버깅 컨트롤
블루프린트 디버거(Blueprint Debugger)는 PIE 및 SIE 세션 중에 게임 실행을 제어합니다. 게임이 실행되면 툴바에서 컨트롤이 활성화됩니다. 디버깅하는 블루프린트의 종류와 디버깅 세션의 현재 스테이트에 따라 다른 디버깅 컨트롤이 표시됩니다. 중단점 에 도달했을 때처럼 필요한 경우에만 활성화되는 컨트롤도 있습니다.
블루프린트 에디터(Blueprint Editor) 창 메뉴에서 열 수 있는 디버그(Debug) 탭과 블루프린트 디버거 는 PIE 또는 SIE 모드가 활성화되면 컨텍스트에 따라 디버깅 버튼을 표시합니다.
디버깅 활성화
블루프린트 디버깅을 활성화하려면, 먼저 디버깅하려는 레벨 내의 블루프린트 인스턴스를 지정해야 합니다.
블루프린트에서 디버그 오브젝트(Debug Object) 드롭다운 메뉴를 클릭한 다음 디버거에서 보려는 인스턴스를 선택합니다.
오브젝트를 선택한 후에는 돋보기 아이콘을 클릭하여 레벨의 해당 오브젝트로 점프할 수 있습니다.
블루프린트를 다른 창에 띄운 상태로 에디터에서 작업하면 스크립트를 실행할 때 '활성 와이어(Active Wires)'가 진동하는 것을 볼 수 있습니다.
위 예시에는 폰의 컨트롤러에 무브먼트를 추가하기 위해 블루프린트에서 함수를 호출하는 두 개의 입력 축 이벤트가 있습니다. 왼쪽 창에서 게임이 시작될 때 스크립트가 실행되는 것을 볼 수 있습니다(진동하는 와이어가 빨간색 InputAxis Event 노드를 떠나 Add Controller 입력 노드로 들어감).
중단점
중단점 은 블루프린트 그래프 노드에 배치할 수 있는 마커입니다. 중단점을 가진 노드를 PIE나 SIE 모드에서 실행하려고 하면 게임이 일시 정지되고 개발자는 블루프린트 에디터의 그래프 뷰를 통해 노드 위치로 이동됩니다. 이를 통해 변수의 값을 확인하고 블루프린트의 실행 흐름을 살펴볼 수 있습니다. 블루프린트의 모든 중단점은 디버그 탭 에 표시되며, 선택하면 블루프린트의 그래프 내에서 볼 수 있습니다. 노드에 중단점을 배치하려면 노드를 우클릭하고 컨텍스트 메뉴에서 중단점 추가(Add Breakpoint) 를 선택합니다. 그러면 노드의 좌측 상단에 빨간색 팔각형이 나타납니다. 노드를 다시 우클릭하거나 디버그 탭의 중단점 항목을 우클릭한 뒤 중단점 제거(Remove Breakpoint) 명령을 선택하면 중단점을 삭제할 수 있습니다.
이 중단점은 Jump 노드가 실행될 때 게임을 중단시킵니다.
중단점을 제거하지 않고 일시적으로 비활성화하려면 블루프린트 노드 자체를 우클릭하거나 디버그 탭의 중단점 항목을 우클릭한 뒤 컨텍스트 메뉴에서 중단점 비활성화(Disable Breakpoint) 를 선택합니다. 중단점을 비활성화하면 빨간색 팔각형에 외곽선이 표시됩니다. 비활성화된 중단점은 실행되지 않지만 쉽게 다시 활성화할 수 있습니다. 이 프로세스는 중단점을 반복적으로 삭제하고 다시 만드는 것보다 편리하며, 사람의 실수에도 덜 취약합니다.
이 중단점은 비활성화되어 현재 실행되지 않지만 필요하면 쉽게 다시 활성화할 수 있습니다.
비활성화한 중단점을 다시 활성화하려면 노드를 우클릭 하고 중단점 활성화 를 선택하거나, 디버그 탭에서 중단점 옆에 있는 아이콘을 클릭합니다. 또는, 디버그 탭에서 중단점을 우클릭 한 다음 중단점 활성화 를 선택해도 됩니다. 중단점은 디버깅 세션을 진행하는 과정을 포함해 언제든지 활성화 및 비활성화, 또는 제거할 수 있습니다. 중단점은 프로젝트 .ini 파일에 저장되므로 에디터 세션 간에 유지됩니다.
유효하지 않은 위치에 중단점을 배치하면 느낌표와 함께 노란색으로 표시됩니다. 경우에 따라 블루프린트를 컴파일하면 문제가 해결되기도 합니다. 그렇지 않은 경우 중단점 아이콘 위에 마우스 커서를 놓으면 설명이 표시됩니다.
이 중단점은 유효하지 않으며 도달이 불가능합니다. 경우에 따라 블루프린트를 리컴파일하면 문제가 해결되기도 합니다.
중단점으로 실행을 일시 정지하면 에디터에서 노드가 강조 표시되며 초점이 맞춰지고 커다란 빨간색 화살표가 나타납니다.
이 중단점에 도달하여 실행이 일시 정지되었습니다.
감시값
감시값(Watches) 은 디버깅 세션 중 빠른 레퍼런스를 위해 블루프린트 노드 핀 값을 추적합니다. 핀에는 핀을 포함하는 노드가 실행된 가장 최근 시간에 계산된 값이 있습니다. 핀 감시를 시작하려면 블루프린트 그래프에서 핀 이름을 우클릭하고 컨텍스트 메뉴에서 이 값 감시(Watch this value) 를 선택합니다. 이미 감시 중인 핀이라면 컨텍스트 메뉴에 이 값 감시 대신에 이 값의 감시를 중단합니다(Stop watching this value) 가 표시됩니다.
아직 노드가 실행되지 않은 핀은 디버깅 정보를 이용할 수 없습니다. 이 경우 데이터 값이 아니라 해당 내용을 알려주는 메시지가 표시됩니다. 그 이유는 노드가 기반 코드를 최소 한 번은 실행해야 핀의 값이 업데이트되므로 노드가 최소 한 번 실행될 때까지는 값이 유효하지 않기 때문입니다. 블루프린트 변수 노드도 코드를 실행해야 변수 값을 얻을 수 있고, 이 과정은 다른 노드가 해당 변수의 출력 값에 액세스를 시도할 때에만 이루어집니다.
디버그 창 및 블루프린트 디버거
디버그 창에는 중단점, 감시값, 현재 코드 실행 추적 스택이 표시됩니다. 이 창은 중단점을 사용하는 동안 코드를 중지 및 재개하거나 단계별로 살펴볼 수 있는 실행 컨트롤도 제공합니다. 여러 탭을 통해 전체 실행 콜 스택과 중단점, 감시, 특정 블루프린트 인스턴스의 콜 스택 정보를 볼 수 있습니다.
감시창
블루프린트 감시창(Blueprint Watch Window) 은 보고 싶은 데이터에 대한 액세스를 제공하여 디버깅 속도를 높여줍니다. 에디터에서 열며 현재 콜 스택의 일부이기도 한 블루프린트 클래스를 감시할 수 있습니다. 실행이 일시 정지되면 현재 데이터가 들어 있는 종합 콜 스택을 볼 수 있습니다. 쉽게 다른 블루프린트로 이동하여 프로퍼티 값과 노드 출력을 확인할 수도 있습니다. 이 뷰는 배열, 세트, 맵 및 기타 데이터 구조의 확장을 지원하므로 포함된 모든 데이터를 빠르고 편리하게 면밀히 검사할 수 있습니다. 노드 이름(Node Name) 열의 항목을 클릭하여 블루프린트 클래스의 해당 노드로 이동하거나 오브젝트 이름(Object Name) 열의 항목을 선택하여 특정 인스턴스를 선택할 수도 있습니다.
콜 스택
디버깅 세션에 사용할 수 있는 콜 스택(Call Stack) 은 C++ 개발 환경의 일반적인 콜 스택과 비슷한 개념을 가지고 있습니다. 콜 스택은 블루프린트 비주얼 스크립팅 함수와 네이티브(C++) 코드 함수 사이의 실행 플로를 보여줍니다. 현재 실행 중인 블루프린트 비주얼 스크립팅 함수는 스택 맨 위에 표시됩니다.
블루프린트 매크로는 콜 스택에 표시되지 않습니다. 대신 호출된 함수의 일부로 나타납니다.
위의 블루프린트 함수는 특정 클래스의 모든 액터를 가져오고 컴포넌트를 비활성화합니다. 중단점은 함수 끝에 설정되었습니다.
중단점에 도달하면 콜 스택은 현재 연산 중인 함수를 나열하며, 가장 위의 현재 함수부터 아래의 호출 함수 순서입니다. 즉, 각 줄의 항목에는 함수의 이름이 쓰여 있고, 바로 아래에는 해당 함수를 호출한 함수가 있습니다. 반복적(자기 호출) 함수의 경우 하나의 행에 동일한 함수 이름이 여러 번 나타날 수도 있습니다.
이 콜 스택은 위에 나와 있는 것처럼 플레이어가 커스텀 함수 'FindActorPressed'를 눌렀을 때 3인칭 캐릭터의 이벤트 그래프에 대한 호출을 보여줍니다. 이는 원래 액터의 블루프린트 이벤트 그래프에서 호출되었으며, 네이티브 코드의 플레이어 입력 컴포넌트에서 호출된 FindActorPressed 액션 매핑 이벤트에 응답했습니다.
콜 스택을 표시하거나 숨기려면 블루프린트 디버거 를 우클릭한 다음 드롭다운에서 콜 스택 을 선택합니다.
블루프린트 호출 스택은 C++ 호출 스택에서 검사하는 것이 지루할 수 있습니다. IDE에서 블루프린트 호출 스택 스냅샷을 얻으려면, 중단점에서 멈췄을 때 Immediate 창에서 {,,UnrealEditor-Core}::PrintScriptCallstack() 을 호출하면 됩니다. 에디터 빌드에서만 작동합니다.
실행 추적
실행 추적(Execution Trace) 스택은 실행된 노드의 목록을 표시하며, 가장 최근에 실행된 노드가 맨 위에 표시됩니다.
이 목록은 디버깅 시 그래프를 단계별로 수행하는 과정에서 업데이트됩니다.