icon안동민 개발노트

블루프린트와 C++의 차이점


 언리얼 엔진은 게임 개발을 위한 두 가지 주요 프로그래밍 방식을 제공합니다.

 비주얼 스크립팅 시스템인 블루프린트와 전통적인 프로그래밍 언어인 C++입니다.

 이 두 방식은 각각 고유한 특징과 장단점을 가지고 있으며 프로젝트의 요구사항에 따라 적절히 선택하거나 조합하여 사용할 수 있습니다.

블루프린트와 C++의 특징

 블루프린트

  • 비주얼 스크립팅 시스템
  • 노드 기반의 그래픽 인터페이스
  • 프로그래밍 지식이 적은 개발자도 쉽게 사용 가능
  • 빠른 프로토타이핑과 반복 개발에 적합

 C++

  • 전통적인 텍스트 기반 프로그래밍 언어
  • 강력한 성능과 최적화 가능
  • 복잡한 시스템 구현에 적합
  • 언리얼 엔진의 코어 기능에 직접 접근 가능

성능 비교

 블루프린트와 C++의 성능 차이는 작업의 복잡성과 빈도에 따라 다릅니다.

  • 단순 작업 : 블루프린트와 C++ 사이의 성능 차이가 미미함
  • 복잡한 계산 또는 반복 작업 : C++가 현저히 뛰어난 성능을 보임

 예시 : 10,000개의 액터를 생성하고 각각에 물리 시뮬레이션을 적용하는 경우

  • C++ : 약 100ms
  • 블루프린트 : 약 1,000ms

개발 속도

 블루프린트

  • 빠른 프로토타이핑 가능
  • 즉각적인 시각적 피드백
  • 컴파일 시간 없음

 C++

  • 초기 설정에 시간이 더 소요됨
  • 컴파일 시간이 필요
  • 복잡한 시스템 구현에 더 효율적

디버깅 용이성

 블루프린트

  • 시각적 디버깅 도구 제공
  • 실행 흐름을 직관적으로 파악 가능
  • 값의 변화를 실시간으로 확인 가능

 C++

  • IDE의 강력한 디버깅 도구 활용 가능
  • 브레이크포인트, 워치, 메모리 검사 등 고급 기능 사용
  • 대규모 프로젝트에서 더 체계적인 디버깅 가능

확장성

 블루프린트

  • 엔진에서 제공하는 기능 내에서 제한적인 확장
  • 복잡한 알고리즘이나 시스템 구현에 한계가 있음

 C++

  • 무제한적인 확장 가능성
  • 서드파티 라이브러리 통합 용이
  • 엔진의 코어 기능 수정 및 확장 가능

블루프린트와 C++의 효과적인 조합

 1. C++ 기반 클래스 생성 후 블루프린트로 확장

UCLASS(Blueprintable)
class AMyBaseCharacter : public ACharacter
{
      GENERATED_BODY()
public:
      UFUNCTION(BlueprintCallable)
      void PerformComplexCalculation();
 
      UPROPERTY(BlueprintReadWrite)
      float Health;
};

 2. 블루프린트에서 C++ 함수 호출

  • C++에서 복잡한 로직 구현
  • 블루프린트에서 해당 함수를 노드로 사용

 3. 인터페이스를 통한 상호작용

UINTERFACE(BlueprintType)
class UMyInterface : public UInterface
{
      GENERATED_BODY()
};
 
class IMyInterface
{
      GENERATED_BODY()
public:
      UFUNCTION(BlueprintNativeEvent)
      void MyInterfaceFunction();
};

프로젝트 규모와 유형에 따른 선택 기준

 소규모 프로젝트 또는 프로토타입

  • 블루프린트 중심의 개발
  • 빠른 반복과 시각적 개발 이점 활용

 중규모 프로젝트

  • 블루프린트와 C++의 균형있는 사용
  • 핵심 시스템은 C++로, 게임플레이 로직은 블루프린트로 구현

 대규모 프로젝트

  • C++ 중심의 개발
  • 성능 크리티컬한 부분은 모두 C++로 구현
  • 블루프린트는 빠른 프로토타이핑과 디자이너 작업용으로 제한적 사용

C++에서 블루프린트 활용

  1. 블루프린트 함수 호출
UMyBlueprintFunctionLibrary* BlueprintLib = GetMutableDefault<UMyBlueprintFunctionLibrary>();
FChallengeSummary Summary = BlueprintLib->GetChallengeSummary();
  1. 동적 블루프린트 로딩 및 인스턴스화
UClass* BlueprintClass = LoadClass<AActor>(nullptr, TEXT("/Game/MyBlueprintActor.MyBlueprintActor_C"));
if (BlueprintClass)
{
      AActor* SpawnedActor = GetWorld()->SpawnActor<AActor>(BlueprintClass);
}

블루프린트에서 C++ 활용

 1. C++ 클래스 상속

  • 블루프린트에서 C++ 클래스를 부모로 선택
  • C++에서 정의한 속성과 함수를 블루프린트에서 사용 및 오버라이드

 2. C++ 플러그인 사용

  • C++로 개발된 플러그인의 기능을 블루프린트에서 직접 활용

 3. 네이티브 이벤트 구현

UFUNCTION(BlueprintImplementableEvent)
void OnCustomEvent();
  • C++에서 선언한 이벤트를 블루프린트에서 구현

결론

 블루프린트와 C++는 각각의 장단점을 가지고 있으며 효과적으로 조합하여 사용할 때 가장 큰 이점을 얻을 수 있습니다.

 블루프린트의 빠른 개발 속도와 접근성, C++의 강력한 성능과 확장성을 적재적소에 활용함으로써 효율적이고 강력한 게임 개발이 가능해집니다.