UE5

[UE5] 언리얼의 핫리로드와 라이브코딩에 대하여

Honey Badger 2023. 7. 7. 12:24

 

 

핫 리로딩(Hot Reloading)이란?

 

  에디터가 열려 있는 동안 새 DLL 파일을 컴파일하고 로드하는 과정을 말합니다. 핫 리로드는 가끔씩 잠시 동안 작동하지만 신뢰할 수 없으며 블루프린트가 손상되거나 기타 문제를 자주 발생시킵니다. (자세한 내용은 아래 참조) 그러므로 대부분의 사용자들이 핫 리로딩을 되도록 쓰지 말기를 권장합니다. 즉, 안전하게 컴파일하려면 에디터를 닫는게 좋다는 말입니다. 만약 핫 리로드가 예기치않게 시작되었다면 아무것도 저장하지 말고 편집기를 닫은 다음 IDE에서 빌드를 실행한 후 계속하면 됩니다. 핫 리로드의 장점은 어떠한 내용을 변경할 때마다 IDE에서 컴파일한 다음 에디터를 다시 열 필요가 없다는 것이었습니다. 

 

▶Tip

기본적으로, 핫리로드는 다음과 같은 경우에 시작됩니다.

  • 프로젝트/언리얼 에디터를 연 상태에서 IDE에서 컴파일. (여기서 IDE란 비주얼스튜디오, XCode 같은 통합개발환경을 의미)
  • 언리얼 에디터 내의 컴파일 버튼을 사용하여 컴파일.
  • 언리얼 에디터 내부에서 새 C++ 클래스 만들기. ※에디터 환경설정에서 Automatically Compile Newly Added C++ Classes 옵션 변경을 통해 이 기능을 사용하지 않도록 설정할 수 있습니다.

 

핫리로드시 손상이 발생하는 이유는 무엇일까?

  에디터 열기로 에셋을 완전히 다시 로드할 수 없으므로 에셋 마스크가 임시로 생성됩니다. 바로 여기서 문제가 발생하게 되는데, 만약 에셋을 핫리로드한 후 저장하면 에셋 디렉터리, 자격 증명 및 콘텐츠가 핫리로드된 콘텐츠로 변경됩니다. 

 

 

핫 리로드의 제한 사항

   언리얼엔진 매크로 내에서 정의를 변경하고 핫 리로드를 수행하면, 생성된 코드 자체가 정상입니다. 그러나 해당 클래스를 참조하는 에디터의 에셋은 처음부터 로드되지 않습니다. 결과적으로 변경된 크랠스에서 파생되거나 참조되는 에셋은 잠재적으로 다음과 같습니다:

  • 값 손실_ C++의 클래스 기본값으로 리셋됩니다.
  • 블루프린트 에디터 내부의 손상된 함수/핀 가져오기
  • 손상된 포인터 변수 가져오기

 

  HOTRELOADED_Classes를 가져옵니다. 파일이 손상되지 않은 경우 에디터를 다시 시작하여 문제를 해결할 수 있습니다. VCS/에셋 재작성만이 유일한 방법인 손상된 상태로 끝납니다.

 

 

 

 

라이브 코딩(Live Coding)이란?

 

   라이브 코딩은 4.22버전에 새로 도입된 기능으로, 핫 리로드를 대체하기 위한 시스템으로 만들어졌습니다. 언리얼 5에 접어들면서 기본적으로 이 방식을 사용하도록 변경되었습니다. 이 방식을 사용할 경우 .cpp 파일 내의 대부분의 기능을 수정하는 데 신뢰할 수 있으며, 게임 플레이 중에도 안전하게 사용 가능합니다. 핫리로드와는 달리 저장 시 블루프린트가 손상되지도 않습니다. Ctrl+Alt+F11 키를 눌러 라이브 코딩 빌드를 시작할 수 있습니다. 

 

라이브 코딩 사용법

  • 일반적으로 헤더파일 내용을 편집하려면 에디터를 닫아야 합니다.
  • .cpp 파일의 생성자 함수를 편집하려면 에디터를 닫아야 합니다.

 

 

