나만의 의자를 하나 만들어 보자
약간의 시간이 걸리고 클래스 생성시 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;
};