우선 애셋은 강참조와 약참조로 나눠서 할 수 있다.
강참조는 해당 참조를 가지고 있는 UObject 인스턴스가 생성되면 모든 강참조 애셋들도 로드합니다.
약참조는 애셋의 경로만을 가지고 있고 로드의 시점은 프로그래머가 런타임중에 결정할 수 있습니다.
/** construction start sound stinger */
UPROPERTY(EditDefaultsOnly, Category=Building)
USoundCue* ConstructionStartStinger;
이런식으로 블루프린트 에디터에 변수를 노출시켜 애셋을 래퍼런스할 수 있는데, 이는 강참조로 래퍼런스하는 하나의 방법이다.
해당 프로퍼티를 가진 UObject가 로드되면 해당 변수가 래퍼런싱하는 애셋도 같이 로드된다.
대신 블루프린트클래스만이 애셋을 넣을 수 있는 것으로 보인다. (ASF2OJTBattleTile*
로 했더니 레벨에 있는 것 밖에 되지않는다. ASF2OJTBattleTile
에 BlueprintType을 넣어줘도 안된다.)
하지만 무언가 스폰하거나 할 때 단순 UObject
의 포인터보다는 UClass
포인터를 받는 프레임워크 함수들이 많다.
UClass
는 해당 클래스의 CDO와 해당 클래스 "자체"의 정보(Reflection Data)를 가진 클래스이다.
private:
//UPROPERTY(EditAnywhere)
//TSubclassOf<ASF2OJTBattleTile> BattleTileClass;
UPROPERTY(EditDefaultsOnly)
**UClass* BattleTileClass;**
하지만 이름으로 보이다시피 ASF2OJTBattleTile
만을 넣고 싶은데 그러한 제한을 걸수가 없다.
그래서 나온게 TSubclassOf
이다.
private:
UPROPERTY(EditAnywhere)
**TSubclassOf<ASF2OJTBattleTile> BattleTileClass;**
이제는 타입에 대한 안전성이 생긴다.
그리고 C++클래스이든 블루프린트클래스이든 둘다 넣을 수 있다.
TSubclassOf
는 단순히 타입 안전성을 고려한 UClass
의 Wrapper이다.
TAssetSubclassOf is now called TSoftClassPtr. A TSoftClassPtr can be used to async load a class (purple peg) from a given path.
이제 Deprecated됐고 TSoftClassPtr
로 대체되었다는 듯하다.
FSoftObjectPath | docs.unrealengine.com
private:
UPROPERTY(EditDefaultsOnly)
FSoftObjectPath BattleTileClass;
A struct that contains a string reference to an object, either a top level asset or a subobject. This can be used to make soft references to assets that are loaded on demand. This is stored internally as an FName | docs.unrealengine.com pointing to the top level asset (/package/path.assetname) and an option a string subobject path. If the MetaClass metadata is applied to a FProperty | docs.unrealengine.com with this the UI will restrict to that type of asset.
내부적으로 FName
으로 애셋의 경로를 저장하고 있는 클래스이다.
대신 애셋이면 아무거나 되어서 타입 안전성은 없는듯하다.
하지만 UPROPERTY로 메타데이터를 설정해주면 블루프린트 에디터에서 설정시 타입 제한은 해주는듯하다.
TryLoad 메서드를 사용하여 로드하고 UObject
포인터를 받을 수 있다.
TSoftClassPtr | docs.unrealengine.com
private:
UPROPERTY(EditDefaultsOnly)
TSoftClassPtr<ASF2OJTBattleTile> BattleTileClass;
템플릿으로 타입 안전성이 좋고 FSoftObjectPath
의 Wrapper클래스이다.
근데 FSoftObjectPtr
도 존재한다... 왜지..?
TSoftClassPtr | docs.unrealengine.com is a templatized wrapper around FSoftObjectPtr that works like a TSubclassOf, it can be used in UProperties for blueprint subclasses
FSoftObjectPtr
의 Wrapper로 만든건가보다. 대신 TSubclassOf
처럼 동작하도록.
TSoftObjectPtr | docs.unrealengine.com
이또한 FSoftObjectPtr
의 Wrapper이다.
FSoftObjectPtr | docs.unrealengine.com
대신 UClass
말고 UObject
포인터에 대해 동작하는...? TSoftObjectPtr
과 TSoftClassPtr
의 명확한 차이를 아직 모르겠다.
클래스 자체말고도 오브젝트 인스턴스의 포인터도 들어가는게 아닐까?