Actor 클래스 생성 방법
Content Browser에서
새 C++ 클래스 > Actor 부모 클래스 > “STorch” 로 생성하고
경로는 본인이 원하는 위치에 설정하면 된다
Actor 클래스 블루프린트 에셋 생성
본인이 원하는 경로 > 새 Blueprint 에셋 > STorch 부모 클래스 > “BP_Torch”
Actor 클래스 파일 내부
// STorch.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "STorch.generated.h"
class UBoxComponent;
class UStaticMeshComponent;
class UPointLightComponent;
class UParticleSystemComponent;
UCLASS()
class STUDYPROJECT_API ASTorch : public AActor
{
GENERATED_BODY()
public:
ASTorch();
private:
UPROPERTY(VisibleAnywhere)
TObjectPtr<UBoxComponent> BoxComponent;
UPROPERTY(VisibleAnywhere)
TObjectPtr<UStaticMeshComponent> BodyStaticMeshComponent;
UPROPERTY(VisibleAnywhere)
TObjectPtr<UPointLightComponent> PointLightComponent;
UPROPERTY(VisibleAnywhere)
TObjectPtr<UParticleSystemComponent> ParticleSystemComponent;
};
// STorch.cpp
#include "WorldStatic/STorch.h"
#include "Components/BoxComponent.h"
#include "Components/PointLightComponent.h"
#include "Particles/ParticleSystemComponent.h"
ASTorch::ASTorch()
{
PrimaryActorTick.bCanEverTick = false;
BoxComponent = CreateDefaultSubobject<UBoxComponent>(TEXT("BoxComponent"));
SetRootComponent(BoxComponent);
BodyStaticMeshComponent = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("BodyStaticMeshComponent"));
BodyStaticMeshComponent->SetupAttachment(GetRootComponent());
BodyStaticMeshComponent->SetRelativeLocation(FVector(0.f, 0.f, -30.f));
PointLightComponent = CreateDefaultSubobject<UPointLightComponent>(TEXT("PointLightComponent"));
PointLightComponent->SetupAttachment(GetRootComponent());
PointLightComponent->SetRelativeLocation(FVector(0.f, 0.f, 500.f));
ParticleSystemComponent = CreateDefaultSubobject<UParticleSystemComponent>(TEXT("ParticleSystemComponent"));
ParticleSystemComponent->SetupAttachment(GetRootComponent());
ParticleSystemComponent->SetRelativeLocation(FVector(0.f, 0.f, 500.f));
}
}
Actor 클래스 내부 설명
- TObjectPtr<>
언리얼 5 버전 이후부터 헤더에 언리얼 오브젝트 포인터를 선언할 때는
로우 포인터 대신 TObjectPtr을 사용하는 걸 권장한다
- UPROPERTY()
언리얼 오브젝트 클래스의 속성(멤버 변수)에 작성하는 매크로이다
해당 매크로가 작성된 속성은 언리얼 런타임 시스템에 의해 관리된다
즉, 가비지 컬렉션, 리플렉션, 레플리케이션 등의 장점을 활용할 수 있다
다만 성능에 영향을 줄 수 있기에,
굳이 필요 없는 속성에는 달지 않는 것이 좋다
- bCanEverTick
이 속성이 true인 경우엔 Tick() 함수가 매 프레임마다 호출된다
지금은 Tick() 함수가 굳이 필요 없으므로 false로 지정한다
Tick() 함수의 로직은 매 프레임마다 수행되므로 성능에 큰 영향을 주기에
필요한 클래스만 켜주는 것이 좋다
- CreateDefaultSubobject<>()
Subobject를 필수적으로 포함시키기 위해서 호출하는 함수이다
- NewObject<>()
만약, 선택적 포함을 원할 때는
NewObject<>() 함수를 호출하고
사용하는 경우에는 등록 함수인 RegisterComponent()를 반드시 호출해야 한다
이렇게 해야 해당 컴포넌트가 월드의 시간과 물리 처리에 등록된다
// Init에서
psc = NewObject<UParticleSystemComponent(OwnerActor);
// 사용이 필요한 부분에서
if (psc)
{
psc->SetTemplate(Particle);
psc->RegisterComponent();
}
- CreateDefaultSubobject<>() 함수에 전달되는 문자열
해당 문자열은 액터에 속한 컴포넌트를 분류해서
보여주기 위해 Hash 값 생성에 사용된다
따라서 다른 컴포넌트와 중복되지 않는 유일한 문자열을 지정해야 하고
본인의 스타일에 맞게 문자열을 작성해 쉽게 분류시킬 수 있다
- SetRootComponent(), SetupAttachment(GetRootComponent())
반드시 가장 기본이 되는 컴포넌트에는
SetRootComponent()를 작성해야 하고
그 외의 컴포넌트들은 반드시 RootComponent를 가져와 붙이는
SetupAttachment(GetRootComponent())를 작성해야 한다
- SetRelativeLocation(FVector(...))
기본적으로 0,0,0이 Default이기에
본인이 원하는 값으로 초기화가 되길 바란다면
SetRelativeLocation을 활용하면 된다
- VisibleAnywhere 키워드
UPROPERTY() 매크로에는 지정자(Specifier)를 설정할 수 있다
특히, VisibleAnywhere 키워드를 작성하면
에디터에서 해당 컴포넌트 속성을 볼 수 있고 Edit은 불가능하다
주의할 점은
속성이 값인 경우에는 당연히 볼 수만 있고 Edit은 불가능하지만
속성이 TObjectPtr인 경우에는 주소이고 메모리에 접근해서 Edit이 가능하다
즉, TObjectPtr 속성의 경우에는
VisibleAnywhere을 작성해도 Edit이 가능하기에
Edit을 막고 싶은 경우에는 const를 이용해서 Edit을 막아야 한다
'게임 엔진 > [코드조선] 언리얼' 카테고리의 다른 글
언리얼 Actor - UPROPERTY()의 Specifier (0) | 2024.05.11 |
---|---|
언리얼 Actor - 언리얼 C++ 자료형 (0) | 2024.05.11 |
언리얼 기본 요소 - World (0) | 2024.05.11 |
언리얼 기본 요소 - Actor (0) | 2024.05.11 |
언리얼 기본 요소 - Component 상속 구조 (0) | 2024.05.11 |