스크립트 디버그

## 학습 과정 소개

디버그 기능을 통해 스크립트를 디버깅하는 방법에 대해 알아봅니다.

## 중단점(Breakpoints)

스크립트 디버깅의 시작은 중단점 설정에서 시작됩니다. 이상이 발생하거나, 오작동의 원인으로 의심되는 코드 라인에 중단점을 설정 또는 해제하는 방법을 알아봅니다.

### 중단점 아이콘

중단점 설정 상태에 따라 아이콘이 다르게 나타납니다.

[{"아이콘":"[png](176913580734767ac0b2e5a3e489e8807eeee7f71b71d)","이름":"기본 중단점","설명":"다른 설정이 없는 기본 상태의 중단점입니다."},{"아이콘":"[png](17691358242156cae38288cdd453ca60837ace0875254)","이름":"조건부 중단점","설명":"BreakPoints에서 조건식을 입력한 상태의 중단점입니다."},{"아이콘":"[png](1769135835041aebe496d7e2144f0ae477332b7054478)","이름":"코드 계속 실행 중단점","설명":"BreakPoints에서 코드 계속 실행을 설정한 상태의 중단점입니다."},{"아이콘":"[png](1769135859948681fdb075cef4ee7ab4fed9f2f4d4ebd)","이름":"중단점 비활성화","설명":"비활성화된 중단점입니다."},{"아이콘":"[png](1769135881421982425439c154f54a9f5db45be1c38a6)","이름":"코드 계속 실행 중단점 비활성화","설명":"조건식과 코드 계속 실행이 설정된 상태의 비활성화된 중단점입니다."}]

### 중단점 설정

스크립트 에디터에서 디버깅하려면 가장 먼저 중단점을 설정해야 합니다. 중단점은 원하는 코드 라인에 F9 키를 눌러 설정할 수 있습니다. [png](163705967832018b0bcb305064e1ab0588a93b33ded86) <코드 라인을 선택한 후 F9 키를 누르면 좌측에 중단점 [png](163452037264550d6cc9a394d421686b324e622531625)이 나타납니다.>

### 중단점 해제

중단점이 설정된 코드 라인을 선택하고 다시 F9 키를 누르면 중단점이 해제됩니다. 중단점이 해제되면 디버그 모드로 실행 시 해당 지점에서 게임이 멈추지 않습니다. [png](1637059714014a97f7af47e9e448687ce6993a387d639)

### 중단점 편집

디버그를 시작했거나 종료한 이후 등 언제든 중단점을 편집할 수 있습니다. 디버그 실행 상태와 관계 없이 편집된 내용은 유지됩니다. 중단점은 마우스 오른쪽 버튼을 클릭해 BreakPoint Settings 창을 열고 편집할 수 있습니다.

[png](177319929868794f98eef19be40fb98fbc36f88291b3a)

[{"번호":"!","이름":"Enabled(활성화 여부)","설명":"중단점 활성화 여부를 설정할 수 있습니다. 체크 박스 해제 시 비활성화 되며, 중단점은 유지되지만 실제로 동작하지 않게 됩니다."},{"번호":"!","이름":"Condition(조건식)","설명":"지정한 조건식이 true일 때만 중단점에서 멈추도록 설정할 수 있습니다.예를 들어, x>1로 조건식을 입력하면 변수 x가 1보다 클 때 중단점이 활성화됩니다."},{"번호":"!","이름":"Hit Count(적중 횟수)","설명":"중단점이 지정된 횟수만큼 적중되었을 때만 실행을 멈추도록 설정할 수 있습니다. 숫자나 식으로 입력할 수 있습니다. 식을 사용할 경우 연산자(>=, >, <=, <, ==, %)를 사용할 수 있습니다."},{"번호":"!","이름":"Log Message(로그 메세지)","설명":"로그 메시지는 log() 함수와 동일하게 사용할 수 있습니다.예를 들어, 변수 x의 값을 출력하고 싶을 때는 \"x= \", x 로 설정하면 log(\"x= \", x)와 동일하게 동작합니다. 디버깅 시 출력되는 로그는 [Breakpoint Log] 머릿말과 함께 출력됩니다."},{"번호":"!","이름":"코드 계속 실행","설명":"코드 계속 실행을 활성화하면 중단점에 도달하더라도 월드가 계속 실행됩니다. 로그 메시지를 입력했을 때만 사용할 수 있습니다."}]

> Tip Condition과 Hit Count가 함께 설정된 경우, Condition을 먼저 평가합니다. Condition이 true일 때만 Hit Count가 증가하며, 지정된 Hit Count의 조건을 만족해야 중단점 또는 로그 출력이 최종적으로 동작합니다.

#### Hit Count 연산자

다양한 연산자를 사용해 크리에이터가 원하는 적중 횟수 조건을 세밀하게 조정할 수 있습니다. Hit Count에서 활용 가능한 연산자는 6가지입니다.

  * `>=`, `>`, `<=`, `<`, `==`, `%`



