Smart Pointer
- 구조
- 구성
Own the object | Prevent Deletion | Unique Property | Converted by | |
TSharedPtr | yes | yes (ref counting) |
can point null | MakeShared() |
TSharedRef | yes | yes | must point valid object | MakeShareable() |
TWeakPtr | no | no | breaks ref cycle |
- TSharePtr - 참조 카운트 기반 GC, 오브젝트 소유
- TShareRef - Ptr과 동일하나, null값 미허용
- TWeakPtr - Ptr과 동일하나, 오브젝트 미소유
- TUniquePtr - Ptr과 동일하나, 하나의 오브젝트는 여러개의 UniquePtr을 가질 수 없음 ( 소유권 이전은 가능 )
- ( MakeSharable )
Hard, Soft referencing
- 언리얼 애셋 레퍼런스(Hard Reference, Soft Reference) (koreanfoodie.me)
Referencing Assets | Unreal Engine 4.27 Documentation
-
- A가 B를 Hard Reference 하고 있다면, A가 로딩될 때 B도 로딩된다.
반면 A가 B를 Soft Reference 한다면, B 애셋의 경로 등을 string의 형태로 가지고 있다는 뜻이다.
- A가 B를 Hard Reference 하고 있다면, A가 로딩될 때 B도 로딩된다.
Direct Property Reference (Hard Reference)
-
- UPROPERTY를 붙여 변수를 선언하면, 해당 변수(혹은 블루프린트)가 로드될 때 이에 대응하는 애셋 또한 로딩된다.
-
Hard Reference/** construction start sound stinger */UPROPERTY(EditDefaultsOnly, Category=Building)USoundCue* ConstructionStartStinger;
Construction Time Reference (Hard Reference)
-
- ConstructorHelpers 클래스를 이용해 애셋을 로딩할 때도 동일하다.
-
Hard Reference/** gray health bar texture */UPROPERTY()class UTexture2D* BarFillTexture;AStrategyHUD::AStrategyHUD(const FObjectInitializer& ObjectInitializer) :Super(ObjectInitializer){static ConstructorHelpers::FObjectFinder<UTexture2D> BarFillObj(TEXT("/Game/UI/HUD/BarFill"));assert(nullptr != BarFillObj);BarFillTexture = BarFillObj.Object;}
Indirect Property Reference (Soft Reference)
-
- FSoftObjectPath를 이용해 경로를 보관한다. 그 후 TSoftObjectPtr를 사용해 템플릿화 된 코드를 저장한다.
실제로 애셋을 로딩할 때는 LoadObject<T>() 함수를 호출해야 한다. -
Soft ReferenceUPROPERTY(EditDefaultsOnly, BlueprintReadWrite, Category=Building)TSoftObjectPtr<UStaticMesh> BaseMesh;UStaticMesh* GetLazyLoadedMesh(){if (BaseMesh.IsPending()){const FSoftObjectPath& AssetRef = BaseMesh.ToStringReference();BaseMesh = Cast< UStaticMesh>(Streamable.SynchronousLoad(AssetRef));}return BaseMesh.Get();}
- FSoftObjectPath를 이용해 경로를 보관한다. 그 후 TSoftObjectPtr를 사용해 템플릿화 된 코드를 저장한다.
Find / Load Object (Soft Reference)
-
- UPROPERTY를 이용하지 않고, 애셋과 경로 정보를 가지고 직접 애셋을 로드할 수 도 있다.
만약 이미 로드된 애셋(혹은 UObject)을 찾는다면 FindObject<T>()를 사용하면 된다.
만약 로드되지 않은 애셋을 로드하고 싶다면 LoadObject<T>()를 사용한다. -
Soft ReferenceAFunctionalTest* TestToRun = FindObject<AFunctionalTest>(TestsOuter, *TestName);GridTexture = LoadObject<UTexture2D>(NULL, TEXT("/Engine/EngineMaterials/DefaultWhiteGrid.DefaultWhiteGrid"), NULL, LOAD_None, NULL);
- UPROPERTY를 이용하지 않고, 애셋과 경로 정보를 가지고 직접 애셋을 로드할 수 도 있다.
Container
- Common
- 값복사 : FMemory::Memcpy( {복사될 컨테이너}, {복사할 컨테이너}, 복사할 메모리 크기 ( ex, sizeof(int32) * {복사될 컨테이너}.Num )
- 언리얼 배열 초기화 : { 값1, 값2, ... 값n }
- 기본 메서드
- Num : 배열 길이 반환
- Add / Emplace : 끝에 값 추가 ( add는 임시변수에 넣은 다음 컨테이너에 복사하므로, 보통 emplace가 낫다는듯 )
- Contains는 체크용. (if true, get return)값도 얻을거면 Find
- TArray
- 순서 기반 배열
-
- https://docs.unrealengine.com/4.27/ko/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/TArrays/
- 순서를 가진 값의 집합
- Debug시 TArray 내부값을 보려면, Solution Config를 DebugGame으로 바꿔야 함
- {TArray}.AddUninitialized( {int} ) : 해당 TArray에 비어있는 {int}개의 공간을 할당
- c++ 기본 array와 기본 메모리구조 동일? → FMemory::Memcpy 가능
- 기본 구조
- Slack(여유 메모리) 포함 Array → 할당공간 초과시 메모리 재할당
- TSet
- 해싱 기반 배열 ( unique key, 순서 보장 안됨 )
- 각 항목의 해싱값 기반으로 메모리 할당, 탐색은 빠르지만 이터레이션은 느림
- https://docs.unrealengine.com/4.27/ko/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/TSet/
- TMap
- key-value map
- Find( {key} ) → return할때 value의 pointer를 반환하는것에 주의
- 동적배열이라 iteration 속도 괜춘
- 해시 기반이라 searching 빠름 ( TSet 형태 따름 )
- 기본이 key값 Unique. key값 중복 필요하면 TMultiMap 사용
- TSet의 항목을 TPair<KeyType, ValueType>으로 구성한 구조
- UStruct
- Generated_body 매크로 선언시, 실제로는 UScriptStruct 클래스로 구현됨
- 제한적 리플렉션. UPROPERTY만 선언가능, UFUNCTION은 불가
- F가 접두로 붙음
- 힙 메모리 할당(포인터 연산) 없이 스택내 데이터로 사용 ( new, newobject 사용 불가 )
- 힙 메모리 할당(포인터 연산) 없이 스택내 데이터로 사용 ( new, newobject 사용 불가 )
- Generated_body 매크로 선언시, 실제로는 UScriptStruct 클래스로 구현됨
Serialize
- Path Manager
- FPaths
- <FString> Combine ( <FString> PrePath, <FString> PostPath ) : 경로 string을 합쳐주는듯..? 그냥 concat, join이랑 동일한듯..?
- 사이에 "/" 붙여주는 듯
- <void> MakeStandardFileName ( <FString> 변환할 ptr ) : 변환할 ptr을 스탠다트 경로로 바꿔줌 ( 절대경로)
- 현재의 상대경로를 절대경로로 변경 해줌
- <FString> Combine ( <FString> PrePath, <FString> PostPath ) : 경로 string을 합쳐주는듯..? 그냥 concat, join이랑 동일한듯..?
- FPlatformMisc
- <FString> ProjectDir( ) : 프로젝트 루트 경로 반환
- FPaths
'Unreal > UE Architecture' 카테고리의 다른 글
Cpp -> BP Pipeline 1 (0) | 2024.05.17 |
---|---|
문자열 처리 (0) | 2024.05.16 |
UE Macro & Reflection System (0) | 2024.05.16 |
Input (0) | 2024.05.16 |
기본 구성 (0) | 2024.05.16 |