StaticClass
A라는 클래스를 만들면
A::StaticClass(); 이런 문법이 가능한데
C#에는 리플렉션이 가능하다.
리플렉션이라면 자기스스로 참조할 수 있도록 하는 것인데,
C++에는 없는 문법이다.
얘를 들어 C#에서는 해당 이름을 가진 변수가 필드에 있다면 값을 넣어주는 함수가 가능하다.
이처럼 필드에 있다면 특정 이름을 통해 리플렉션해서 해당 변수를 찾을 수 있다는 것이다.
StaticClass는 결국 UClass라는 것인데,
이는 즉 메타데이터를 뜻한다.
즉 클래스들은 해당 메타데이터를 이용하여 필드에서 리플렉션 할 수 있다.
변수 이름이 뭔지, 함수 이름이 뭔지, id는 뭔지 등등을 알 수 있다.
실제로 C++에서 이를 추적하면 필드가 나오고, 그 필드를 타고 들어가면
이름이 뭔지, ID가 뭔지 정보가 적혀있다.
이런 것들을 하나하나 만들기 때문에 언리얼이 빌드가 느려지는 이유 중 하나이다.
TSubClassOf
그럼, TSubClassOf는 뭐냐?
TSubClassOf도 UClass를 저장할 수 있다.
다른 점은 이제 TSubClassOf<A> a = B; 가 성립되려면
B는 A를 상속받은 클래스여야 한다는 것이다.
즉 TSubClassOf는 해당 클래스를 상속 받은 애들만 넣을 수 있도록
한 번 랩핑해 놓은 안전 클래스이다.
즉 안전하게 타입을 저장하는 클래스이다.
FSoftObjectPath
FSoftObjectPath 타입 변수가 로딩 되어있는 가? 바로 가져온다.
FSoftObjectPath 타입 변수가 로딩이 되어있지 않는 가? null 반환을 한다.
사용 예는 다음과 같다.
TSubObjectPtr<AssetType>& AssetPointer로 받아온 애를
FSoftObjectPath& AssetPath = AssetPointer.ToSoftObjectPath 로 받아오면 해당 기능을 쓸 수 있다.
FScopeLock
FScopeLock은
기본적으로 멀티스레딩을 지원하는 것과 관련이 있다.
에디터가 아직 켜지기 전에는 멀티스레드 환경이 안전하지 않다 safe하지 않기 때문에,
한 명씩 들어와라 하고 락 걸어주는 것이다.
그럼 들어오게 할지 말지는 어떻게 정할까?
FSoftObjectPath 로 로딩됐니? 하고 물어본 다음에 락 풀어주고 들어오라 하는 방식으로
둘을 함께 쓸 수 있다.
동기 로딩에서 주로 사용함
추가로 템플릿은 무조건 헤더파일에서 만들어줘야한다.
왜냐하면 코드가 따로 만들어지는 방식이기 때문에
cpp에서 만들어지면 좀 많이 복잡해진다.
번외로 엔진 코드 보다가 놀랐던 게 있다.
ini 파일을 들어가보면 c++ 파일 경로 찾는 걸 넣어주는 공간을 보면
Scripts/../.. 이렇게 되어있었다.
유니티도 script라고 부르던데 비슷해서 조금 놀랐당.
추가로 엔진 뜯어보려면 서버 쪽도 조금씩 공부해놔야겠다.
'UE5' 카테고리의 다른 글
엔진 커마 시작하는 법 (3) | 2024.09.08 |
---|---|
Experience (1) | 2024.09.07 |
All about Soft and Weak pointers (소프트 포인터와 약한 포인터의 모든 것) (0) | 2024.08.27 |
UBlueprintFunctionLibrary (0) | 2024.08.21 |
Conditional Door(player needed key) & bullet shooting (0) | 2024.06.20 |