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