年始めということでUE4のC++におけるコンストラクタについて。
[参考ページ]
公式ドキュメント
↑を見れば分かるが、UE4の場合コンストラクタは大体以下のフォーマットで定義をする。
******************************************************************************************************
(1) コンストラクタのフォーマット
******************************************************************************************************
ClassName::ClassName(const class FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)
{
}
******************************************************************************************************
Ver4.6以前では「FPostContructInitializeProperties」と書いていた箇所が、Ver4.6から「FObjectInitializer」に変更となっている(FPostContructInitializePropertiesクラスを廃止)。
以上、終了。
で、例えばシューティングゲームを作る場合、「弾クラス(BulletBaseクラス)」なるものを作る必要がある。上記を例に作成するとこうなる。
******************************************************************************************************
(2) 弾クラスのフォーマット
******************************************************************************************************
ABulletBase::ABulletBase(const class FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)
{
Velocity = FVector(1.f, 0.f, 0.f);
Tags.Add(FName("Bullet"));
MovementComp = ObjectInitializer.CreateDefaultSubobject<UProjectileMovementComponent>(this, TEXT("ProjectileComp"));
MovementComp->InitialSpeed = 3000.f;
MovementComp->MaxSpeed = 3000.f;
MovementComp->ProjectileGravityScale = 0.f;
MovementComp->SetVelocityInLocalSpace(Velocity);
}
******************************************************************************************************
上記では速度やら重力やらなんやらを設定しているが、
ここで気になったのが「FObjectInitializer」の存在。
「FObjectInitializer」から「UProjectileMovementComponent」を作成しているが、こいつはいったい何者なのか調べてみたら・・・
「UObjectクラスの後に作成されるクラスで、コンストラクタでUObjectクラスから派生するクラスに対するアクションを行う場合に使用するもの」のようだ。上記の(2)では、コンストラクタ内でオブジェクトに対するアクションとしてProjectileMovementComponentを作成している。
エディタからコードを作成する場合、コンストラクタはデフォルトで定義されていないため、コンストラクタを作成する必要がある場合は、上記のフォーマットに沿って書く必要があるようだ。
・メモ
AActorクラスを継承した独自クラスでTickを作成したが、動作(処理)しなかった。結果、「PrimaryActorTick.bCanEverTick = true;」を定義したところ、動作することが判明。
Blueprintでは「EventTick」と書くだけで良いが、C++では上記の1行を追加する、もう一手間が必要だ。