PaperSloth’s diary

主にゲーム開発関連についての記事を書きます。

UE4 不要なComponentを継承先で作成させない方法

環境

・Unreal Engine4.20.3

不要なComponentを継承先で作成させない方法

例えばCharacterクラスを継承したいけど、Skeletal Meshを使用しないためMeshを継承させたくない場合

愚直に実装をするとctor内でこう書くと思います。

AExampleCharacter::AExampleCharacter()
{
    if (GetMesh())
    {
        GetMesh()->DestroyComponent();
    }
}

もちろんこうすることで継承先のCharacterからComponentを破棄することはできます。

ですが、もう少しスマートに書く方法があります。
普段あまり使用しないかもしれませんがObjectInitializerを使用します。

// AExampleCharacter.h
UCLASS()
class EXAMPLE_API AExampleCharacter: public ACharacter
{
    GENERATED_BODY()

public:
    AExampleCharacter(const FObjectInitializer& ObjectInitializer);
};

// AExampleActor.cpp
AExampleCharacter::AExampleCharacter(const FObjectInitializer& ObjectInitializer)
  : Super(ObjectInitializer)
{
}

ObjectInitializerからはDoNotCreateDefaultSubobjectというメソッドが提供されており
不要なComponentの作成を防ぐことができます。

今回はMeshを作成させたくないため、MeshComponentの名前を指定して作成を防ぎます。

AExampleCharacter::AExampleCharacter(const FObjectInitializer& ObjectInitializer)
  : Super(ObjectInitializer.DoNotCreateDefaultSubobject(MeshComponentName)),
{
}

同様にCharacterMovementComponentの作成を防ぐ場合は
CharacterMovementComponentNameを指定し

Collisionの作成を防ぐ場合は
CapsuleComponentNameを指定します。


こうすることでSkeletal Meshを使用しないCharacterを作成できます。
他にもCapsule Collision以外を持ったCharacterや
自前のMovementComponentを持たせたCharacterを作成することができます。
f:id:PaperSloth:20181106165119p:plain


また、前回の記事でTickについて書きましたが
Skeletal Mesh ComponentもTickComponentが走っているため、使用しない場合は作成を防止したほうが良いでしょう。
papersloth.hatenablog.com