05
24

언리얼은 무조건 UObject에서 파생된다.

언리얼엔진에서 관리되는 가비지 컬렉션 쓸라면 UObject를 상속 받아야함

 

1. CDO

UClass() 매크로를 구성하면 언리얼 클래스가 된다.

컴파일 단계에서 언리얼 오브젝트마다 UClass가 생성된다면,

실행 초기의 런타임 과정에서는 언리얼 오브젝트 마다 클래스 정보와 함께

언리얼 오브젝트의 인스턴스가 생성된다. <- 이 인스턴스는 언리얼 기본 세팅을 지정하는데 사용함.

클래스 기본 객체 (Class Default Object) CDO라고 함.

 

CDO로 복사해서 실제로 런타임에서는 복사본으로 작동한다. 

CDO를 만듬으로서 오브젝트를 생성할때마다 매번 초기화 안하고 기본 인스턴스를 미리

만들어놔 복제하는 방식으로 인스턴싱같은 기술? 인가보다.

 

언리얼 오브젝트의 로딩은 

모듈 로딩->모듈에 속한 모든 UObject의 클래스 정보 등록 -> 각 클래스 정보의 CDO 객체 생성

-> 언리얼 오브젝트의 생성자를 호출해 CDO 완성

 

2. UHT? GENERATE_BODY?

언리얼 헤더 툴(UHT)에서 Generated.h 생성함, 헤더 맨 마지막에 와야만 함.

GENERATED_BODY() 매크로는 복사생성자,

기본 UE 타입 시스템에 자동으로 생성된 기능을 포함하도록 확장된 매크로 GENERATED_BODY 

PRIVATE로 생성자를 외부에서 사용 못하게, 언리얼 메카니즘에서 벗어나지 않게끔한다.

 

https://dlemrcnd.tistory.com/96?category=517587 

 

UE5 - C++와 블루프린트 연동 UPROPERTY(), UFUNCTION()

UPROPERTY() UPROPERTY()는 변수에 붙는 리플렉션 매크로다. 매크로에 인자값을 넣어서 용도에 맞게 사용이 가능, 인자 값 순서는 상관이 없지만, 규칙이 존재함 1. 변수 공개 & 수정 권한 VisibleDefaultsOnly

dlemrcnd.tistory.com

 

이전 포스팅에서 UCLASS, UFUNCTION, UPROPERTY의 매크로에 대해서 다뤘는데,

이런 매크로는 상속관계를 맺는다. 그래서 기본적으로 AACTOR를 상속받은 액터 클래스는

블루프린트 가능하게 되어진다.

액터는 거의 모든 UCLASS 매크로 가 붙어져있어서

액터는 기본적으로 블루프린트 매크로를 굳이 안붙여도 됨.

 

3. New가 아닌 언리얼 생성, 팩토리 함수

블루프린트 드롭다운 메뉴에서 받아올수있는것,

new 대신 특별한 팩토리 함수를 호출하도록 요구함

AActor는 SpawnActor<>

UObject 인스턴스화는 ConstructObject<> 또는 NewObject<>를 사용한다.

언리얼 5로 넘어가면서 ConstructObject를 배제했다 블루프린트에는 아직 사용가능

 불편하게 NewObject에는 호출마다 GetRransientPackage()를 전달해야하는 첫번째 매개변수가 있음

ObjectType* object = NewObject<ObjectType>(ObjectType*)GetTransientPackage(), ObjectType::StaticClass());

ObjectType* obejct = ConstructObject<ObjectType>(UClassReference) 오브젝트 인스턴스화가능

 

StaticClass()를 사용하면 CDO, 오브젝트 베이스 UClass* 를 얻을 수 있다. 

GetTranientPackage() 단순 휘발성 패키지 얻어옴,  ConstructObejct와 다르게 좀 더 많은 파라미터 제공

팩토리 디자인 패턴를 사용함.

 

4. 언리얼 스마트 포인터

native c++ 가 아닌 언리얼 스마트 포인터는

직접 언리얼 가비지 컬렉션에 속하지 않아도 메모리 프로그래밍할때 사용한다.

TSharedPtr, TWeakPtr, TAutoPtr

언리얼 버젼으로 포팅한것이다.  

 

5. FClassFinder, FObjectFinder 구분해서 사용 

둘다 Constructor Helper로 생성자에서만 사용가능하다. CDO 제작에서만 사용됨

FObjectFinder는 CDO 객체를 찾는다.

반면에 FClassFinder는 UClass객체를 찾는다.

객체 초기화할때 프로젝트에 포함된 다른 클래스나 오브젝트 리소스 가져와야 할때

c++ 코드에서 CDO가 아닌 실제 클래스 가져올때 사용한다. 

static ConstructorHelpers::FClassFinder<APawn> BPClass(TEXT("/Game/Blueprints/Bp_Class"));
if (BPClass.Succeeded() && BPClass.Class != NULL)
{
    // 가져온 BPClass.Class를 통한 작업
}

 

6. FSoftClassReference, TSubClassOf<c++classname>

FStringClassReference 이름에서 해당이름으로 바뀜

스트링으로 참조하겠다는 뜻.

블루프린트에서 MetaClass 태그로 만든것을 해당 c++클래서에서 파생된 블루프린트로만 제한함,

이 방법도 있지만

TSubClassOf<c++classname> // 클래스 레퍼런스를 받는것, CDO 객체를 받아올 수 있음</c++classname>

UClass 이름을 지정해서 객체 받아옴

 

7. ETC

GEngine 엔진 포인터 외부변수

GEngine->AddOnScreenDebugMessage(-1, 10, FColor::Red, TEXT(""))

//블루프린트 Print string과 같은 내용

 

FTimerHandle Timer;

GetWorldTimerManager().SetTimer(Timer, this, ..., 10);

//시간 타이머

 

//매쉬 컴포넌트 생성, 생성자에서만 호출가능

Mesh = CreateDefaultSubobject<UStaticMeshComponent>("이름");

생성자에서만 할당가능함

auto MeshAsset = ConstructorHelpers::FObjectFinder<UStaticMesh>(TEXT("에셋경로"));

if(MeshAsset.Object!=nullptr)//유효 검사

//ConstructHelper로 에셋으로 매쉬를 가져옴

경로 가져오는건 에셋 오른쪽 마우스 경로 복사가 있음.

 

부모자식 하이라키

//오브젝트 계층설정

BoxOne->AttachTo(Root);

BoxTwo->AttachTo(ChildSceneComponent);

ChildSceneComponent->SetRelativeTransform(FTransform(FRotator(0,0,0), FVector(0,0,0), FVector(0.1f)));

 

Tick, TickComponent

액터 틱과 컴포넌트 틱의 차이

PrimaryComponentTick.bCanEverTick = true; 매 틱마다 발생

 

BlueprintSpwanableComponent 추가하면 클래스 추가가능

UCLASS(ClassGroup =(custom), meta =(BlueprintSpawnableComponent))

유클래스 매크로는 상속이된다.

 

열거형 변수 UENUM() 매크로

 

COMMENT