언리얼4 C++ 블루프린트의 확장
Intro
- C++ 에서 블루프린트의 확장
클래스의 권한
언리얼 오브젝트가 블루프린트에서 상속받을 수 있게 하려면 UCLASS
매크로안에 두가지 타입을 넣어주어한다.
-
BlueprintType : 이 C++ 클래스를 블루프린트에서 변수로 선언 가능한 타입임을 지정
-
Blueprintable : 블루프린트에서 이 C++ 클래스를 상속받아 새로운 클래스를 확장할 수 있게함
다음과 같이 AActor
클래스에는 BlueprintType
, Blueprintable
선언이 되어있기 때문에 AActor
클래스를 상속받은 클래스는 블루프린트에서 상속받고 변수로 선언 가능하다.
UCLASS(BlueprintType, Blueprintable, ...)
class ENGINE_API AActor : public UObject
멤버 변수의 권한
읽기 쓰기 권한
멤버 변수의 권한은 UPROPERTY
매크로를 통해 지정 할 수 있으며, 해당 변수에 대한 읽기나 쓰기 권한을 지정 할수 있다.
읽기만 하려면 BlueprintReadOnly
를 읽기쓰기를 허용하려면 BlueprintReadWrite
로 지정해주면 된다.
컴포넌트에 BlueprintReadWrite를 지정한다면 CDO에서 액터와 함께 정적으로 생성되도록 지정했는데 블루프린트에서 오브젝트 값을 변경한다는 의미가 되버린다. 이렇다면 굳이 컴포넌트를 정적으로 생성하는 의미가 없어지며 엔진이 혼란을 겪게된다. 따라서 CreateDefaultSubobject
로 생성하는 정적 컴포넌트들은 모두 BlueprintReadOnly
로 선언해야 초기 설계 개념에 부합한 선언이 된다.
에디터 인터페이스 권한
변수가 상속받아 블루프린트에서 읽거나 쓰기가 가능하지만 편집을 할수 있게 하려면 일기 쓰기 권한과 무관하게 에디터 인터페이스 편집 권한을 지정해주어야 한다.
관련 키워드
EditDefaultsOnly
EditInstanceOnly
EditAnywhere
VisibleDefaultsOnly
VisibleInstanceOnly
VisibleAnywhere
Edit/Visible
과 DefaulsOnly/InstanceOnly/Anywhere
로 나눌 수 있는데, Edit/Visible
은 편집을 허용하는지, 보여주기만 할 것인지 지정한다. 컴포넌트의 경우는 설계 단계부터 목적이 명확하기때문에 편집을 허용하지 않도록 Visible
을 사용한다.
Visible
을 사용하면 오브젝트 레퍼런스는 변경되지 않지만 오브젝트 속성들은 편집 가능하다.
반면 벨류타입 변수는 Edit
을 사용하는게 일반적이다.
DefaultsOnly
는 클래스 설계도에서만 변수 편집화면을 보여주도록 하며 InstanceOnly
는 오브젝트의 인스턴스에서만 변수 편집 화면을 보여준다. Anywhere
은 둘다 보여주도록 한다.
예시
Weapon 클래스 멤버변수에서 스켈레탈 메시 컴포넌트는 VisibleAnywher
를 벨류타입 변수인 BaseDamage
는 데미지 값 통일시 EditDefaultsOnly
월드 액터 인스턴스마다 다른 값을 주고싶다면 EditInstanceOnly
모든 곳에서 데미지 값을 변경하려면 EditAnywhere
을 지정하면 된다.
UPROPERTY(BlueprintReadOnly, VisibleAnywhere)
class USkeletalMeshComponent* Weapon;
UPROPERTY(BlueprintReadWrite, EditInstanceOnly)
float BaseDamage;
그 외 키워드
그외에도 여러가지 키워드가 있지만 블루프린트는 C++ 클래스를 상속받는 개념이므로 public이나 protected 변수만 적용가능하다. 하지만 meta=(AllowPrivateAccess="true")
를 지정하면 private 변수도 블루프린트에서 활용 가능하다.
Category = "Weapon"
이런식으로 카테고리를 지정해줄수 도 있다.
멤버 함수의 노출
클래스 멤버 함수는 UFUNCTION에 BlueprintCallable
키워드를 사용하면 블루 프린트에서 호출가능하며 이때 반드시 카테고리를 지정해서 블루프린트에서 검색할 수 있도록 해야한다.
예시
UFUNCTION(BlueprintCallable, Category="Weapon|Stat")
float GetDamage() { return BaseDamage; }
이외에도 블루프린트에서 작성되는 함수로 지정하는 BlueprintImplementableEvent
와
프로그래밍 코드를 블루프린트로 덮어씌울수 있는 BlueprintNativeEvent
가 있다.
댓글남기기