[UE5] TIL : UE에서의 C++ 와 Blueprint

Jaeyoung Ko·2025년 3월 13일

1) 배경


언리얼 엔진 자체는 C++로 개발되었으며, 엔진의 핵심 기능들이 C++ API로 제공된다. 언리얼 엔진의 기능을 활용하기 위해서는 당연하게도 기본적으로 스크립팅을 하는 데에 C++ 에 대한 이해는 필수적이다.

그런데 UE4부터 비주얼 스크립팅 시스템으로서 Blueprint 기능을 UE가 제공해주면서 게임 개발의 접근성을 크게 향상시키는 방향으로 핵심에 자리잡게 되었다.

UE에 대한 학습을 진행하고, 또 프로젝트를 진행하면서 그렇다면 이러한 의문이 생기지 않을 수가 없다.

C++ 와 Blueprint, 둘의 차이는 무엇이고, 언제 어떠한 것에 대한 개발을 둘 중 어느 것을 선택하여 작업해야 하는 것인가?

이러한 질문의 답을 검색과 나의 경험 상의 내용으로 정리해보고자 한다.



C++ vs Blueprint

<1> C++

C++ 는 컴파일 언어로 실행 시 기계어로 직접 변환되어 빠른 실행 속도를 가진다.

게임 플레이 클래스를 생성하면 Visual Studio나 다른 IDE로 컴파일 시 변경사항이 UE에 반영된다.


<2> Blueprint

블루프린트 는 UE4 부터 지원되는 비주얼 스크립팅 시스템으로 코딩 없이 node 기반 interface를 통해 게임 로직을 구현할 수 있다.


<3> 둘의 비교

최적화 성능

C++ 를 통한 스크립팅이 가지는 가장 큰 장점은 바이너리 네이티브 컴파일을 통해 상대적으로 높은 수준으로 최적화된다는 것이 큰 장점이다.

이에 반해서 BP는 middle layer에서 이를 해석하고 실행하므로 성능적인 면에서 떨어진다.


생산성

C++ 코드 작성 변경 시에는 에디터를 꺼주고 다시 빌드하거나 라이브 코딩을 진행하게 되는데,

이 과정 속 컴파일을 통해 기계어 변환 과정에서 소모되는 시간은 블루프린트에 비해 굉장히 긴 편이다.

반면, 블루프린트의 경우 Hot Reload 기능을 통해 에디터가 열려 있는 동안 DLL 파일을 컴파일하고 로드하는 과정이 개발 시간을 크게 단축시켜준다.

뿐만 아니라, 블루프린트가 비주얼 스크립팅인 만큼 시각적으로 직관적이기 때문에 생산성이 높다고 볼 수 있다.


GIT과의 연동

언리얼 엔진 프로젝트가 사실 GIT과 상당 부분 거리감이나 적합하지 않다고 불려지는 이유 중 하나이다.

C++ 코드 변경의 경우, 다른 프로젝트를 GIT으로 협업할 때와 다름없는 반면,

Blueprint를 통한 작업 내용은 uasset으로 변환되어 잡히기 때문에,

사실 커밋 메시지로 일일이 기록하지 않는 이상 변경점을 확인하기에 너무나도 무리가 존재한다.



UE 개발 경험과 함께 내린 결론


그래서 정리해보자면 다음과 같은 결론을 내려볼 수 있다.

생산성의 BP 그리고 성능의 C++



이를 통해 나는 다음과 같은 접근법을 가지게 되었다.

1 - 핵심적인 게임 로직

2 - 최적화가 필요한 영역 : 물리 연산, 대규모 오브젝트 처리, 에셋 로딩

3 - 재사용성이 높은 액터/컴포넌트 클래스

에 대한 작업을 C++로,

1 - 특정 게임 플레이 로직, 이벤트 : ex. 레벨 입장 시 이벤트, 문 열기 등

2 - 간단한 프로토타이핑 : 빠른 테스트를 위한 심플한 샘플 테스트

3 - C++로 제작된 재사용성 높은 클래스를 상속받아서 빠르게 수정 작업

