라이브 코딩

런타임 중에 게임의 바이너리를 리컴파일 및 패치합니다.

Choose your operating system:

Windows

macOS

Linux

언리얼 엔진(UE)Live++ 통합을 사용하여 라이브 코딩(Live Coding) 을 지원합니다. 라이브 코딩은 엔진이 실행 중인 동안 애플리케이션의 C++ 코드를 리빌드하고 바이너리를 패치할 수 있는 시스템입니다. 이 기능은 다음과 같은 경우 사용할 수 있습니다.

  • 언리얼 에디터에서 애플리케이션을 편집하는 경우

  • 에디터에서 플레이(PIE)로 애플리케이션을 실행하는 경우

  • 디버깅 용도로 에디터에 어태치된 애플리케이션의 패키지 데스크톱 빌드를 실행하는 경우

플레이 테스트 세션이나 에디터 작업에 방해받지 않고 C++ 클래스를 변경하고, 컴파일하고, 변경한 내용을 즉시 확인할 수 있다는 뜻입니다. 따라서 게임플레이 코드 또는 프론트엔드 사용자 인터랙션 등 C++ 런타임 로직을 사용하는 경우 반복적인 개발에 큰 도움이 됩니다. 핫 리로드(Hot Reload) 시스템을 대신 사용할 수 있기는 하지만, 라이브 코딩이 훨씬 빠르고 유연합니다.

라이브 코딩 사용법

라이브 코딩은 언리얼 엔진에 새롭게 설치되는 모든 항목에 디폴트로 활성화되어 있습니다. IDE를 열면 라이브 코딩 콘솔이 숨김 상태로 자동 시작됩니다. 콘솔이 숨겨진 경우 라이브 코딩 빌드를 시작하면 열립니다.

라이브 코딩 콘솔에 컴파일 상태가 표시됩니다.

라이브 코딩 콘솔은 컴파일 상태에 대한 출력 로그를 제공합니다. 이는 표준 출력 로그(Output Log) 와는 별개이며, 라이브 코딩 빌드 정보만 보여줍니다.

빌드를 시작하려면 IDE 또는 언리얼 엔진을 사용하는 동안 키보드에서 CTRL + ALT + F11 을 누릅니다. 빌드 상태를 표시하는 알림이 화면 우측 하단에 나타납니다. 빌드가 실행되는 동안 방해받지 않고 에디터에서 작업을 계속하거나 프로젝트를 테스트할 수 있습니다.

작업 중인 화면 우측 하단에 빌드 알림이 나타납니다.

빌드에 성공하면 코드에 따른 변경 사항이 즉각적으로 적용되는 것을 볼 수 있습니다.

라이브 코딩은 언리얼 에디터가 열려 있을 때, PIE를 사용할 때, 그리고 네이티브 데스크톱 환경에서 패키지로 만든 빌드에 어태치할 때 사용할 수 있습니다. 콘솔 및 모바일 디바이스에서 실행할 때는 사용할 수 없습니다.

라이브 코딩으로 변수의 기본값 변경하기

변수의 기본값을 변경할 경우, .cpp 파일로 구현된 생성자에서 설정한 값은 오브젝트의 기존 인스턴스에 업데이트되지 않습니다. 그러나 .h 파일에서 변경하면 변경사항이 적용됩니다.

환경설정

에디터 개인설정(Editor Preferences) > 일반(General) > 라이브 코딩(Live Coding) 에서 라이브 코딩 관련 설정을 찾을 수 있습니다.

에디터 개인설정 창의 라이브 코딩 세팅

일반 라이브 코딩 세팅

라이브 코딩의 일반 세팅은 사용 시 시스템이 작동하는 방식을 결정합니다.

일반(General) 세팅은 개발 환경에서 라이브 코딩이 작동하는 방식을 제어합니다.

세팅

설명

라이브 코딩 활성화(Enable Live Coding)

활성화하면 라이브 코딩이 언리얼 에디터의 컴파일 방식이 됩니다. 이 기능을 비활성화하면 언리얼 에디터가 핫 리로드를 다시 사용합니다.

시작(Startup)

언리얼 에디터가 시작할 때 콘솔의 활성화 또는 가시화 여부를 포함해 라이브 코딩이 작동하는 방식을 제어합니다.

리인스턴싱 활성화(Enable Reinstancing)

라이브 코딩이 오브젝트 리인스턴싱을 사용할지 여부를 제어합니다. 활성화하면 코드의 대규모 변경이 적용될 수 있도록 오브젝트의 인스턴스가 대체됩니다. 이 세팅이 꺼져 있으면 이러한 종류의 변경이 불안정해질 수 있으므로 비활성화하지 않는 것이 좋습니다. 자세한 내용은 라이브 코딩으로 오브젝트 리인스턴싱을 확인하세요.

