언리얼4 C++ 블루프린트의 확장

Intro

  • C++ 에서 블루프린트의 확장

클래스의 권한

언리얼 오브젝트가 블루프린트에서 상속받을 수 있게 하려면 UCLASS 매크로안에 두가지 타입을 넣어주어한다.

  1. BlueprintType : 이 C++ 클래스를 블루프린트에서 변수로 선언 가능한 타입임을 지정

  2. 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/VisibleDefaulsOnly/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가 있다.

참고문서

https://blog.naver.com/PostView.nhn?blogId=destiny9720&logNo=220940926812&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F

http://api.unrealengine.com/KOR/Programming/UnrealArchitecture/Reference/Properties/Specifiers/index.html

댓글남기기