環境
・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を作成することができます。
また、前回の記事でTickについて書きましたが
Skeletal Mesh ComponentもTickComponentが走っているため、使用しない場合は作成を防止したほうが良いでしょう。
papersloth.hatenablog.com