Actor
UE5부터 생포인터 대신 TObejctPtr을 사용하는 것을 권장
UPROPERTY()
UStaticMeshComponent* Box;
UPROPERTY()
TObjectPtr<UStaticMeshComponent> Box;
- TObjectPtr은 포인터 하나를 들고있는 것과 같다
- 장기적으로 ObjectPtr으로 통일해서 만들면 정보를 추가해서 디버깅 등에서의 이점이 있다
- 생성자에서는 게임 로직과 관련된 부분이 들어가면 안되고 최소한의 작업만 하는 것을 권장하고 실제 생성자 역할을 하는 것은 BeginPlay이다.
- 생성자에서는 CDO(객체 샘플)와 연관있는 부분을 작업하고 실제로 게임이 시작되면서 처리해야하는 작업은 BeginPlay에서 하는것이 좋다
CreateDefaultSubobject를 통해 오브젝트를 생성할 수 있다
Box = CreateDefaultSubobject<UStaticmeshComponent>(TEXT("Box"));
ConstructorHelpers::FObjectFinder<UStaticMesh> FindMesh(TEXT("Path"));
if(FindMesh.Succeeded())
{
Box->SetStaticMesh(FindMesh.Object);
}
- CreateDefaultSuboject는 CDO를 통해 해당 객체의 가장 기본적인 형태를 복사해서 가져온다
- FObjcetFinder는 언리얼엔진이 메타데이터를 참고하여 실제 객체를 가져오는 역할
자주 쓰는 ConstructorHelpers
ConstructorHelpers::FClassFinder<T>
ConstructorHelpers::FObjectFinder<T>
- 액터를 Spawn 하기 위해서는 액터를 상속받아야 한다.
- 임시로 레벨블루프린트에서 SpawnActor를 통해 호출할 수 있지만 이를 C++로 하기 위해 임시 Actor를 만들어서 구현할 수 있다.
- 마치 main 함수처럼 엔트리로 사용할 수 있다.
- BeginPlay에서 똑같이 Spawn한다면 동일하게 사용할 수 있다
UPROPERY()
TObjectPtr<class ARActor> Actor;
FVector Location(0, 0, 0);
FRotator Rotation(0, 0, 0);
Actor = GetWorld()->SpawnActor<ARActor>(Location, Rotation);
Actor->SetLifeSpan(0.5f);
- SetLifeSpan으로 수명을 정해 미사일과 같은 오브젝트에 사용할 수 있다.
TSubClassof
UPROPERTY()
TSUbclassOf<ARActor> ActorClass;
- T를 상속받은 객체가 아닌 클래스의 정보를 가질 수 있다.
- 블루프린트로 만든 Actor 스폰하기
ConstructorHelpers::FClassFinder<ARActor> FindClass(TEXT("/Script/Engine.Blueprint'/Game/Blueprints/BP_RActor.BP_RActor_C'"));
if(FindClass.Succeeded())
{
ActorClass=FindClass.Class;
}
Actor = Cast<ARActor>(GetWorld()->SpawnActor(ActorClass));
- BP Class 타입인 경우 마지막에 _C를 붙여야한다
- AActor를 반환하기 때문에 사용하고자 하는 ARActor로 캐스팅해주어야한다.
- 언리얼엔진의 Cast는 C++의 dynamic_cast로 캐스팅 실패시 nullptr을 반환