[CPP] static_assert
UE52024. 2. 7. 23:14[CPP] static_assert

기존의 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, 발생 위치 등)를 ..

[UE] Lyra ExperienceManagerComponent::StartExperienceLoad
UE52024. 1. 25. 20:21[UE] Lyra ExperienceManagerComponent::StartExperienceLoad

이번 글은 Lyra프로젝트의 ExperienceManagerComponent::StartExperienceLoad함수 분석글입니다. Experience Load과정을 전부 다 정리하기에는 너무빡세서 제가 햇갈렸던 부분과 몰랐던 부분 위주의 개념이 들어간 함수 하나만 잡아서 분석 한 글입니다. AssetStreaming, FStreamableManager, FStreamableHandle의 간단한 개념과 비동기 로드시 어떤 흐름으로 Delegate들을 호출하는지 간단한 흐름만 분석하였습니다. 실제 GetPrimaryAssetID내부의 CDO와 연관성이라던지 좀더 자세한 부분들은 Lyra프로젝트를 통해 알아봐주시면 감사하겠습니다 ㅎㅎ (추후 정리 할 수 있으면 정리 할거같네요) 호출과정 일단 Lyra의 Ex..

[UE] Unreal Smart Pointer
UE52024. 1. 23. 23:33[UE] Unreal Smart Pointer

UE의 스마트 포인터 라이브러리에는 아래 4가지 스마트 포인터가 있습니다. - TSharedPtr - TSharedRef - TWeakPtr - TUniquePtr 위 스마트 포인터들은 메모리 할당과 추적의 부담을 해소해주도록 설계된 C++11의 스마트 포인터의 커스텀 구현입니다. 위 스마트 포인터들은 언리얼 오브젝트(UObject)에 대해 사용할 수 없습니다. 언리얼 오브젝트(UObject)는 별도의 메모리 추적 시스템(GC)를 사용하기 때문입니다. (UObject GC에 의헤 TSharedPtr로 관리됩니다. 그래서 TSharedPtr로 UObject를 가르킬 수 없습니다. => 사이클 발생) TSharedPtr 위에서 설명한것과 같이 TSharedPtr은 UObject를 가르킬 수 없습니다. UOb..

[UE] C1189 에러 해결방법
UE52024. 1. 22. 19:07[UE] C1189 에러 해결방법

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..

[UE] IsA
UE52024. 1. 20. 21:16[UE] IsA

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..

[팁] Visual Studio 띄운 창 팝업 사이즈 조절
2024. 1. 13. 16:20[팁] Visual Studio 띄운 창 팝업 사이즈 조절

위처럼 띄운 파일의 이름이 다 보이지 않아서 파일이름이 비슷한경우 헷갈려서 마우스 커서를 위에 가져다 대고 1초정도 있는게 너무 귀찮았습니다... 해결방법은 Width를 400으로 설정! 잘 보이는 군요.. ㅎㅎ

[UE] UObject::CreateUObject Delegate 바인딩 언제, 어디서, 왜 쓰는지
UE52024. 1. 5. 23:19[UE] UObject::CreateUObject Delegate 바인딩 언제, 어디서, 왜 쓰는지

이번글은 제가 햇갈렸던 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..

[UE] UE_INLINE_GENERATED_CPP_BY_NAME + LNK2005
UE52024. 1. 3. 17:23[UE] UE_INLINE_GENERATED_CPP_BY_NAME + LNK2005

이번글은 제가 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( ..

image