
UE5 C++&BP 05【C++版】Construction ScriptでComponentの設定を変更する
C++でBlueprintが作られているので、C++で再現できないことはないはず
とはいったものの
C++側の関数が分からない
分かってしまうと簡単なのですが、何処にあるのか分からない。
エンジンのソースやGitHubのリポジトリに助けられています。
先人の知恵によって助けられている。
昔上司におごってもらった時に言われた言葉です。
俺には返さなくていい、いつかお前たちがおごってやれ。
偉くなればお金を持っているってイメージをもってもらえるから頑張れるだろ。
次の日にちゃんとお礼を言え。次があるから。
先人の皆さんありがとうございます。
それではC++でBlueprintで書いた処理を再現していきましょう。
【C++版】Construction ScriptでComponentの設定を変更する
VisualStudioを開いて、編集するファイルを表示する
プロジェクトを閉じていたら、プロジェクトを開き、
「Chapter_2_6_ConstructionScript」を開きます。

ToolsからVisual Studioを開きます。

Solution Explorerから今回編集する2つのファイルを開きます。
CPPSampleActor.cpp
CPPSampleActor.h

C++でBlueprintのConstruction Scriptを再現する
C++でBlueprintのConstruction Scriptで実装した処理を再現します。
宣言した変数がLevelEditorの[Detail]パネルで変更できる
PointLightの表示/非表示(Set Visibilityノード)
PointLightの光の強さ調整(Set Intensityノード)
PointLightの光の色調整(Set LightColorノード)




LevelEditorで編集可能な変数を追加する
「CPPSampleActor.hのpublic」に変数を追加します。
public:
UPROPERTY(EditAnywhere, Category = "Point Light")
bool bIsVisible = false;
UPROPERTY(EditAnywhere, Category = "Point Light")
float Intensity = 5000.0f;
UPROPERTY(EditAnywhere, Category = "Point Light")
FLinearColor LightColor = FLinearColor::White;
UPROPERTY識別子で編集可能(EditAnyWhere)、Categoryを[Point Light]に設定しています。
UPROPERTY(EditAnywhere, Category = "Point Light")
Ctrl + Sでファイルを保存し、Compileを行います。

LevelEditorのViewportに「CPPSampleActor」をDrag&Dropします。

「CPPSampleActor」の[Detail]パネルをスクロールすると、[Point Light]Catetoryがあります。
「CPPSampleActor.hのpublic」に追加した変数が表示されています。

OnConstruction関数でPointLightの表示/表示を設定する
次にBlueprintのConstructionScriptタブを再現します。
C++では[OnConstruction]をオーバーライドします。
親クラスである[AActor]で定義されている関数を子である[ACPPSampleActor]で関数を上書きします。OverrideについてはClassの継承で詳しく説明します。
protected:
virtual void OnConstruction(const FTransform& Transform) override;
OnConstructionではPointLightのSetVisibility関数に変数[bIsVisible]を引数に渡すようにして呼び出します。
void ACPPSampleActor::OnConstruction(const FTransform& Transform)
{
// PointLightの表示・非表示を設定
PointLight->SetVisibility(bIsVisible);
}
Ctrl + Sでファイルを保存し、Compileを行います。

LevelEditorの[Detail]パネルで変数[IsVisible]を有効/無効に切り替えます。
変数[bIsVisible]が有効になるとPointLightが表示され、無効になるとPointLightが非表示になります。
bを先頭に付けた変数はプロパティには、先頭のbが表示されません。先頭のbはbooleanの変数であるということを明記させるために付け、UnrealEngine のEditorでは表示されません。(少し特殊な名前の扱いです)

OnConstruction関数でPointLightのIntesity(光の強さ)を調整をする
次に、PointLightのIntensity(光の強さ)を調整します。
PointLightのSetIntensity関数に変数[Intensity]を引数に渡して呼び出します。
void ACPPSampleActor::OnConstruction(const FTransform& Transform)
{
// PointLightの表示・非表示を設定
PointLight->SetVisibility(bIsVisible);
// PointLightの強さを設定
PointLight->SetIntensity(Intensity);
}
Ctrl + Sでファイルを保存し、Compileを行います。

LevelEditorの[Detail]パネルで変数[Intensity]の値を大きくすると光が強くなります。

