Asset Strong / Weak Reference

원아담·2022년 6월 4일
0

공부.언리얼

목록 보기
1/3
post-thumbnail

우선 애셋은 강참조와 약참조로 나눠서 할 수 있다.

강참조는 해당 참조를 가지고 있는 UObject 인스턴스가 생성되면 모든 강참조 애셋들도 로드합니다.

약참조는 애셋의 경로만을 가지고 있고 로드의 시점은 프로그래머가 런타임중에 결정할 수 있습니다.

강참조

단순 UObject 포인터

/** construction start sound stinger */

UPROPERTY(EditDefaultsOnly, Category=Building)

USoundCue* ConstructionStartStinger;

이런식으로 블루프린트 에디터에 변수를 노출시켜 애셋을 래퍼런스할 수 있는데, 이는 강참조로 래퍼런스하는 하나의 방법이다.

해당 프로퍼티를 가진 UObject가 로드되면 해당 변수가 래퍼런싱하는 애셋도 같이 로드된다.

대신 블루프린트클래스만이 애셋을 넣을 수 있는 것으로 보인다. (ASF2OJTBattleTile*로 했더니 레벨에 있는 것 밖에 되지않는다. ASF2OJTBattleTile에 BlueprintType을 넣어줘도 안된다.)

UClass 포인터

하지만 무언가 스폰하거나 할 때 단순 UObject의 포인터보다는 UClass포인터를 받는 프레임워크 함수들이 많다.

UClass는 해당 클래스의 CDO와 해당 클래스 "자체"의 정보(Reflection Data)를 가진 클래스이다.

private:
	//UPROPERTY(EditAnywhere)
	//TSubclassOf<ASF2OJTBattleTile> BattleTileClass;

	UPROPERTY(EditDefaultsOnly)
	**UClass* BattleTileClass;**

하지만 이름으로 보이다시피 ASF2OJTBattleTile만을 넣고 싶은데 그러한 제한을 걸수가 없다.

그래서 나온게 TSubclassOf이다.

TSubclassOf

private:
	UPROPERTY(EditAnywhere)
	**TSubclassOf<ASF2OJTBattleTile> BattleTileClass;**

이제는 타입에 대한 안전성이 생긴다.

그리고 C++클래스이든 블루프린트클래스이든 둘다 넣을 수 있다.

TSubclassOf는 단순히 타입 안전성을 고려한 UClass의 Wrapper이다.

약참조


TAssetSubclassOf

TAssetSubclassOf is now called TSoftClassPtr. A TSoftClassPtr can be used to async load a class (purple peg) from a given path.

이제 Deprecated됐고 TSoftClassPtr로 대체되었다는 듯하다.


FSoftObjectPath

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

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

TSoftObjectPtr | docs.unrealengine.com

이또한 FSoftObjectPtr의 Wrapper이다.

FSoftObjectPtr | docs.unrealengine.com

대신 UClass말고 UObject 포인터에 대해 동작하는...? TSoftObjectPtrTSoftClassPtr의 명확한 차이를 아직 모르겠다.

클래스 자체말고도 오브젝트 인스턴스의 포인터도 들어가는게 아닐까?



profile
게임 만드는 사람

0개의 댓글