1. 개요
오늘은 아이템 시스템과 게임 흐름 로직을 구현하는 강의를 들으면서 따라해 보는 와중에 저번에도 지나가면서 본 기억이 있는 TSubclassOf 함수를 이용하면서 TSoftClassPtr에 대한 언급이 나왔다. 강의에서 사용한 함수는 TSubclassof를 사용했다. 그 이유인 즉슨 TSoftClassPtr을 사용하려면 로직적으로 추가적인 처리가 필요하기 때문에 간단히 사용 가능한 TSubclassOf를 사용한 것이었다. 그러면서 덧붙인 이야기가 있었는데 TSubclassOf 함수를 사용하면 메모리에 로드가 되기 때문에 메모리에 로드를 하지 않고 사용하려면 TSoftClassPtr을 사용하는 것이 적절하다는 말이었다. 이야기를 듣다 보니 각 함수를 쓰는 것에 장단점이 따르는 것으로 보이는데 앞으로 자주 보게 될 것이라는 언급도 함께였기 때문에 이번에 보다 자세히 짚고 넘어가기 위해 정리하게 되었다.
2. TSubclassOf vs. TSoftClassPtr
TSubclassOf, TSoftClassPtr은 언리얼 엔진에서 Asset과 클래스를 참조하는데 사용되는 방법이다
1. TSubclassOf
특정 클래스의 서브클래스만을 저장할 수 있는 템플릿 래퍼
- 주로 스폰할 클래스 지정에 사용
- 클래스의 형식을 지정
- 객체 인스턴스가 아님 ㅡ> 위치나 트랜스폼 접근 불가
- 클래스가 하드 참조됨
- UClass* 대신 사용 가능 ㅡ> But, 그 클래스 자체를 설정할 순 없음
- Type Safety(안전성) 보장
- 블루프린트에서 표시 및 사용 가능
TSubclassOf<AActor> ActorClass=AMyActor::StaticClass();
위와 같이 코드 작성시 AActor를 상속받은 클래스인 AMyActor를 설정 가능
2.TSoftClassPtr
특정 클래스 타입을 가리키지만, 경로 기반의 약한 참조(Weak Reference)를 유지하는 포인터
- FSoftObjectPtr을 감싸는 형태의 래퍼(wrapper)
* FSoftObjectPtr : UObject를 가리키는 약한 참조(weak Reference)를 유지하는 포인터 - TSoftObjectPtr처럼 FSoftObjectPath를 사용하여 클래스의 경로 저장
- 직접적인 메모리 점유 X ㅡ> LoadSynchronous() or LoadAsync()로 로드해야 사용 가능
- 블루프린트에서 표시 및 사용 가능
- 필요할 때 Get()을 통해 실제 UClass*를 얻어 인스턴스 생성 가능 ㅡ> 위치나 트랜스폼 접근 가능
3.TSubclassOf와 TSoftClassPtr의 차이
TSubclassOf<T> | TSoftClassPtr<T> | |
레퍼런스 타입 | 강한 참조(Strong Reference) | 약한 참조(Weak Reference) |
사용 가능 시점 | 즉시 사용 가능 | 로드 후 사용 가능 (LoadSynchronous(), LoadAsync()) |
3. 정리
오늘은 앞으로 자주 보게 될 TSubclassOf와 TSoftClassPtr의 특징과 차이점에 대해 알아보았다. 두 함수에 대해 알아보며 느낀점은 확실히 각각의 쓰임새가 명확한 함수들이라는 것이다.
TSubclassOf의 경우 메모리에 로드되어 있는 클래스를 지정할 경우 사용하기에 적합하다. 특히 게임이 시작하면 즉시 스폰해 줘야 하는 클래스의 경우 별도의 로딩 과정이 필요 없는 편이 좋기 때문에 TSubclassOf가 적합하다. 하지만 메모리에 해당 클래스가 로드되어 있어야 하기 때문에 메모리가 낭비될 가능성이 증가한다. 반대로 게임이 시작할 때 플레이어가 선택 가능한 여러 캐릭터들을 모두 메모리에 올려두는 것은 비효율적이다. 때문에 TSoftClassPtr을 이용해 필요할 때만 해당 클래스를 로드하는 형식으로 사용하면 메모리를 절약할 수 있다. 물론 이러한 특징 때문에 메모리를 절약하면서 동적으로 로딩해 유연하게 컨텐츠 관리를 할 순 있지만, 로딩 과정이 필요하기 때문에 그에 따른 딜레이가 발생할 수도 있다. 대신 인스턴스를 생성해서 위치나 트랜스폼에 접근이 가능하다는 장점이 있기도 하다.
비슷한듯 다른 두 함수에 대해 알아보았는데, 결국은 내가 어떤 곳에 사용할지에 따라 적합한 함수가 달라질 것이다. 그러니 두 함수의 특징을 기억해 두었다가 어떤 함수를 선택하는 것이 이로울지 판단할 수 있도록 해야겠다.
https://m.blog.naver.com/4131oo/222001765270?utm_source=chatgpt.com
ue4 애셋 참조 유형과 동기/비동기 로딩
참고 1) https://docs.unrealengine.com/ko/Programming/Assets/ReferencingAssets/index.html &#...
blog.naver.com
https://cru6548.tistory.com/42?utm_source=chatgpt.com
TSoftClassPtr / TSubclassOf 에 대하여
+ 이 글은 작성자가 직접 공부하고 복습하며 작성한 글입니다. 만약 직접 작성하지 않았다면, 꼭 출처를 밝히겠습니다! + 이 글은 개인적인 공부를 바탕으로 작성되었기에, 틀린 부분이 있을 수
cru6548.tistory.com
[UE5] 비동기 애셋 로딩 : TSoftObjectPtr와 TSubclassOf의 차이점
TSoftObjectPtr와 TSubclassOf는 Unreal Engine에서 자산과 클래스를 참조하는 데 사용되는 두 가지 서로 다른 방법입니다. 이 두 가지 방법은 다른 용도로 사용되며, 그에 따라 다른 방식으로 작동합니다.
velog.io
'언리얼엔진(UE)' 카테고리의 다른 글
[UE] UMG를 활용한 게임 HUD 및 WidgetComponent를 이용한 HP바 (0) | 2025.02.13 |
---|---|
[UE] 타이머 사용 시 유의 사항과 해결방법 (0) | 2025.02.12 |
[UE] 월드 좌표계와 로컬 좌표계 (World Space, Local Space) (1) | 2025.02.06 |
[UE] 액터 생애주기(Actor Life Cycle) (0) | 2025.02.05 |
[UE] Lerp (선형 보간, Linear Interpolation) (0) | 2025.02.04 |