게임 개발 120

[UE4] blueprint의 부모 클래스가 변경되는 현상 해결 방법

blueprint의 부모 클래스가 변경되는 현상 해결 방법 블루프린트를 만들면서 EquippableItem으로 설정하고 저장하였는데 에디터를 다시 구동시키면 이상하게도 부모의 클래스 이름이 PlusItem으로 변경되는 현상이 있었습니다. 인터넷 서칭을 해보니 다음과 같은 글을 찾을 수 있었습니다. My problem is similar. I cannot use File >> Reparent Blueprint (I have renamed the original parent class. But the renamed new class didn't show up). What helped is to add the following line to DefaultEngine.ini below [/Script/Engin..

[UE4] UObject의 참조 카운트(UObject Reference Count)

어떠한 오브젝트의 참조 카운트를 얻을 수 있는 코드입니다. static int32 URamaStaticFunctionLib::GetObjReferenceCount(UObject* Obj, TArray* OutReferredToObjects = nullptr) { if(!Obj || !Obj->IsValidLowLevelFast()) { return -1; } TArray ReferredToObjects;//req outer, ignore archetype, recursive, ignore transient FReferenceFinder ObjectReferenceCollector(ReferredToObjects, Obj, false, true, true, false); ObjectReferenceColl..

[UE4] 액터의 수명 주기, 가비지 콜렉터

액터의 수명 주기 액터의 생명 주기에 대해서 이해를 하고 있어야 겠습니다. 이 문서는 액터의 수명 주기에 대한 일반적 개요서로, 액터가 레벨에 어떻게 인스턴스가 생성 (Spawn) 되고 소멸 (Destroy) 되는지에 대해서입니다. https://docs.unrealengine.com/4.27/ko/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/Objects/Optimizations/ 언리얼 오브젝트 처리 UObject 시스템의 기능에 대한 개요입니다. docs.unrealengine.com 가비지 콜렉터 언리얼 엔진은 자체 스마트 포인터를 제공하며 이를 통해 자동으로 가비지 콜렉션을 수행합니다. [게임 개발/Unreal Engine 기본]..

[UE4] 언리얼 오브젝트의 기능

클래스, 프로퍼티, 함수에 적합한 매크로로 마킹해 주면 UClass, UProperty, UFunction 으로 변합니다. 그러면 언리얼 엔진이 접근할 수 있어, 다수의 내부적인 처리 기능을 구현할 수 있습니다. 자동 프로퍼티 초기화 UObject는 생성자 호출 전 초기화시 자동으로 클래스의 UProperty/네이티브 멤버 모두 0으로 채워집니다. 이후 클래스 생성자에서 커스텀 값으로 초기화 가능합니다. 레퍼런스 자동 업데이트 AActor 또는 UActorComponent가 소멸되면, 리플렉션 시스템에 보이고 있는 그에 대한 모든 레퍼런스는 자동으로 null 이 됩니다. 댕글링 포인터 문제의 소지를 줄인다는 장점이 있지만, 다른 곳에서 포인터를 언제든지 소멸시켜 null이 될 수도 있습니다. 여기서 최고..

[UE4] 스마트포인터 - TSharedPtr, TWeakPtr, TUniquePtr

UE4는 C++11 스마트 포인터의 커스텀 구현을 제공하고 있으며 다음과 같은 이점을 제공합니다. 메모리 누수 방지 스마트 포인터(TWeakPtr, TWeakObjectPtr 제외)는 공유 참조가 존재하지 않을 때 객체를 자동으로 해제합니다. 약한 참조 약한 포인터는 공유 참조에서 발생 할 수 있는, 순환 참조 문제와 삭제된 오브젝트를 참조하는(dangling) 포인터 문제를 방지할 수 있습니다. 스레드 안전 옵션 언리얼 스마트 포인터 라이브러리에는 멀티스레드에 걸쳐 참조 카운팅을 관리하는 코드인 스레드 세이프(thread-safe) 코드가 포함되어 있습니다. 스레드 안정성이 필요하지 않다면 그 대신에 향상된 퍼포먼스를 구현할 수 있습니다. 런타임 안전 TSharedRef는 절대 null 일 수 없으며 ..

[UE4] 문자열 변환 - FName, FText, String

문자열 클래스간 변환 변환 형식 변환 방법 FName → FString TestString = TestName.ToString(); FName → FText TestText = FText::FromName(TestName); FString → FName TestName = FName(*TestString); // 손실 위험 있음. FName이 대소문자 구분 없음 FString → FText TestText = FText::FromString(TestString); FText → FString TestString = TestText.ToString(); // 안전하지 않음. 언어 변환시 손실 위험 때문 FText → FName FText → FString -> FName // 직접 변환 없음 // 손실 위..

[UE4] 문자열 다루기 - FName, FText, String

FName 정적이며 가장 가벼운 문자열 클래스 비교시 대소문자 구분하지 않음 한 번만 저장하며 변경 및 조작 불가능 찾기나 키로 FName에 접근하는 속도 빠름 문자열 비교 FName Name1 = FName(TEXT("TestFName")); FName Name2 = FName(TEXT("TESTFNAME")); FName Name3 = FName(TEXT("TestFName3")); bool bCompare1 = (Name1 == Name2); // true, 대소문자 구분을 하지 않는다 bool bCompare2 = (Name1 == Name3); // false UE_LOG(TestProject, Warning, TEXT("bCompare1=%d bCompare2=%d"), bCompare1, b..

[UE4] 리플렉션

리플렉션 언리얼 엔진의 리플렉션 기능에 대해 예제 코드로 알아 봅시다. 먼저 언리얼 오브젝트 클래스를 만듭니다. UCLASS() class TESTPROJECT_API UMyObject : public UObject { GENERATED_BODY() private: UPROPERTY() int IntValue = 10; UPROPERTY() FString StrValue = "Str"; }; UMyObject를 생성하고 리플렉션 기능을 확인 할 수 있는 코드를 생성합니다. UCLASS() class TESTPROJECT_API ATestProjectGameModeBase : public AGameModeBase { GENERATED_BODY() public: ATestProjectGameModeBase(..

[UE4] CDO (Class Default Object)

CDO(Class Default Object) [게임 개발/Unreal Engine 기본] - [UE4] 언리얼 오브젝트(UObject) 언리얼 오브젝트 글에서 기존 C++이 제공하지 못하는 추가 기능을 제공하기 위해 메타 정보가 자동으로 생성되는 것을 언급하였습니다. 메타 정보는 UClass라는 특별한 클래스를 통해 보관됩니다. UClass에는 언리얼 오브젝트에 대한 클래스 구조, 멤버 변수, 멤버 함수에 대한 정보들을 기록합니다. 단순히 검색하는 것에서 더 나아가, 런타임에 특정 클래스를 검색해 타입을 알아내 인스턴스의 멤버 변수 값을 변경하거나 특정 인스턴스의 멤버 함수를 호출하는 것이 가능합니다. Java나 C#에서는 이와 유사한 기능을 리플렉션이라는 이름으로 제공합합니다. 모든 언리얼 오브젝트 ..

[UE4] 언리얼 오브젝트(UObject)

언리얼 오브젝트(UObject) 언리얼 오브젝트는 언리얼 엔진의 관리를 받는 특수한 객체입니다. 그렇다고 모든 클래서가 UObject가 되어야 하는 것은 아니며 필요에 따라서 네이티브 클래스를 사용할 수 있습니다. 언리얼 엔진에서는 클래스를 구분하기 위해 접두사를 사용하고 있습니다. 일반 C++ 오브젝트 : F로 시작 언리얼 오브젝트(UObject) : U로 시작 Actor 오브젝트 : A로 시작 언리얼 오브젝트는 언리얼 엔진 내에서 객체를 쉽고 효율적으로 관리하기 위해 고안되었습니다. 일반 C++ 객체가 언리얼 오브젝트로 될 경우 다음의 기능들이 자동으로 향상됩니다. 1. CDO(Class Default Object) : 객체의 초기 값을 자체적으로 관리합니다. 2. Reflection : 객체 정보를..