UE5

StaticClass, TSubClassOf, FSoftObjectPath, FScopeLock

게임 개발 2024. 9. 6. 02:05
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라고 부르던데 비슷해서 조금 놀랐당.

추가로 엔진 뜯어보려면 서버 쪽도 조금씩 공부해놔야겠다.