[UE] 언리얼 엔진 5 블루프린트 vs C++ 언제 어떤 걸 사용하는 게 좋을까? - 1편
엔진의 여러 시스템이 블루프린트와 C++ 사용을 중심으로 설계되었기 때문에 어떤 언어를 사용해야 할지 불분명할 수 있음. 언리얼 엔진의 블루프린트와 C++를 살펴보고, 각 언어의 장점과 어떻게 사용하면 더 효과적일지 알아본다.
기능을 개발할 때, C++와 블루프린트 중 어떤 걸 사용할지 선택을 언제 해야할지 알아보자.
언리얼 엔진을 처음 사용할 때는 가장 익숙한 프로그래밍 언어를 고수하고 프로젝트에 그 언어만 사용하고 싶을 수 있음. C++와 블루프린트의 이상적인 사용 사례를 알면 보다 균형 잡힌 프로젝트 개발 주기를 만들 수 있음.
그 전에 먼저 언리얼 엔진의 C++와 블루프린트에 대한 개괄적인 개요를 살펴본다.
블루프린트
언리얼 엔진의 노드 기반 프로그래밍 언어. 변수, 함수, 이벤트를 클릭하고 드래그하여 액터 안에 기능을 생성하면 됨. 이러한 함수와 이벤트를 사용하면 다른 블루프린트 액터 간에 데이터를 전달하고 통신할 수도 있음.
C++와 구분되는 자체 언어가 아니며, 블루프린트를 C++로 변환하는 별도의 프로세스인 가상 머신 레이어에서 실행됨. 즉, 노드 기반 C++ 프로그래밍 방식.
IDE를 열지 않고도 코드를 빠르게 프로토타이핑할 수 있으므로 아이디어를 더 빠르게 반복한 다음 나중에 블루프린트를 C++ 코드로 변환할 수 있음.
커스텀 C++ 함수, 이벤트 또는 변수를 블루프린트에 노출하여 프로그래머가 아닌 사람도 C++ 유틸리티를 사용할 수 있도록 할 수 있음.
프로그래밍 방법을 몰라도 프로젝트에 필요한 더 작고 가벼운 코드를 빠르게 작성할 수 있음.
다양한 클래스와 함께 사용할 수 있음. 게임모드, 게임 스테이트, 캐릭터, 폰 등 다양한 클래스에 사용할 수 있고, 컴포넌트나 매크로 및 함수 라이브러리를 사용하면 기능을 쉽게 재사용할 수 있음.
프로그래밍에 익숙하지 않은 개발자도 쉽게 접근할 수 있음.
샘플 게임 프로젝트인 라이라 스타터 게임(줄여서 라이라)에서는 플레이 가능한 캐릭터, 탄약 픽업 및 기타 상호작용이 가능한 작은 "경량" 게임플레이 기능에 블루프린트를 사용. 무기나 대미지 시스템과 같은 핵심 액세스가 필요하지 않으므로 블루프린트에서 순수하게 만들 수 있어서 좋은 예제가 될 수 있음.
C++ (C Plus Plus, Cpp)
코드에 직접 액세스할 수 있으므로 엔진 기능에 더 깊이 접근할 수 있어 연산량이 많거나 빠른 기능을 작성할 수 있음.
샘플 프로젝트와 같은 네트워크 기반 1인칭 슈팅 게임의 중요한 특징은 플레이어 입력에 대한 빠른 반응 속도. C++로 작성된 무거운 네트워크 게임플레이 코드를 볼 수 있는 이유도 바로 이 때문.
전체 게임을 블루프린트 또는 C++로 완전히 성공적으로 빌드할 수 있지만, 블루프린트와 C++를 함께 사용하면 기능이 향상.
Best Practices for Blueprints and C++ (모범사례)
프로젝트에서 블루프린트와 C++를 함께 사용하는 방식을 구조화하는 것은 균형 잡힌 작업.
첫 코드를 작성하기 전에 어떤 기능을 C++로 작성할지, 어떤 기능을 블루프린트로 작성할지, 게임의 구조는 어떻게 할지를 결정해야 함. 이를 결정하려면 팀을 살펴볼 필요가 있음.
팀원의 기술과 강점에 따라 한 언어가 다른 언어보다 더 강하거나 더 자연스럽게 사용될 수 있음.
아래 두 가지 팀을 살펴본다.
Designer/Artist-heavy team
(게임 디자이너/아티스트가 많은 팀)
프로그래밍/코딩 기술보다 디자인 및 아트 기술이 더 뛰어난 팀. 이 팀은 C++보다 블루프린트를 더 많이 사용할 것으로 예상할 수 있음. 팀에서 가장 많이 사용하는 기능 유틸리티를 파악하고 해당 기능을 블루프린트에 노출하여 C++로 작성하는 것이 좋음.
게임 구조는 아티스트와 디자이너의 블루프린트 사용을 지원하는 데 더 중점을 두어야. 게임의 복잡하고 성능이 중요한 측면에 집중하되, 디자이너와 아티스트가 필요한 기능을 구현하는 데 필요한 기능, 유틸리티 및 툴을 사용할 수 있도록 해야 함.
Programmer-heavy team
(프로그래머가 많은 팀)
이전 예제에서와 마찬가지로 팀의 요구 사항을 평가해야.
프로그래머/코더는 많은 C++ 기능을 작성하는 대신 프로젝트의 복잡하고 복잡한 기능에 집중할 수 있음. 더 많은 C++ 코드와 기능을 추가한 다음 디자이너에게 변수를 노출. 디자이너와 아티스트는 블루프린트를 사용하여 기능을 반복 작업.
프로젝트 개발을 시작하기 전에 고려해야 할 몇 가지 다른 요소
일부 게임플레이 메커니즘은 복잡성, 처리 등 다양한 이유로 C++보다 블루프린트에 더 적합함.
게임 내에서 일시적이거나 찰나적인 메커니즘은 블루프린트로 더 효과적으로 빌드할 수 있음.
지속적이지 않고 플레이어 주변에서 일시적으로 작동하는 작은 메커니즘이 많은 게임이라면 블루프린트를 더 많이 활용.
게임에서 백그라운드에서 지속적으로 실행되는 영구적인 기능은 C++를 사용하는 것이 더 좋음.
무겁고 일관된 연산이 필요한 기능과 메카닉을 사용하는 게임이라면 C++를 사용하는 것이 좋음.
비싼 블루프린트 캐스팅 피하기 (Avoid casting expensive Blueprints)
블루프린트는 가상 머신에서 실행되기 때문에 C++보다 퍼포먼스 측면에서 약간 더 비쌀 수 있음. 코드가 많은 블루프린트로 형변환할 때, 프로젝트의 퍼포먼스 대역폭(project’s performance bandwidth)에 큰 타격을 줄 수 있음.
이 작업을 정기적으로 수행할 예정이라면 C++로 작성하거나 블루프린트에 일부 C++ 코드를 통합하여 최적화 하는 것이 좋음.
열거자와 구조체 주의 (Enumerators and Structs)
블루프린트는 열거자와 구조체를 지원하지만, 블루프린트의 일부인 경우 C++에서 사용할 수 없는 것이 몇 가지 있음. 사용해야 하는 열거자나 구조체가 C++에서 액세스할 수 있는지 확인 필요.
결론
블루프린트와 C++를 사용하는 모범 사례는 여러 요소의 영향을 받는 균형이 필요.
게임 기능과 팀 구성이 블루프린트와 C++ 결정에 영향을 줌.
게임에 지속적이고 일관되게 실행되는 메커니즘이 많거나,
팀원들의 프로그래밍 실력이 뛰어나다면 C++를 더 많이 사용하느 것이 좋음.
항상 팀과 게임의 강점을 살리고 어떤 정보를 어디에 넣을지 그룹으로 결정해야.
블루프린트/C++로 프로젝트 최적화
C++는 게임에서 지속적이고 일관되게 실행되는 함수와 유틸리티에 더 강함. 블루프린트는 일관된 함수로 성능을 발휘할 수 있지만 가상 머신을 통해 실행해야 하므로 약간의 추가 성능 비용이 발생. 블루프린트가 지속적으로 활성화되는 블루프린트가 너무 많다면 일부 블루프린트를 C++로 옮기는 것을 고려.
C++를 사용하면 언리얼 엔진의 함수와 유틸리티에 직접 액세스할 수 있으므로 프로세싱 파워를 어디에, 언제, 무엇을 사용할지 훨씬 더 세밀하게 제어 가능.
C++ 클래스로 시작하여 이를 사용하여 블루프린트 베이스 클래스를 만든 다음 나중에 블루프린트로 이 클래스를 확장해도 성능은 낼 수 있음.
라이라(Lyra) 샘플 게임에서 베이스 클래스를 C++로 시작한 다음 나중에 블루프린트로 기능을 확장하는 데 사용되는 방식.
지속적으로 활성화되는 기능인 네트워킹에 있어 가장 성능이 좋은 C++로 작성된 기능도 많이 볼 수 있음.
빠르고 반응성이 뛰어난 충돌 판정이 필요한 게임에서는 엔진과 직접 통신하여 지연 시간을 최소화하고 응답성을 극대화할 수 있어야 함.
네트워킹 외에도 수학적 연산이 많거나 세션 간 데이터 저장 및 로딩과 같이 장기간 데이터를 저장해야 하는 경우도 C++ 고려.
언리얼 엔진의 프로파일링 도구를 활용하여 C++로 전환해야 할 부분을 파악하는 데 도움 및 활용.
블루프린트는 어떨까?
성능을 극대화하려면 모든 것을 C++로 작성하고 빌드해야 한다고 생각할수도 있음.
게임을 어떻게 구조화하고 그 구조의 어디에서 블루프린트를 사용하느냐가 중요.
라이라 스타터 게임의 무기와 무기 스포너는 모두 C++ 클래스에 기반한 자체 블루프린트 클래스에서 비롯.
이 방법을 사용하면 추가된 기능이 가볍고 일반적으로 성능에 큰 영향을 미치지 않음.
성능에 큰 비용이 드는 것은 모두 C++로 변환하여 디자이너가 계속 사용할 수 있도록 블루프린트에 노출.
블루프린트에서 C++ 함수를 호출하거나 간단한 타이머, 정수 설정과 같은 경량 코드는 모두 C++가 아니어도 되는 기능.
디자이너와 아티스트가 제어하고 싶어하는 기능이며 가볍기 때문에 블루프린트 코드로 훨씬 더 잘 작동.
블루프린트가 실행되는 가상 머신으로 인해 블루프린트의 성능이 C++ 클래스에 비해 약간 낮다는 오버헤드가 있는데, 이를 최소화 하려면 간단히 블루프린트를 비활성화. 블루프린트 틱을 비활성화 하거나 줄이고, 기타 이벤트를 사용하도록 최적화.
마지막으로, 블루프린트가 처리 대역폭을 너무 많이 차지하는 경우, 블루프린트 네이티브화를 고려. 블루프린트를 C++ 로 네이티브화하면 약간의 퍼포먼스 향상.
결론
일반적으로 C++와 블루프린트 사이의 균형을 맞추려고 노력하지만, 둘 중 하나가 절대적으로 필요한 순간이 있음. 다음에는 모든 프로젝트의 핵심 클래스를 살펴보고 C++ 또는 블루프린트를 각각 언제, 왜 사용해야 하는지에 대해 살펴봄.
(다음 글에서 이어짐)
2023.07.05 - [Unreal 엔진] - [UE] 언리얼 엔진 5 블루프린트 vs C++ 언제 어떤 걸 사용하는 게 좋을까? - 2편
참조 링크