[{"예시":"5, >= 5","설명":"5번째부터 실행을 매번 멈춥니다."},{"예시":"> 5","설명":"6번째부터 실행을 멈춥니다."},{"예시":"<= 5","설명":"1 - 5번째에서만 실행을 멈춥니다."},{"예시":"< 5","설명":"1 - 4번째에서만 실행을 멈춥니다."},{"예시":"== 5","설명":"5번째 적중 때만 실행을 멈춥니다."},{"예시":"% 5","설명":"5의 배수만큼 적중될 때마다 멈춥니다. (5, 10, 15...)"}]

### 중단점 비활성화

중단점을 비활성화할 때는 마우스 왼쪽 버튼을 클릭합니다. 비활성화된 중단점은 [png](1769135859948681fdb075cef4ee7ab4fed9f2f4d4ebd), [png](1769135881421982425439c154f54a9f5db45be1c38a6) 로 표시되며, BreakPoint Settings 창에서 활성화할 수 있습니다.

> Tip. 마우스 왼쪽 버튼을 2번 누르면 중단점이 해제됩니다.

### 중단점 관리

중단점을 여러 라인, 여러 스크립트에 설정하다 보면 내가 어디에 중단점을 설정했는지, 불필요한 중단점이 아직 남아있는지 확인이 어려울 때가 있습니다. 이때 Breakpoints 패널을 통해 설정된 모든 중단점을 확인할 수 있습니다. 내비게이션 메뉴의 Panels - Debug - Breakpoints를 클릭해 엽니다. [png](16875077319895fd3c24546fb466abb6f59901a6fd11d)   
Breakpoints 패널에서는 스크립트 이름과 함수명, 라인 정보를 제공합니다. [png](16370597948003bc1552ec1b4445ebb17f3c2e15f2989)

[{"목록":"Entry","설명":"중단점이 설정된 스크립트 컴포넌트 또는 스크립트 로직과 같은 스크립트 이름"},{"목록":"Method","설명":"Entry 내 중단점이 설정된 Method 이름"},{"목록":"Line","설명":"Method 내 중단점이 설정된 라인 위치"}]

Breakpoints 패널에서는 중단점이 설정된 위치를 조회하는 것뿐만 아니라 각 중단점의 삭제 또는 중단점이 설정된 위치로 이동할 수 있습니다.

### 중단점으로 이동

중단점 목록을 더블 클릭하거나, 콘텍스트 메뉴에서 Move를 클릭해 해당 중단점 위치로 이동할 수 있습니다. [png](1637059803373a398dd6a85c944c8bb9223a41618be5d)

### 중단점 삭제

삭제하려는 중단점의 콘텍스트 메뉴에서 Remove를 클릭해 중단점을 삭제합니다. [png](163705981310639ae31b71811480d9462f92fd1c649dc)

## 디버그

스크립트에 중단점을 설정했으면, 디버그 모드로 월드를 실행해 코드를 파악합니다.

### 디버그 시작

디버그는 [디버그 시작/중지] 버튼 [png](163453034389022f3433c55154836a7b16c2f001ec1b2)을 눌러 시작할 수 있습니다. [png](1769515771503d8b1d1a67a584d88aa17c7df2e8f7ee7)   
디버그를 시작하면 게임 시작했을 때와 똑같이 플레이되지만, 중단점이 설정된 코드가 실행될 때 플레이가 정지되며 코드의 상태를 파악할 수 있습니다. [png](16370598223453b36967cfad54068bffdf7debc0505f0)

### 코드 파악

디버깅 중 각 변수나 프로퍼티에 할당된 값을 확인할 수 있습니다. [png](1634524682293d425b6b49f234132a341a80cdc17a080) Watch Expression 같은 툴을 활용해 할당된 값을 상세히 알아볼 수 있습니다. 간단하게는 실행된 코드 라인의 변수나 프로퍼티에 마우스 오버하면 툴팁으로 할당된 값, 실행 공간, 타입 등을 확인할 수 있습니다. [png](1637060082729c78d3fca6cb940dd81255e820ec4ea9f) (예: 매개 변수로 받은 delta의 값이 무엇인지 확인할 수 있습니다.)

### 디버깅 중지

[디버그 시작/중지] 버튼 또는 [시작] 버튼을 눌러 중지할 수 있습니다. [png](1769515795914e30f405130b04c13a36ffc897f13a8cb)

### 디버깅 중 코드 실행