OnConstruction関数でPointLightのLightColor(光の色)を調整をする
最後に、PointLightのLightColorを変更します。
PointLightのSetLightColor関数に変数[LightColor]を引数に渡して呼び出します。
void ACPPSampleActor::OnConstruction(const FTransform& Transform)
{
// PointLightの表示・非表示を設定
PointLight->SetVisibility(bIsVisible);
// PointLightの強さを設定
PointLight->SetIntensity(Intensity);
// PointLightのLightColorを設定
PointLight->SetLightColor(LightColor);
}
Ctrl + Sでファイルを保存し、Compileを行います。

LevelEditorの[Detail]パネルで変数[LightColor]をクリックすると、ColorPickerが表示されます。色を選択して、OKボタンをクリックすると光の色が選択した色に変わります。
BlueprintのConstructionScriptをC++側ではOnConstruction関数で再現することが出来ました。

C++OnConstruction関数とBlueprintのConstructionScript
変数はUPROERTYでEditAnyWhereを設定することで、Blueprint側のInstance Editableを有効にした時と同様の扱いをすることが出来ました。

BlueprintのConstructionScriptをC++側ではOnConstruction関数で再現することが出来ました。

Blueprintで使用しているノード名とC++で使用している関数名は同じということに気付きます。
PointLightの表示/非表示はPointLightComponentの[SetVisibility]関数から設定することができます。

PointLightの光の強さはPointLightComponentの[SetIntensity]関数から設定することができます。

PointLightの光の色はPointLightComponentの[SetLightColor]関数から設定することができます。

全て保存して、C++側は終了
C++側の説明はここまでになります。
[Content Browser]から[Save All]ボタンをクリックし、[Save Selected]ボタンをクリックしてプロジェクトの変更のあったアセットをすべて保存します。

まとめ
OnConstruction関数が見つかってからあっという間に再現することが出来ました。GitHubやRebbitに助けてもらいました。
少しずつですがBlueprintをC++で再現できるようになってきました。
Visual Studioをもっと早くコーディング出来るようにカスタマイズできそうです。
さらなるスピードアップを目指してカスタマイズしていきます。
最終的なソースコード
CPPSampleActor.h
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Components/ArrowComponent.h" // 追加
#include "Components/PointLightComponent.h" // 追加
#include "CPPSampleActor.generated.h"
UCLASS()
class CPP_BP_API ACPPSampleActor : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
ACPPSampleActor();
// Scene Component
UPROPERTY(EditAnywhere)
USceneComponent* DefaultSceneRoot;
// StaticMesh Component
UPROPERTY(EditAnywhere)
UStaticMeshComponent* StaticMesh;
// Arrow Component
UPROPERTY(VisibleAnywhere)
UArrowComponent* Arrow;
// PointLightComponent Component
UPROPERTY(EditAnywhere)
UPointLightComponent* PointLight;
UPROPERTY(EditAnywhere, Category = "Point Light")
bool bIsVisible = false;
UPROPERTY(EditAnywhere, Category = "Point Light")
float Intensity = 5000.0f;
UPROPERTY(EditAnywhere, Category = "Point Light")
FLinearColor LightColor = FLinearColor::White;
// DurationのGet関数
float GetDuration() { return Duration; }
// TextColorのGet関数
FLinearColor GetTextColor() { return TextColor; }
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
virtual void OnConstruction(const FTransform& Transform) override;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
private:
// PrintString関数のDurationに設定する変数
const float Duration = 10.0f;
// PrintString関数のTextColorに設定する変数
const FLinearColor TextColor = FColor(255, 255, 255);
};
CPPSampleActor.cpp OnConstruction関数
void ACPPSampleActor::OnConstruction(const FTransform& Transform)
{
// PointLightの表示・非表示を設定
PointLight->SetVisibility(bIsVisible);
// PointLightの強さを設定
PointLight->SetIntensity(Intensity);
// PointLightのLightColorを設定
PointLight->SetLightColor(LightColor);
}
UE4から始めるC++&Blueprint 進捗とロードマップ
Zennで進捗報告を行い、GitHubでロードマップを公開中です。
良かったら確認してみてください。
【参照URL】
イスラエルの方のUnrealEngine C++まとめ
出来ることがまとめっているので参考にさせていただきます。