시각적 스크립팅 도구
노드를 연결하여 게임 로직을 구성하며, 비개발자나 프로토타이핑에 적합.
언리얼 엔진의 핵심 언어
고성능, 확장성 있는 시스템 개발에 유리.
현업에서는 BP + C++ 병행 사용이 일반적.
역할 | 사용 도구 |
---|---|
빠른 UI 구성 / 간단 이벤트 / 시각 효과 | ✅ BP |
성능 요구 / 복잡한 연산 / 시스템 확장 | ✅ C++ |
☑️ 하이브리드 워크플로우로 각 도구의 강점을 조합하여 개발
C++ 클래스의 변수 및 함수 정보를 엔진 내부의 메타데이터 형태로 저장하고,
이를 에디터나 블루프린트에서 활용할 수 있게 만들어주는 기술C++ 클래스에 있는 여러 멤버를 “Reflectoin (반사)”해
에디터와 블루프린트에서 직접 설정, 호출이 가능하도록 함.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Item.generated.h" // 반드시 마지막에 위치해야 합니다.
UCLASS()
class SPARTAPROJECT_API AItem : public AActor
{
GENERATED_BODY()
public:
AItem();
protected:
USceneComponent* SceneRoot;
UStaticMeshComponent* StaticMeshComp;
float RotationSpeed;
virtual void BeginPlay() override;
virtual void Tick(float DeltaTime) override;
};
#include "Item.generated.h"
UCLASS()
GENERATED_BODY()
UCLASS()
와 쌍으로 사용하는 매크로클래스를 리플렉션 시스템에 등록하면서 추가적으로 몇 가지 옵션 (지정자)을 설정 가능
UCLASS()
class SPARTAPROJECT_API AItem : public AActor
Blueprintable
, BlueprintType
옵션을 기본값으로 설정Blueprintable
: BP에서 상속 가능한 클래스로 설정NotBlueprintable
: BP에서 이 클래스를 상속할 수 없도록 설정BlueprintType
UPROPERTY()
에 여러 지정자를 사용해서 변수에 대한 에디터 표시를 상세하게 설정 가능.
다음은 자주 쓰는 대표적인 지정자들.
VisibleAnywhere
: 읽기 전용으로 표시되며, 수정은 불가능EditAnywhere
: 클래스 기본값, 인스턴스 모두에서 수정 가능EditDefaultsOnly
: 클래스 기본값에서만 수정 가능EditInstanceOnly
: 인스턴스에서만 수정 가능BlueprintReadWrite
: Blueprint 그래프에서 Getter/Setter로 값을 읽거나 쓸 수 있습니다.BlueprintReadOnly
: Blueprint 그래프에서 Getter 핀만 노출되어, 읽기만 가능합니다.여러 변수를 비슷한 카테고리에 묶어, 세부 정보 패널에서 깔끔하게 정리 가능
private:
UPROPERTY(EditAnywhere, Category = "Platform|Movement")
FRotator Velocity;
"Platform|Movement"
: Platform 카테고리 내에 Movement라는 하위 카테고리에 저장.meta=(ClampMin="0.0")
: 에디터에서 변수 입력 시 최소값을 제한할 수 있음meta=(AllowPrivateAccess="true")
: 해당 멤버가 private
로 선언되어 있어도, 에디터나 BP에서 접근할 수 있도록 허용.만약 UPROPERTY()만 있고, 추가 지정자를 하나도 주지 않는다면?
protected:
// Root Scene Component, 에디터에서 볼 수만 있고 수정 불가
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Item|Components")
USceneComponent* SceneRoot;
// Static Mesh, 에디터와 Blueprint에서 수정 가능
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Item|Components")
UStaticMeshComponent* StaticMeshComp;
// 회전 속도, 클래스 기본값만 수정 가능
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="Item|Properties")
float RotationSpeed;
함수 또한 블루프린트에서 직접 호출할 수 있도록 등록할 수 있음.
복잡한 C++ 로직을 BP에서 간단한 노드로 불러와 제어할 수 있으므로 작업 효율이 높아짐.
UFUNCTION()
매크로를 사용해서 등록.
BlueprintCallable
BlueprintPure
BlueprintImplementableEvent
만약
UFUNCTION()
에 지정자를 하나도 쓰지 않았다면?
UPROPERTY()
와 마찬가지로 언리얼 리플렉션에 등록되긴 하지만 BP에 노출되지는 않음.protected:
// 함수를 블루프린트에서 호출 가능하도록 설정
UFUNCTION(BlueprintCallable, Category="Item|Actions")
void ResetActorPosition();
// 블루프린트에서 값만 반환하도록 설정
UFUNCTION(BlueprintPure, Category = "Item|Properties")
float GetRotationSpeed() const;
// C++에서 호출되지만 구현은 블루프린트에서 수행
UFUNCTION(BlueprintImplementableEvent, Category = "Item|Event")
void OnItemPickedUp();