중단점을 설정한 코드를 확인했을 때 문제가 없다면, 혹은 해당 코드 아래 줄의 상태도 함께 확인하고 싶다면 어떻게 해야 할까요? 확인하고자 하는 모든 코드 라인에 중단점을 설정할 수도 없고, 매번 디버그 시작/중지를 반복하며 중단점 설정 해제를 반복하는 것도 비효율적입니다. 디버깅 중 중단점에서 플레이가 멈춘 뒤, 중단점이 설정된 라인 이후로 코드를 실행하는 방법이 있습니다. 프로시저 단위 실행, 한 단계씩 코드 실행 등을 통해 단위별로 코드를 실행하며 코드의 상태나 흐름을 파악할 수 있습니다. 단위별 코드 실행은 디버그가 시작되면 디버그 시작/중지 버튼 옆에 각 버튼이 노출됩니다. [png](17695158074742cea6a4314164861a17aa6f632d4a924)

[{"버튼":"[png](163531428695222092623c5ee4bbdb6c765b0257765d4)","기능":"다음 중단점까지 이동","단축키":"F5","설명":"현재까지 실행된 라인에서 다음 중단점이 있는 코드 라인까지 실행합니다."},{"버튼":"[png](16353142973766005f7a18f6241e0853fcdb4b117d794)","기능":"프로시저 단위 실행","단축키":"F10","설명":"코드를 한 줄씩 실행합니다.포커싱 된 라인에 함수가 있을 때, 함수를 실행한 것으로 간주하고 다음 줄로 넘어갑니다."},{"버튼":"[png](1635314349045496e747d90b649a7aa14b0fb1388f0af)","기능":"한 단계씩 코드 실행","단축키":"F11","설명":"프로시저 단위 실행과 같이 코드를 한 줄씩 실행하지만, 포커싱 된 라인에 함수가 있을 때, 해당 함수 내부로 들어가 함수 내 코드를 한 줄씩 실행합니다."},{"버튼":"[png](163531436027902cc8e8685d04d26a2a7d6659e0ed05d)","기능":"프로시저 나가기","단축키":"Shift + F11","설명":"현재 실행 중인 함수 호출을 완료하고, 해당 함수를 호출한 위치로 이동합니다."}]

## Watch Expression

마우스 오버를 이용해 변수나 프로퍼티의 값을 확인하는 방법은 간편하게 값을 하나씩 확인하기엔 편리하지만, 코드가 한 줄씩 실행될 때마다 특정 변숫값이 어떻게 변하는지 알고 싶을 때는 계속 마우스를 올려 확인해야 하므로 상당히 불편합니다. 프로퍼티/함수 내부나 선언된 변수를 Watch Expression에 등록한 후, 코드가 실행될 때마다 값을 추적하면 매우 편리합니다.   
내비게이션 메뉴의 Panels - Debug - Watch Expression를 클릭해 엽니다. [png](16875080353841809a26bb9494dbc9cc9bf775f4ff075)   
디버깅 중 값을 알고자 하는 변수나 프로퍼티 명을 Add Expression에 작성합니다.

> Tip. 현재 포커싱 되어있는 함수에서 선언된 변수의 경우 변수 이름을, 프로퍼티의 경우에는 self.프로퍼티 명 형식으로 등록합니다.

[png](163531441012044c1f499c222457c8428da2cff7ffeb4)

Watch Expression에 변수나 프로퍼티가 등록되면, 코드를 한 줄씩 실행하며 다음과 같이 값의 변화를 추적할 수 있습니다.

[{"함수 내 코드 실행 전":"- 디버깅 시작해서 중단점이 설정된 NewMethod3함수의 첫 번째 라인에 포커싱.\- NewMethod3 함수의 매개 변수로 \"Debug12\"를 받음.\- 변수 text는 아직 선언되지 않음.\- Property는 초깃값 0이 할당.","함수 내 코드 실행 후":"- F11을 통해 4번째 줄까지 코드 실행.\- 변수 text 선언 및 \"Debug123\" 할당.\- Property 값에 1을 더함."},{"함수 내 코드 실행 전":"[png](16370600155057ca13181b27649018ee5ba886944a710)","함수 내 코드 실행 후":"[png](16370600271603294fb67b3024471b88820dda2b0b976)"},{"함수 내 코드 실행 전":"[png](163531445300862c1a06ecc354207b15e5206b731a731)","함수 내 코드 실행 후":"[png](1635314465563af8446e05b504689aa99b9ee139f7e54)"}]

## Call Stack

콜스택은 현재 디버깅 중인 함수가 어디서부터 호출되었는지를 확인하는 데 사용됩니다. 내비게이션 메뉴의 Panels - Debug - Call Stack를 클릭해 엽니다. [png](168750821078566a306d100c6405e8845e38ba39689a8)

다음과 같이 `OnBeginPlay` 함수를 시작으로 `Method1`, `Method2`를 거쳐 `Method3`을 호출하는 스크립트에서 `Method3` 내부를 디버깅 중이라 했을 때, Call Stack을 이용해 `Method3`까지 호출된 순서와 실행 공간을 확인할 수 있습니다. [png](16353144857503a4fa032527a41bd85f26876272b25a1)