심화 내용

   Editor Startup에서 클래스와 에셋들은 UMACRO(UCLASS, UPROPERTY, UFUNCTION, USTRUCT, UENUM)에서 CDO(Class Default Objects) 설정으로 로드합니다. 여기에는 다음이 포함됩니다.

  • 클래스, 멤버 및 기능 선언.
  • 생성자, 소멸자 및 명령 집합.

 

  U가 아닌 함수, 프로퍼티, 클래스와 같이 매크로로 묶이지 않은 요소의 변경 사항은 핫리로드 또는 라이브 코딩을 사용하여 다시 로드될 수 있습니다. 

 

  위에서 언급한 바와 같이, C++과 블루프린트가 혼합된 프로젝트와 UMACRO 및 해당 CDO에 의해 래핑된 콘텐츠를 수정하지 않는 변경 사항이 있는 핫리로드에 대한 유효한 워크플로우가 있습니다. 

 

  UHT(Unreal Header Tool)에 의해 스캔되는 헤더 파일의 변경은 피해야 합니다. 따라서 UCLASS/USTRUCT/UENUM 유형 레이아웃/시그니처에 대한 변경 사항은 현재 이러한 시스템에서 처리해서는 안됩니다. 일반적으로 구현에만 해당하는 변경사항(.cpp)은 정상입니다. UCLASS/USTRUCT 생성자에 대한 변경 사항은 이미 생성된 인스턴스에 소급 적용되지 않으므로(CDO는 다시 인스턴스화 되지 않음) 에디터를 닫고 전체를 다시 컴파일로 수행하는 것이 좋습니다. 

 

   라이브 코딩을 사용하여 잠재적인 손상을 보호할 것을 제안합니다. 또한 핫리로드는 레거시(Legacy) 기능으로 간주됩니다. 이 두 시스템 모두 CDO 관련 생성 코드를 업데이트할 때 동일한 제한 사항에 직면합니다. 

 

 

 

다음은 라이브 코딩 작업과 관련된 몇 가지 중요한 정보입니다:

  • CDO 로드 기본값은 무시되지 않습니다.
  • 메모리 패치를 통해 변경 사항을 반복합니다. 라이브 코딩을 사용하고 IDE 내에서 컴파일을 누른 프로젝트를 닫으면 실제로 코드 변경 내용이 컴파일됩니다. 
  • 라이브 코딩을 활성화하면 IDE가 핫 리로드를 시작할 수 없습니다.
  • UE4 타입/매크로를 포함하는 헤더를 변경하는 경우 헤더가 완전히 처리되지 않습니다. 이로 인해 이상한 버그가 발생할 수있지만 데이터 손상은 발생하지 않습니다. 수정하려면 에디터를 닫고 IDE에서 컴파일한 다음 다시 시작하면 됩니다.

 

 

 

 

문제 해결

핫 리로딩 후 적절한 빌드를 위해,

 

엔진을 닫고 IDE에서 Clean Command와 Build를 차례로 실행합니다. Corruption을 처리하기 위해서는 먼저 적절한 재 빌드를 실행해야 합니다. 

 

HOTRELOADED_Classes / Invalid 변수 Corruption / Invalid Class Corruption

 

먼저 에디터를 다시 시작해 보시기 바랍니다. 때로는 링커가 이를 수정하기에 충분할 수 있습니다. 

 

Invalid Variable Corruption의 경우 변수 주석 처리, 컴파일, 엔진 열기, 닫기, 주석 처리 및 재 컴파일 작업이 충분했던 경우가 있습니다. 

 

경우에 따라 이 문제를 처리하는 것이 손상된 UAssets 세트와 동일할 수 있습니다. 

 

 

 

손상된 UAssets

 

   불행히도 손상된 UAsset의 경우 일반적으로 소스 제어에서 이전 버전을 복원하거나 클래스를 다시 만드는 두 가지 방법만 있습니다. 핫리로드 에셋, 특히 블루프린트가 손상되는 경우가 많습니다. 블루프린트 클래스가 복구할 수없을 정도로 핫리로드된 경우 쉽게 감지할 수 있는 방법은 this가 nullptr인 상태에서 충돌하는 것입니다. 이 문제를 해결하려면 IDE에서 디버깅 모드로 엔진을 시작합니다. 

 

 

워크플로우

 

   혼합 개발 방식을 사용하는 프로젝트의 경우 다음 워크플로우가 권장됩니다. 

1. CDO 수정과관련된 모든 변경 사항에 대해 에디터를 닫고 IDE에서 컴파일 한 후 재시작.

2. CDO 와 관련이 없는 코드에 대한 작은 반복 변경을 위해 라이브 코딩이 제공됩니다. 

 

 

 

 

<영어 원문>

 

https://unrealcommunity.wiki/live-compiling-in-unreal-projects-tp14jcgs

 

Hot Reload and Live Coding | Unreal Engine Community Wiki

Compiling with the Editor Open Do's and Don'ts

unrealcommunity.wiki

 

 

 

'UE5' 카테고리의 다른 글

[UE5] Enhanced Input System  (0) 2023.07.07
[UE5] UProject 파일이 제대로 실행되지 않을 때 해결법  (0) 2023.07.07