Unreal 엔진

[C++로 개발하는 언리얼] 2장. 클래스 생성하기

원소랑 2019. 12. 20. 00:59

.

2장. 클래스 생성하기

UE4 객체들은 참조 횟수 및 메모리 관리 대상, C++ 키워드 new를 사용한 직접 메모리 할당은 안 됨. 대신, UObject 파생된 것들은 ConstructObject 함수로 인스턴스화. C++ 클래스(UClass*)에서 파생된 Blueprint를 필요로함. 단순히 블루프린트를 가리키는 포인터.

UCLASS 내, 블루프린트에서 참조하려면...

TSubclassOf<UObject> UClassOfPlayer;

// Display any UClass

FSoftObjectPath, StaticLoadObject 리소스 로드는 하드코딩. 비권장.

UE4는 실제로 클래스 인스턴스를 내부적으로 생성하므로 인스턴스화할 UCLASS 복사본을 만들기 위해서는 특별한 팩토리 함수를 호출해야 함.

UObject 파생 클래스를 생성할 때는 특별한 UE4 엔진 함수를 사용해 클래스를 인스턴스화해야 함.

객체 메모리 관리를 일부 수행. 댕글링 포인터가 존재하지 않게 함.

AActor 클래스 파생이 아닌 UObject 파생 클래스 인스턴싱은 NewObject<> 전역 함수 사용해야 함. (UWorld::SpawnActor<>사용하지 않음)

new 로 UObject 파생 클래스 인스턴싱 하면 안 됨.

인스턴싱에 필요한 최소 두 가지

- UClass 참조

- 블루프린트 클래스로 파생된 원래 C++

구동 원리

NewObject 로 UObject 인스턴스화 = 블루프린트 클래스 유형의 객체를 인스턴스화하고 C++포인터 리턴.

NewObject, ConstructObject

팩토리 함수들. 직접 객체 생성하지 말고 팩토리 함수에 객체 만들어 달라고 요청.

두 함수 비교는 무의미.

UObject 파생 클래스 파괴하기

지울 준비가 됐을 때 ConditionalBeginDestroy() 를 호출해 해제 시작. UObject 파생 객체에 delete 키워드 사용하지 않는다.

엔진에게 삭제 대상 객체를 표시. 실제 회수는 호출 시점보다 좀 더 뒤. 가비지 컬렉션 호출. 컬렉션 주기는 Engine/Config/BaseEngine.ini 에 선언돼있고, 기본값 60

>> 편집 / 프로젝트 세팅 / 엔진 / Garbage Collection 에서 확인 가능.

GetWorld()->ForceGarbageCollection(true); 호출로 메모리 강제 정리.

구조체 = USTRUCT()

열거형 = UENUM()

함수 = UFUNCTION()

.

.

.

728x90
반응형