광고


[UE4] ConstructorHelper::FObjectFinder/FClassFinder UE4_CodeSnippet


0. 설명

참고 : 애셋 레퍼런싱의 생성시간 레퍼런싱

SkeletalMeshComponent에 특정 SkeletalMesh 애셋을 찾은 다음, SetSkeletal 해주는 코드 예제 1.

미리 정의된 클래스(블루프린트 클래스)를 찾아내어, BotPawnClass에 지정해주는 코드 예제 2.


1. ConstructorHelper

이름에서 알 수 있듯이 ConstructorHelper는 UObject의 Constructor(생성자)에서만 사용 가능하다.
(즉, CDO 제작에서만 사용된다는 얘기)
아래 FObjectFinder와 FClassFinder의 Line:16 이 생성자에서 호출되었는지 여부를 체크하는 코드이다.

그리고, 아래 코드에서 보겠지만, ConstructorHelper::FObjectFinder 혹은 FClassFinder 객체에 모두 static 키워드를 주었다.
리소스는 여러 언리얼 오브젝트의 인스턴스들이 공유해서 사용하는 자원이므로, 인스턴스마다 불필요하게 애셋을 로드할 필요가 없기 때문이다. 물론 같은 것을 로드하지 않으면 의미가 없을 수도 있지만 말이다.
하지만, 일반적으로 위에 적은 이유들로 static 키워드를 붙이는 것이 관행이라 할 수 있다.


2. ConstructorHelper::FObjectFinder

  1. /** Runtime/CoreUObject/Public/UObject/ConstructorHelpers.h */
  2.  
  3. struct COREUOBJECT_API ConstructorHelpers
  4. {
  5. public:
  6.     template<class T>
  7.     struct FObjectFinder
  8.     {
  9.         T* Object;
  10.         FObjectFinder(const TCHAR* ObjectToFind)
  11.         {
  12.             CheckIfIsInConstructor(ObjectToFind);
  13.             FString PathName(ObjectToFind);
  14.             StripObjectClass(PathName,true);
  15.  
  16.             Object = ConstructorHelpersInternal::FindOrLoadObject<T>(PathName);
  17.             ValidateObject(Object, PathName, ObjectToFind);
  18.         }
  19.         bool Succeeded() const
  20.         {
  21.             return !!Object;
  22.         }
  23.     };
  24. };


3. ConstructorHelper::FClassFinder

  1. /** Runtime/CoreUObject/Public/UObject/ConstructorHelpers.h */
  2.  
  3. struct COREUOBJECT_API ConstructorHelpers
  4. {
  5. public:
  6.     template<class T>
  7.     struct FClassFinder
  8.     {
  9.         TSubclassOf<T> Class;
  10.         FClassFinder(const TCHAR* ClassToFind)
  11.         {
  12.             CheckIfIsInConstructor(ClassToFind);
  13.             FString PathName(ClassToFind);
  14.             StripObjectClass(PathName, true);

  15.             Class = ConstructorHelpersInternal::FindOrLoadClass(PathName, T::StaticClass());
  16.             ValidateObject(*Class, PathName, *PathName);
  17.         }
  18.         bool Succeeded()
  19.         {
  20.             return !!*Class;
  21.         }
  22.     };
  23. };


1. Code - 1

  1. ///////////////////////////////////////////////////////////////////////////////////////////////
  2. // Header
  3. ///////////////////////////////////////////////////////////////////////////////////////////////
  4.  
  5. UCLASS(BlueprintType, Blueprintable)
  6. class ARENABATTLE_API AWeapon : public AActor
  7. {
  8.     GENERATED_BODY()
  9.  
  10. public:
  11.     // CDO constructor에서 생성시키는 녀석은 Blueprint에서 수정할 수 없어야 한다
  12.     UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Category="WeaponComponent")
  13.     class USkeletalMeshComponent* WeaponComponent = nullptr;
  14. };
  15.  
  16. ///////////////////////////////////////////////////////////////////////////////////////////////
  17. // CPP
  18. ///////////////////////////////////////////////////////////////////////////////////////////////
  19.  
  20. // Sets default values
  21. AWeapon::AWeapon()
  22. {
  23.     // Create USkeletalMeshComponent as RootComponent
  24.     WeaponComponent = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("ABWeaponComponent"));
  25.     check(WeaponComponent);
  26.     RootComponent = WeaponComponent;
  27.  
  28.     // Find SkeletalMesh
  29.     // ConstructorHelpers는 생성자 함수에서만 사용할 수 있다.
  30.     //  ConstructorHelpers::FObjectFinder
  31.     //  ConstructorHelpers::FClassFinder
  32.     static ConstructorHelpers::FObjectFinder<USkeletalMesh> SK_BlackKnight(
  33.         TEXT("SkeletalMesh'/Game/......./SK_Blade_BlackKnight.SK_Blade_BlackKnight'")
  34.     );
  35.     // Set SkeletalMesh to SkeletalMeshComponent
  36.     WeaponComponent->SetSkeletalMesh(SK_BlackKnight.Object);    
  37. }


2. Code - 2

  1. ///////////////////////////////////////////////////////////////////////////////////////////////
  2. // Header
  3. ///////////////////////////////////////////////////////////////////////////////////////////////
  4. TSubclassOf<class APawn> BotPawnClass;
  5.  

  6. ///////////////////////////////////////////////////////////////////////////////////////////////
  7. // CPP (어느 생성자 함수 안)
  8. ///////////////////////////////////////////////////////////////////////////////////////////////
  9. static ConstructorHelpers::FClassFinder<APawn> BotPawnOb(TEXT("/Game/Blueprints/Pawns/BotPawn"));
  10. BotPawnClass = BotPawnOb.Class;


1 2 3 4 5 6 7 8 9 10 다음