본문 바로가기

개발/언리얼

c++ 액터 클래스 뼈대 만들기

언리얼에서 Place Actor을 이용해 기본 엑터를 추가하면 기본적인 위치정보, 물리, 3d메시부터 마테리얼 등등의 필요한 기본적인 컴포넌트가 등록된 상태로 배치된다.

 

하지만 New C++ Class에서 c++ 액터 클래스를 만든다면 이런 정보들이 존재하지 않는다.

왜냐면 이렇게 만든 c++ 액터 클래스는 "액터"의 기본정보만을 가지고,
Transform이나 Mesh등은 각각의 컴포넌트의 역할이기 때문.

 

그렇기 때문에 개발자는 액터에 필요한 컴포넌트를 등록해주어야 함.

 

 

언리얼 에디터에서 new C++ Class -> 부모 클래스로 Actor선택-> public Item이름으로 생성 후 코드 작성

 

Item.h (언리얼 코드컨벤션에 따라 자동으로 클래스 이름 앞에는 A가 추가됨)

#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;//위치정보를 담을 SceneComponent
	UStaticMeshComponent* StaticMeshComp;//3d메시를 담을 StaticMeshComponent

};

 

Item.cpp

#include "Item.h"

AItem::AItem()
{
	//위치정보를 가진 SceneComponent를 생성
	SceneRoot = CreateDefaultSubobject<USceneComponent>(TEXT("SceneRoot"));
	//액터의 루트 컴포넌트로 등록(일반적으로 SceneComponent를 사용)
	SetRootComponent(SceneRoot);

	//액터가 보이기 위한 StaticMeshComponent를 생성
	StaticMeshComp = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("StaticMesh"));
	//루트컴포넌트인 SceneRoot의 하위로 등록
	StaticMeshComp->SetupAttachment(SceneRoot);

	//리소스를 가져오는 방법은 콘텐츠 드로어에서 에셋 우클릭->Copy Object Path, 그냥 리소스로 부르고 일부만 써도됨.
	// 아래 예시
	// /Game/Resources/Props/SM_Star_B.SM_Star_B
	// /Game/Resources/Materials/M_Star.M_Star

	//ConstructorHelpers::FObjectFinder<UType>으로 원하는 에셋을 불러와 변수에 저장 할 수 있음.
	static ConstructorHelpers::FObjectFinder<UStaticMesh> MeshAsset(TEXT("/Game/Resources/Props/SM_Star_B.SM_Star_B"));
	//반드시 성공 여부를 체크
	if (MeshAsset.Succeeded()) {
		//컴포넌트의 스태틱메시로 등록
		StaticMeshComp->SetStaticMesh(MeshAsset.Object);
	}

	//동일한 방법으로 마테리얼을 불러옴.
	static ConstructorHelpers::FObjectFinder<UMaterial> MaterialAsset(TEXT("/Game/Resources/Materials/M_Star.M_Star"));
	//반드시 성공 여부를 체크
	if (MeshAsset.Succeeded()) {
		//컴포넌트의 마테리얼을 불러오고, 0번째 마테리얼로 등록.(메시에 따라 여러 마테리얼을 등록할 수 있기 때문)
		StaticMeshComp->SetMaterial(0, MaterialAsset.Object);
	}
}

 

중요 포인트 정리

언리얼에서 제공하는 기본 컴포넌트들은 UObject를 상속받으며, 이들을 사용할때는 포인터로 관리하게 됨.

액터는 하나의 루트 컴포넌트와 여러 개의 하위 컴포넌트를 가진다

루트컴포넌트는 일반적으로 SceneComponent를 사용하고 SetRootComponent() 함수로 등록하며,

자식 컴포넌트는 컴포넌트객체의 SetupAttachment(RootComponent) 형태로 등록한다.

 

C++에서 리소스를 불러올 때는 콘텐츠 드로어에서 원하는 에셋 우클릭->Copy Object Path로 경로를 가져오고,

static ConstructorHelpers::FObjectFinder<UType명> 으로 에셋을 저장하는 변수를 생성하고 사용한다.