새로 추가된 C++ 클래스 자동 컴파일(Automatically Compile Newly Added C++ Classes)

활성화하면 C++ 클래스 추가 시 자동으로 라이브 코딩이 표시되어 C++ 클래스를 컴파일하고 애플리케이션에 추가합니다.

모듈

모듈 섹션은 라이브 코딩용으로 어떤 모듈을 미리 로드할지 결정합니다.

모듈(Modules) 섹션은 에디터 또는 애플리케이션을 실행할 때 라이브 코딩용으로 어떤 모듈을 미리 로드할지 지정합니다. 이를 통해 모듈에서 반복작업 시 라이브 코딩의 퍼포먼스가 더 빨라지게 할 수 있지만, 더 많은 모듈을 미리 로드로 설정할수록 에디터나 게임이 시작되는 데 더 오랜 시간이 소요됩니다.

옵션

설명

엔진 모듈(Engine Modules)

언리얼 엔진의 소스 코드의 일부인 모듈입니다.

엔진 플러그인 모듈(Engine Plugin Modules)

엔진의 설치 디렉터리 내 플러그인과 연결되는 모듈로, Engine/Plugins에 있습니다.

프로젝트 모듈(Project Modules)

현재 프로젝트의 소스 코드의 일부인 모듈입니다. 여기에는 주요 모듈뿐만 아니라 소스 디렉터리에서 생성한 추가 모듈도 포함됩니다.

프로젝트 플러그인 모듈(Project Plugin Modules)

프로젝트의 디렉터리에 위치한 플러그인에 연결되는 모듈로, (프로젝트 이름)/Plugins에 있습니다.

엔진의 소스 코드에서 반복작업을 진행하는 중이 아닌 경우 엔진 모듈을 미리 로드하지 않아야 합니다.

이 모듈 세트 이외에도 네임드 모듈 미리 로드(Preload Named Modules) 배열을 사용하여 로드하고 싶은 특정 모듈을 선택할 수도 있습니다. 이는 대규모 프로젝트에서 몇 개의 특정한 모듈만으로 작업하거나, 전체 엔진을 로드하지 않고 특정 엔진 모듈을 로드하고 싶은 경우 유용합니다.

모듈 사용에 대한 자세한 내용은 언리얼 엔진 모듈 가이드를 참조하세요.

라이브 코딩으로 오브젝트 리인스턴싱

오브젝트 리인스턴싱(Object Reinstancing) 은 애플리케이션 및 에디터에서 오브젝트의 기존 인스턴스를 대체하는 부가 시스템입니다. 라이브 코딩을 통해 컴파일되는 코드에서의 대규모 구조적 변경사항을 오브젝트에 즉시 적용할 수 있다는 뜻입니다. 리인스턴싱된 오브젝트에는 UCLASS, UFUNCTION, USTRUCT, UENUM, UDELEGATE 매크로뿐만 아니라 블루프린트 노드와 같이 이러한 매크로를 사용하여 언리얼 헤더 툴(Unreal Header Tool) 이 생성하는 오브젝트도 포함됩니다.

오브젝트 리인스턴싱은 기본으로 활성화되어 있습니다. 오브젝트 리인스턴싱을 비활성화해도 라이브 코딩으로 변수 값 변경 또는 기존 함수의 자잘한 변경 등 작은 변경사항을 쉽게 처리할 수 있습니다. 그러나 새로운 함수, 새로운 변수 세트, 극적인 리팩터링 등 대규모 변경사항의 경우 오브젝트 리인스턴싱 없이 컴파일하려고 시도하면 예측할 수 없는 방식으로 동작할 수 있습니다. 이는 보통 크래시로 이어집니다.

그러나 오브젝트 리인스턴싱이 활성화되어 있는 경우, 포인터를 정리하기 위해 다음의 단계를 추가적으로 따라야 합니다. 코드가 리인스턴싱될 수 있는 오브젝트에 포인터를 유지하는 경우, 나중에 다시 채워질 수 있도록 ReloadReinstancingCompleteDelegateReloadCompleteDelegate 를 사용하여 포인터를 업데이트하거나 캐시를 무효화해야 합니다.

핫 리로드는 리인스턴싱된 오브젝트가 적절하지 않은 방식으로 레퍼런스 해제되는 상황을 어느 정도 허용하지만, 라이브 코딩은 에디터가 종료되면 크래시를 일으킵니다. 이는 주어진 클래스의 소멸자는 하나의 버전만 존재할 수 있기 때문이며, 정리되지 않은 오브젝트 인스턴스가 남아 리인스턴싱된 오브젝트 소멸자의 구 버전과 새로운 버전 간에 상충을 일으킵니다.