やあ
メモだよ
こんなかんじのベースクラスがあったとします
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))
{
}
なお、これだけではブループリント上でAHogeChild
のBoxComponent
がBoxComponentChild
になるだけなので、
BoxComponentChild
のメンバ変数などを使うには、
void AHogeChild::Test()
{
Cast<UBoxComponentChild>(BoxComponent)->Huga();
}
みたいにしなきゃいけない。
※注意 : コンポーネントの継承クラス以外をSetDefaultSubobjectClass
で指定することはできない。