(Unreal : 입문) 2. 나만의 의자 만들어 보기

Posted by : at

Category : Unreal-entry


나만의 의자를 하나 만들어 보자

약간의 시간이 걸리고 클래스 생성시 VS가 실행된다.

추가적으로 클래스를 삭제하고 싶다면?
언리얼 프로젝트를 끄고, cpp/h파일을 삭제해야 한다.
이후 깔끔하게 하고싶다면 프로젝트를 다시 생성(자동생성되는 폴더/파일을 삭제)

내가 만든 의차에 Mesh를 추가해보자

// ...

UCLASS()
// 참고로 AActor의 A는 Actor를 상속받음을 알린다.
class TESTUNREAL_API AMyActor : public AActor
{
	GENERATED_BODY()
	
    // ...

private:
    // 이렇게 Mesh를 추가해보자
    // UPROPERTY()는 Unreal에서 관리하는 클래스임을 알린다.
    // 생성도 일반 C++처럼 해서는 안된다.
	UPROPERTY()
	UStaticMeshComponent* Mesh;
};
// ...

AMyActor::AMyActor()
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;
	Mesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("MESH"));
    // TEXT매크로는 항상 동일한 환경일 거라는 보장이 없기에 TEXT를 붙어 인코딩을 보장
}

// ...

일단 생성은 되었지만 아무런 설정이 불가능하다
설정이 되게 수정해보자

// ...

private:
	UPROPERTY(VisibleAnyWhere)
	UStaticMeshComponent* Mesh;
};

Static_Mesh에 내가 원하는 Mesh를 넣어도 좋지만
매번 클래스 생성마다 Mesh를 내가 선택해서 넣는것은 불편하다

코드상에서 선언해보자

AMyActor::AMyActor()
{
	PrimaryActorTick.bCanEverTick = true;
	Mesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("MESH"));

    // 컴포넌트를 생성하면 Root로 만들어줘야한다(일단은 받아들이자)
    RootComponent = Mesh;

    // Static으로 선언한 이유는 한 번만 로딩하고 이후에 로딩을 안하게 하는게 성능적으로 유리
	static ConstructorHelpers::FObjectFinder<UStaticMesh> SM(TEXT("StaticMesh'/Game/StarterContent/Props/SM_Couch.SM_Couch'"));
    // Mesh의 경로는 Unreal프로젝트에서 Ctrl+C / Ctrl+V로 복사 가능(참고)

	if (SM.Succeeded())
	{
		Mesh->SetStaticMesh(SM.Object);
	}
}

인게임 정보(hp, mp)를 만들어 Unreal에서 로드가 가능하게 해보자

class TESTUNREAL_API AMyActor : public AActor
{
	// ...

private:
	UPROPERTY(VisibleAnyWhere)
	UStaticMeshComponent* Mesh;

	UPROPERTY(VisibleAnyWhere, Category=BattleStat)
	int32 Hp;

	UPROPERTY(VisibleAnyWhere, Category = BattleStat)
	int32 Mp;
};

생성은 됐는데 수정이 안되네?
포인터의 경우 포인터 따라가서 수정이 가능하지만
그냥 변수는 수정이 불가

class TESTUNREAL_API AMyActor : public AActor
{
	// ...

private:
	UPROPERTY(VisibleAnyWhere)
	UStaticMeshComponent* Mesh;

    // Edit으로 선언시 수정가능
	UPROPERTY(EditAnyWhere, Category=BattleStat)
	int32 Hp;

	UPROPERTY(EditAnyWhere, Category = BattleStat)
	int32 Mp;
};

About Taehyung Kim

안녕하세요? 8년차 현업 C++ 개발자 김태형이라고 합니다. 😁 C/C++을 사랑하며 다양한 사람과의 협업을 즐깁니다. ☕ 꾸준한 자기개발을 미덕이라 생각하며 노력중이며, 제가 얻은 지식을 홈페이지에 정리 중입니다. 좀 더 상세한 제 이력서 혹은 Private 프로젝트 접근 권한을 원하신다면 메일주세요. 😎

Star
Useful Links