
언리얼 기초 · 약 3분
Blueprint와 C++를 함께 읽는 방법
클래스·인스턴스·노드 그래프의 관계를 이해하고, 작업 특성에 맞게 두 방식을 나눕니다.
Wolfgadeok · 업데이트
Blueprint는 C++ 소스 파일의 다른 그림이 아니다
Blueprint는 노드 기반으로 클래스의 기능과 데이터를 구성하는 시각적 스크립팅 시스템이다. C++로 만든 클래스를 부모로 삼아 에셋과 기본값을 지정하고 기능을 확장할 수 있다. 그렇다고 모든 Blueprint 그래프가 개발자가 작성하는 C++ 소스 코드와 동일한 형태로 변환된다고 설명하면 부정확하다.
C++ 부모 클래스가 기본 이동을 구현하고 Blueprint 자식이 메시·애니메이션·효과를 지정하는 구성을 생각해 보자. Blueprint의 EventGraph가 비어 있어도 게임이 동작할 수 있다. 부모의 구현과 컴포넌트가 일을 하고 있기 때문이다. 빈 그래프를 오류로 보기 전에 Parent Class와 컴포넌트 구성을 확인한다.
그래프에서 읽어야 할 세 가지
EventGraph의 실행 핀은 어느 순서로 작업할지 연결하고, 데이터 핀은 필요한 값과 대상 참조를 전달한다. Get과 Set은 값을 읽고 쓰는 역할을 하지만, 노드 모양만 보고 어떤 객체의 값인지 놓치면 로직을 잘못 이해하기 쉽다. Target 핀과 Self가 가리키는 대상을 함께 읽는다.
애니메이션의 AnimGraph는 일반 실행 흐름과 다른 의미를 갖는다. 포즈를 만들어 섞고 변형해 최종 결과로 연결한다. 그래프 위에 흐르는 시각적 표시를 메시에 담긴 모든 데이터가 선을 따라 실제로 이동한다는 물리적 그림으로 해석하기보다는, 어떤 경로가 평가되고 있는지 보여주는 디버깅 표시로 이해한다.
한 기능을 끝까지 추적해 보기
상속 관계와 호출 관계를 한 장에 너무 많이 그리기보다 이동 같은 작은 기능 하나를 정해 추적한다. 부모에서 제공하는 기능과 자식에서 덮어쓴 설정을 구분하는 것이 핵심이다.
- 캐릭터 Blueprint를 열고 부모 클래스가 엔진 기본 클래스인지 프로젝트 C++ 클래스인지 확인한다.
- EventGraph에 실행이 없다면 부모 코드와 컴포넌트의 기능을 찾아본다.
- 조정할 기본값 하나를 선택해 Blueprint에서 변경하고 결과를 관찰한다. 부모 C++ 기본값과 자식에서 덮어쓴 값이 다를 수 있음을 확인한다.
- 게임 동작과 관계없는 에셋 선택은 에디터에서, 반복 계산이나 공통 기반 로직은 코드에서 다루는 등 변경 빈도와 책임을 기준으로 분리한다.
- 완성 후 다른 캐릭터에도 재사용할 부분과 특정 연출에만 필요한 부분을 따로 표시한다.
성능은 언어 이름보다 측정으로 판단한다
C++와 Blueprint의 성능 차이를 고정 배율로 단정할 수는 없다. 실제 비용은 호출 횟수, 처리 데이터, 네이티브 함수 사용, 그래프 구성에 따라 다르다. 애니메이션 작업도 C++로 거의 불가능한 것이 아니라 시각적 편집의 피드백이 특히 유용한 분야다. 먼저 읽기 쉽고 책임이 분리된 구현을 만들고, 측정으로 병목을 찾은 뒤 필요한 부분을 바꾸는 편이 합리적이다.