게임 개발/언리얼 엔진4(UE4)

[UE4] 언리얼 엔진 클래스, UCLASS, UPROPERTY

마달랭 2024. 11. 5. 00:14
반응형

 

개요

UE4 에서 C++ 클래스와 구조체의 생성 방법을 알아보자

UE4의 클래스는 표준 C++클래스이며 UCLASS라고 부른다.

UCLASS는 UE4 매크로를 다수 포함한 C++클래스다.

이 매크로는 UE4 편집기와의 통합을 도와주는 추가 C++ 헤더 코드를 생성한다.

 

ULCASS 매크로를 제대로 구성하면 UCLASS를 복제하거나 재사용 할 수 있게 만들어서 커스텀 C++ 오브젝트를 언리얼의 비주얼 스크립팅 언어 블루프린트 내에서 사용할 수 있게 된다.

즉 코드에 접근하지 않고도 프로젝트의 여러 형상에 접근하고 수정할 수 있게 된다.

 

텍스트 필드, 슬라이더, 모델 선택 상자와 같은 편리한 UI 위젯의 편집 속성을 사용할 수도 있다.

 

 

UCLASS 작성

new와 delete 연산자를 사용해 커스텀 오브젝트를 생성하고 삭제할 수 있다.

코드에서 메모리 누수가 발생하지 않도록 new와 delete 호출이 적절히 쌍을 이루도록 하면, UE4 프로젝트에서 네이티브 C++ 코드를 완벽하게 사용할 수 있다.

 

UCLASS 매크로를 사용하면 할당과 해제를 할 때 클래스가 UE4의 스마트 포인터와 메모리 관리 루틴을 사용하게 된다.

이러한 스마트 포인터 규칙은 UE4 편집기에서 자동으로 불러와 읽을 수 있으며 선택적으로 블루 프린트에서 접근할 수도 있다.

 

UCLASS 매크로를 사용할 때, UCLASS 오브젝트의 생성과 삭제는 UE4에 의해 처리돼야 한다.

  • 인스턴스 생성 : ConstructObject
  • 오브젝트 삭제 : UObject::ConditionalBeginDestroy()

C++ 네이티브 키워드인 new와 delete를 사용하면 안된다.

 

일반적인 상황에서는 C++ 클래스를 UCLASS로 만드는 것이 기본이다.

특별한 이유가 있을 때만 UCLASS를 사용하지 않으면 된다.

 

 

UCLASS 추가

  1. UE4에서 파일 -> 새로운 C++ 클래스 추가 탭을 클릭해 준다.
  2. 모든 클래스 표시 박스를 선택해 준다.
  3. 계층 구조 최상단의 Object를 선택하고 Next를 클릭한다.
  4. 새 Object의 이름을 생성한 오브젝트 타입에 어울리게 결정한다.
  5. 클래스 생성을 클릭하면 컴파일을 마친 후 비주얼 스튜디오에 파일이 생성된다.

 

비주얼 스튜디오에 정상적으로 새로운 C++ 클래스가 생성되었다.

 

 

커스텀 UCLASS 블루프린트 생성

블루프린팅은 단지 C++ 오브젝트에 대한 블루프린트 클래스를 만드는 과정이다.

UE4 오브젝트에서 블루프린트 파생 클래스를 생성하면 편집기 내에서 커스텀 UPROPERTY를 시각적으로 편집할 수 있으며, 이를 통해 리소스를 C++ 코드로 하드코딩 하지 않아도 된다.

또한 C++ 클래스를 레벨 내에 배치할 수 있도록 먼저 블루프린트를 작성해야 한다.

하지만 이는 블루프린트 기반이 되는 C++ 클래스가 Actor클래스에서 파생된 경우에만 가능하다.

 

엔진 내부에서 블루프린트를 사용하려면 UCLASS 매크로에서 UCLASS를 Blueprintable로 설정해야 한다.

 

UserProfile 클래스를 브루프린트로 만들려면, 일단 UCLASS가 매크로 내에 Blueprintable 태그를 가졌는지 확인해야 하는데 다음과 같이 작성해 준 뒤 컴파일 해본다.

 

블루프린트를 사용할 수 있는 커스텀 클래스임을 명시해 주었다.

 

UE4의 창 -> 개발자 툴 -> 클래스 뷰어에서 블루프린트를 생성할 수 있다.

클래스 뷰어의 필터가 기본적으로 액터만에 표시가 되어 있는데 이를 해제해 주어야 커스텀 C++ 클래스가 노출된다.

 