에 대한 작업은 BP로 하는 편이 좋다는 생각이다.

사실, 현재 필자는 UE 5.4를 이용 중인데,

UE 4.27에 관해서 공식 페이지에 이러한 가이드라인이 존재한다.

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/balancing-blueprint-and-cplusplus?application_version=4.27


## C++ 클래스 장점

빠른 런타임 퍼포먼스: 일반적으로 C++ 로직은 블루프린트 로직보다 훨씬 빠릅니다. 이유는 다음과 같습니다.
명확한 디자인: C++ 에서 변수나 함수를 노출하면 세밀한 제어를 통해 원하는 것을 정확히 노출할 수 있으므로, 특정 함수/변수를 보호하고 클래스의 공식 "API"를 만들 수 있습니다. 따라서 지나치게 크고 따라잡기 어려운 블루프린트를 만들지 않아도 됩니다.

광범위한 액세스: C++ 에서 정의(하고 제대로 노출)한 함수와 변수는 다른 모든 시스템에서 액세스할 수 있어, 여러 시스템 사이 정보 전달에 완벽합니다. 또한, C++ 에는 블루프린트보다 많은 엔진 함수 기능이 노출되어 있습니다.

더 많은 데이터 제어: C++ 에서는 데이터 저장과 로드 관련해서 구체적인 함수 기능을 더 많이 사용할 수 있습니다. 버전 변경 및 시리얼라이즈 처리를 다양한 사용자 지정 방식으로 처리할 수 있습니다.

네트워크 리플리케이션: 블루프린트의 리플리케이션 지원은 간단하며 작은 게임이나 고유한 일회성 액터에 사용하도록 설계되었습니다. 리플리케이션 대역폭이나 타이밍같은 것을 엄격하게 제어해야 하는 경우 C++ 를 사용해야 합니다.

강력한 연산력: 블루프린트로 복잡한 수학 연산을 하는 것은 어렵고 약간 느릴 수도 있습니다. 복잡한 수학 연산은 C++ 를 고려하세요.

쉬운 Diff/Merge: C++ 코드와 데이터는 (구성 및 커스텀 솔루션을 포함해서) 텍스트로 저장되므로, 여러 브랜치에서의 동시 작업이 쉽습니다.



## 블루프린트 클래스 장점

빠른 생성: 대부분의 경우 블루프린트 클래스를 새로 만들어 변수와 함수를 추가하는 것이 비슷한 작업을 C++ 로 하는 것보다 빠릅니다. 그래서 완전 새로운 시스템의 프로토타입을 만드는 작업은 보통 블루프린트로 하는 것이 빠릅니다.

빠른 반복처리: 블루프린트 로직을 수정하고 에디터 안에서 미리보는 것이 핫 리로드 기능이 있더라도 게임을 다시 컴파일하는 것보다 훨씬 빠릅니다. 성숙한 시스템은 물론 새로운 시스템에서도 마찬가지이므로 "미세조정" 가능한 모든 값은 가급적 애셋에 저장해야 합니다.

원활한 흐름: C++ 로 "게임 흐름"을 그려 보는 것은 복잡할 수 있으므로, 보통 블루프린트로 (또는 딱 그 용도로 설계된 비헤이비어 트리같은 커스텀 시스템으로) 구현하는 것이 낫습니다. 딜레이 및 비동기 노드는 C++ 델리게이트보다 흐름을 따라잡기 훨씬 쉽습니다.

유연한 편집: 별도의 기술 훈련을 받지 않은 디자이너와 아티스트도 블루프린트를 생성하고 편집할 수 있으므로, 엔지니어 이외에도 수정해야 하는 애셋은 블루프린트가 이상적입니다.

쉬운 데이터 사용: 블루프린트 클래스 안에 데이터를 저장하는 것은 C++ 안에 저장하는 것보다 훨씬 간단하고 안전합니다. 블루프린트는 데이터와 로직이 밀접하게 섞인 클래스에 좋습니다.
profile
안녕하세요, 고재영입니다. 언제나 즐겁게 살려고 노력합니다.

0개의 댓글