문제 상황
-
상황: 스킬 (UObject) 마다 블프를 만들어서 각 캐릭터에게 세팅해주고 싶은 상황
-
문제: 데이터 테이블에서 스킬을 할당하려고 하는데, 하단의 Row Editor에서 슬롯이 나타나지 않는다.
-
찾아본 링크
UObject doesn't appear inside a DataTable?
- 이 링크에서는 이렇게 말하고 있다. Blueprint는 클래스이기 때문에 TSubclassOf<>를 통해 참조된다고... UObject is a blueprintable type, you can create Blueprints and assets that use UObject as a base. UObject is not a common base type for all objects in the content browser though. Blueprints are referenced via TSubclassOf<> because they are classes, while some assets like materials and particles are not subclasses, but are objects in their own right. Where possible you should also use the ‘Soft’ variations, otherwise when you load the data table you will also load all the objects it references: https://docs.unrealengine.com/en-US/…Ptr/index.html 123 IIRC you cannot use ‘Instanced’ in a Data Table because the objects do not end up being properly serialized and do not have a valid outer. If you want to do that, use a DataAsset instead.
정리를 해보자면!
-
클래스
-
애셋
- 데이터가 이미 저장되어있는 것이 애셋 (스폰되기 전인 클래스. 인스턴스까지는 아닌.)
- 예: 애셋은 뭐냐면 클래스도 아니고 뭐도 아니고 데이터 뭉치인데, 데이터 뭉치가 테이블이든 애셋이든 메시가 될 수 있다. 이미지도 될 수 있다. 다 애셋이다. 데이터테이블은 게임 실행 전에 데이터들을 저장해놓는 애셋이다. 실행 전부터 데이터의 형태로 가지고 있어야 한다.
-
인스턴스
-
TSubclassOf<MyClass>
-
언리얼 클래스 타입 체크
-
객체처럼 다룰 수 있게 해준다. 메모리주소까지는 아니고. 어떤 클래스타입을, 변수에 저장하고 다룰 수 있게. 리플렉션으로 가능한 것. int 자체가 변수가 될 수는 없는 것처럼.. 객체 타입을 실제 객체처럼 다루고 싶을 때가 있다. 이 때 쓰는 것이고. 이것을 가능하게 해주는 것이 리플렉션이다.
-
TSubclassOf<MyClass> MyClassType;
MyClass
를 포함해서 이를 상속한 모든 클래스 ‘타입’ 들을 저장할 수 있는 변수
하드 레퍼런싱과 소프트 레퍼런싱
-
하드 레퍼런싱 (한국어로 강한 참조)
-
TObejctPtr
처럼 바로 꼽아주는 것
-
바로 그 녀석을 바인딩을 해버린다.
-
소프트 레퍼런싱 (약한 참조)
-
TSoftObject
-
그녀석의 주소를 저장해뒀다가, 필요할 때 그 주소를 가서 애를 가서 데리고 옴
-
인스턴스를 가지고 있는게 아니라서 로드 과정이 필요하다. LoadSynchrounous() 로 메모리에 올려줘야 한다. 동기적으로. 메모리 주소가 아닌 디렉토리 주소로 가서 인스턴싱 할 때가 되었단다? 인스턴싱을 하게 된다.
🔗 Reference
강의에도 동일 내용이 있는데 아직 안들어서 몰랐다. 수강 후 다시 한 번 더 내용을 정리해야겠다