체크 해제 시 정상적으로 클래스가 노출되는 것을 확인할 수있다.

이를 우클릭하여 블루프린트 클래스 생성 탭을 클릭해 준다.

 

블루프린트 이름을 설정하고 저장해 준다, 일반적으로 블루프린트 클래스 이름을 정할 때 BP_로 시작하도록 이름을 짓는 경우가 흔하니 참고하자.

 

위에서 언급했듯 UCLASS 매크로에 Blueprintable 태그가 있는 모든 C++ 클래스는 UE4 편집기 내에서 블루프린트화 할 수 있다. 블루 프린트를 사용하면 UE4의 시각적 GUI 인터페이스를 사용해 C++ 클래스 속성을 정의할 수 있다.

 

 

UPROPERTY 생성

선언된 각 UCLASS가 선언할 수 있는 UPROPERTY의 수엔느 제한이 없다.

각 UPROPERTY는 시각적 편집이 가능하거나 블루프린트로 접근 가능한 UCLASS의 데이터 멤버이다.

 

각 UPROPERTY에 추가할 수 있는 한정자가 몇 개 있는데, EditAnywhere는 UPROPERTY를 코드 또는 편집기를 통해 변경할 수 있다는 의미다.

또한 BlueprintReadWrite는 블루프린트가 변수를 언제든 읽고 쓸 수 있음을 의미하며, 동시에 C++ 코드도 허용된다는 것을 의미한다.

 

 

블루프린트를 생성한 커스텀 C++ 클래스에 UPROPERTY를 통해 Armor, HpMax를 초기화 해주었다.

UE4로 돌아와 컴파일 버튼을 클릭하여 코드를 업데이트 해준다.

 

 

생성했던 블루프린트를 참조해 보면 Armor와 HpMax의 값을 수정할 수 있는 것을 볼 수 있다.

이는 마치 유니티에서 스크립트를 컴포넌트에 할당하고, 툴 내에서 각 수치를 변경하는 것과 유사하다.

 

 

[참고] UPROPERTY 파라미터

UPROPERTY() 매크로로 전달되는 파라미터는 변수에 관한 중요 정보 중 두가지를 지정한다.

 

1. 첫번째 파라미터

  • EditAnywhere : 프로퍼티를 블루프린트, 게임 레벨 내의 각 UCLASS 오브젝트 인스턴스에서 수정 가능
  • EditDefaultsOnly : 블루프린트의 값이 편집 가능하지만, 인스턴스 단위로는 편집 불가
  • EditInstanceOnly : 블루프린트 자체가 아닌 UCLASS 오브젝트의 게임 레벨 인스턴스에서 속성 편집 가능

2. 두번째 파라미터

  • BlueprintReadWrite : 블루프린트 다이어그램에서 특성을 읽고 쓸 수 있음, UPROPERTY()는 publie멤버여야 하며 그렇지 않을 경우 컴파일 되지 않음
  • BlueprintReadOnly : C++ 내에서만 속성을 설정해야 하며 블루프린트에서 수정 불가

 

3. 세번째 파라미터

  • Category : 정리된 상태를 유지하기 위해 항상 지정해야 함, 속성 편집기에서 UPROPERTY()가 표시될 하위 메뉴를 결정한다. 지정하지 않으면 기본 카테고리에 나타남

 

블루프린트에서 UPROPERTY 접근

UCLASS(Blueprintable, BlueprintType)
class SANG_API UUserProfile : public UObject
{
	GENERATED_BODY()
public:
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Stats)
	float Armor;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Stats)
	float HpMax;

	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Stats)
	FString name;
};

 

  1. UCLASS에 BlueprintType을 넣어주었고, name의 UPROPERTY를 추가해 주었다.
  2. 코드를 저장하고 컴파일 해준다.
  3. UE4 편집기 내에서 필요에 따라 C++클래스 -> 블루프린트 클래스를 파생시킨다.
  4. 인스턴스를 더블 클릭한 후 Name 변수를 수정한다.
  5. 컴파일 버튼을 클릭해 모든 변경 사항을 저장한다.
  6. 함수 호출을 허용하는 블루프린트 다이어그램에서 추가한 변수를 사용할 수 있다.
  7. 예를 들면, 게임이 시작될 때 Name속성을 출력하는 일이 가능하다.
  8. 게임이 시작될 때 어떤 동작이 발생하게 하려면 BeginPlay 이벤트를 만들어야 한다.
  9. 블루프린트 그래프에서 마우스 오른쪽 버튼을 클릭한 후 이벤트를 추가할 수 있다.

 

 

 

728x90
반응형