기존의 C++에 존재하는 assertion을 발생하는 키워드는 #error 전처리기와 assert 메크로를 통해 발생시킬 수 있습니다. Assert 동적으로 배열을 할당 할 때 배열 사이즈는 양수이여야 하기 때문에 이를 assert를 통해서 검증할 수 있습니다. #include #include using namespace std; void foo (int age) { // assert를 이용한 유효성 확인 assert(age > 50); int* p = new int[age]; } int main(int argc, char* argv[]) { foo(26); return 0; } 위와 같이 assert를 이용한다면 오류가 발생하면 개발자에게 프로그램이 다양한 정보(Call Stack, 발생 위치 등)를 ..
이번 글은 Lyra프로젝트의 ExperienceManagerComponent::StartExperienceLoad함수 분석글입니다. Experience Load과정을 전부 다 정리하기에는 너무빡세서 제가 햇갈렸던 부분과 몰랐던 부분 위주의 개념이 들어간 함수 하나만 잡아서 분석 한 글입니다. AssetStreaming, FStreamableManager, FStreamableHandle의 간단한 개념과 비동기 로드시 어떤 흐름으로 Delegate들을 호출하는지 간단한 흐름만 분석하였습니다. 실제 GetPrimaryAssetID내부의 CDO와 연관성이라던지 좀더 자세한 부분들은 Lyra프로젝트를 통해 알아봐주시면 감사하겠습니다 ㅎㅎ (추후 정리 할 수 있으면 정리 할거같네요) 호출과정 일단 Lyra의 Ex..
UE의 스마트 포인터 라이브러리에는 아래 4가지 스마트 포인터가 있습니다. - TSharedPtr - TSharedRef - TWeakPtr - TUniquePtr 위 스마트 포인터들은 메모리 할당과 추적의 부담을 해소해주도록 설계된 C++11의 스마트 포인터의 커스텀 구현입니다. 위 스마트 포인터들은 언리얼 오브젝트(UObject)에 대해 사용할 수 없습니다. 언리얼 오브젝트(UObject)는 별도의 메모리 추적 시스템(GC)를 사용하기 때문입니다. (UObject GC에 의헤 TSharedPtr로 관리됩니다. 그래서 TSharedPtr로 UObject를 가르킬 수 없습니다. => 사이클 발생) TSharedPtr 위에서 설명한것과 같이 TSharedPtr은 UObject를 가르킬 수 없습니다. UOb..
1시간 정도 해매다가 해결한 에러입니다. 원인부터 설명하면 저는 일단 filename.generated.h 를 두번 참조하여 발생하였습니다...;; 당연히 한번만 include 하는것이 정상이지만 정신없이 파일들 만들고 필요한 헤더 파일들을 추가하다 발생한 문제인듯합니다. 처음에는 "Severity Code Description Project File Line Suppression State Error C1189 #error: "LyraCloneEquipmentDefinition.generated.h already included, missing '#pragma once' in LyraCloneEquipmentDefinition.h" LyraClone C:\Rookiss\Rookiss_Lyra\Unrea..
APawn* ULyraCloneEquipmentInstance::GetTypedPawn(TSubclassOf PawnType) const { APawn* Result = nullptr; if (UClass* ActualPawnType = PawnType) { if (GetOuter()->IsA(ActualPawnType)) { Result = Cast(GetOuter()); } } } 위 코드에서 GetOuter()->IsA(PawnType)을 호출하고 있습니다. IsA함수는 Returns true if this object is of the specified type. https://docs.unrealengine.com/4.26/en-US/API/Runtime/CoreUObject/UObject/UO..
이번글은 제가 햇갈렸던 Delegate에 대한 글입니다. DECLARE_DELEGATE_OneParam(FMyDelegate, int32); ---------- UCLASS() class DELEGATETEST_API TestClass: public AActor { GENERATED_BODY() // .... public : FMyDelegate TestClass_OneParam; }; ---------- void TestCharacter::CallDeleFunc_Single_OneParam(int32 nValue) { UE_LOG(LogTemp, Warning, TEXT("CallDeleFunc_Single_OneParam / %d"), nValue); } void TestCharacter::Begin..
이번글은 제가 Lyra프로젝트 클론코딩하다 UE_INLINE_GENERATED_CPP_BY_NAME 메크로안 매개변수를 잘 못 전달하여 LNK2005에러를 해결한 과정과 UE_INLINE_GENERATED_CPP_BY_NAME를 정리한 글입니다. 일단 해결한 방법은 ㄱ무식하게 작성했던 파일들을 노트패드에 다 복붙해두고 만들었던 파일 전부 다 삭제후 파일들을 다시 하나씩 만들어 빌드를 한단계씩 해나가며 원인을 찾아 해결하게 되었습니다. 원인은 LyraPawnComponent_CharacterParts.cpp .h, LyraControllerComponent_CharacterParts.cpp .h 이렇게 각각 4개씩 있고 각각의 .cpp파일 상단에 UE_INLINE_GENERATED_CPP_BY_NAME( ..
Lyra프로젝트를 보다 보면 거의 모든 cpp 클래스 생성자에 ALyraCharacter(const FObjectInitializer& ObjectInitializer = FObjectInitializer::Get()); 위처럼 되어 있는것을 볼 수 있습니다. FObjectInitislzier클래스는 무엇이며 생성자의 인자로 왜 전달하는 것인지 궁금하여 정리하게 되었습니다. UE 포럼에도 비슷한 글이 있었습니다. 생성자에 'FObjectInitializer'이거 왜쓰냐? 무슨 차이냐? 라는 질문인데 https://forums.unrealengine.com/t/do-i-have-to-use-fobjectinitializer-in-constructor/363383/3 Do I have to use FObje..