UE4 C++ コンポーネントのメモ

やあ

メモだよ

こんなかんじのベースクラスがあったとします

HogeBase.h

UCLASS()
class TEST_API AHogeBase : ACharacter
{
    GENERATED_UCLASS_BODY()
protected:
    UPROPERTY(VisibleAnywhere, BlueprintReadWrite)
        UBoxComponent* HitBox;
    static FName HitBoxName;
};

HogeBase.cpp

FName AHogeBase::HitBoxName(TEXT("HitBox"));

AHogeBase::AHogeBase(const FObjectInitializer& ObjectInitializer)
    : Super(ObjectInitializer)
{
    /* CreateOptionalDefaultSubobjectで作っておくと、子クラスでコンポーネントを生成しないようにするときに役に立ちます */
    HitBox = ObjectInitialzier.CreateOptionalDefaultSubobject<UBoxComponent>(HitBoxName);
}

子クラスでコンポーネントを生成しないようにする

AHogeBaseを継承したクラスを作ったときに、このクラスではHitBoxいらないなーとか思うかもしれない。
そんなときは、
HogeChild.h

UCLASS()
class TEST_API AHogeChild : public AHogeBase
{
    GENERATED_UCLASS_BODY()
};

HogeChild.cpp

AHogeChild::AHogeChild(const FObjectInitializer& ObjectInitializer)
    : Super(ObjectInitialzer.DoNotCreateDefaultSubobject(AHogeBase::HitBoxName))
{
}

これで生成されないようにできる。
なおDoNotCreateDefaultSubobjectは、CreateOptionalDefaultSubobjectで作ったコンポーネントでしか使えないっぽい。
なので、絶対に必要なコンポーネント以外は基本的にCreateOptionalDefaultSubobject作ったほうがよさそう
CreateDefaultSubobjectで作ったコンポーネントで確認済み。

子クラスのコンポーネントコンポーネントの継承クラスにする

HogeChild.h

UCLASS()
class TEST_API AHogeChild : public AHogeBase
{
    GENERATED_UCLASS_BODY()
};

HogeChild.cpp

AHogeChild::AHogeChild(const FObjectInitializer& ObjectInitializer)
    : Super(ObjectInitialzer.SetDefaultSubobjectClass<UBoxComponentChild>(AHogeBase::HitBoxName))
{
}

なお、これだけではブループリント上でAHogeChildBoxComponentBoxComponentChildになるだけなので、
BoxComponentChildのメンバ変数などを使うには、

void AHogeChild::Test()
{
    Cast<UBoxComponentChild>(BoxComponent)->Huga();
}

みたいにしなきゃいけない。
※注意 : コンポーネントの継承クラス以外をSetDefaultSubobjectClassで指定することはできない。