【C++&BP Column】好奇心が勉強のチャンス!BlueprintのノードをUnrealEngineのソースコードから探すテクニック
BluepirntのノードがC++でどうやって動いているのか?
UnrealEngineでC++の開発をしていると
「Blueprintなら組めるけど、C++で再現するとノード名を関数に置き換えることが出来ない」
こういう時は、BlueprintのノードをUnrealEngineソースコードから検索することで解決できます。
調べたいノードが何処で書かれているか特定する。
BlueprintからC++で再現したいノードにマウスオーバーします。
UnrealEngineが作成しているノードであればマウスオーバーすると説明(Tooltip)が表示されます。Tooltipに書かれている文字列をメモかスクリーンショットします。
Visual Studioで[Ctrl+F]を入力すると、検索バーが表示されます。Tooltipの文字を検索欄に入力します。検索範囲を[Current Ducument]から[Entire Solution]に変更します。Solution全体を検索対象にすることで、UnrealEngineのソースコードも検索対象になります。
検索を[Find All]で実行します。
Tooltipの文字列が検索に引っかかったので、ダブルクリックします。
文字列の行に移動します。KismetStringLibrary.hのConv_FloatToString関数に文字列が使われていることが分かりました。Variable TypeをFloatからStringに変換していたノードの正体がKismetStringLibrary.hのConv_FloatToString関数ということが分かります。
(UE5インストールフォルダ)\Epic Games\UE_5.0EA\Engine\Source\Runtime\Engine\Classes\Kismet\KismetStringLibrary.h
KismetStringLibrary.h
/** Converts a float value to a string */
UFUNCTION(BlueprintPure, meta=(DisplayName = "ToString (float)", CompactNodeTitle = "->", BlueprintAutocast), Category="Utilities|String")
static FString Conv_FloatToString(float InFloat);
UKismetStringLibrary::Conv_FloatToString関数を使えばVariable Typeを変換するノードを再現できることが分かりました。
void ACPPSampleActor::BeginPlay()
{
Super::BeginPlay();
FString Message = "C++ Hello World!";
// PrintStringノードと同じ処理
// UKismetSystemLibraryクラスのPrintString関数を呼び出す
UKismetSystemLibrary::PrintString(
this
, UKismetStringLibrary::Conv_FloatToString(Duration) // DurationをfloatからFStringに変換する
, true
, true
, FColor::Cyan
, Duration);
}
調べたいノードが何をしているのか処理を確認する
KismetStringLibrary.hのConv_FloatToString関数では、どのような処理が行われているか確認します。関数名を右クリック > Go To Definitionを選択します。
Conv_FloatToString関数の処理を実装している箇所に移動します。
(UE5インストールフォルダ)\Epic Games\UE_5.0EA\Engine\Source\Runtime\Engine\Private\KismetStringLibrary.cpp
KismetStringLibrary.cpp
FString UKismetStringLibrary::Conv_FloatToString(float InFloat)
{
return FString::SanitizeFloat(InFloat);
}
KismetStringLibrary.hのConv_FloatToString関数では、どのような処理が行われているか確認します。関数名を右クリック > Go To Definitionを選択します。
Conv_FloatToString関数の処理を実装している箇所に移動します。
(UE5インストールフォルダ)\Epic Games\UE_5.0EA\Engine\Source\Runtime\Engine\Private\KismetStringLibrary.cpp
KismetStringLibrary.cpp
FString UKismetStringLibrary::Conv_FloatToString(float InFloat)
{
return FString::SanitizeFloat(InFloat);
}
FStringのSanitizeFloat関数を使用してfloatからFStringに変換していることが分かりました。UKismetStringLibrary::Conv_FloatToStringからFString::SanitizeFloatに変更しても大丈夫ということが分かります。
UKismetStringLibrary::Conv_FloatToString(Duration)
↓
FString::SanitizeFloat(Duration)
FString::SanitizeFloatに変更してみます。
void ACPPSampleActor::BeginPlay()
{
Super::BeginPlay();
FString Message = "C++ Hello World!";
// PrintStringノードと同じ処理
// UKismetSystemLibraryクラスのPrintString関数を呼び出す
UKismetSystemLibrary::PrintString(
this
, FString::SanitizeFloat(Duration) // DurationをfloatからFStringに変換する
, true
, true
, FColor::Cyan
, Duration);
}
Ctrl + Sでファイルを保存し、Compileを行います。
Level Editorの[Play]ボタンをクリックします。
UKismetStringLibrary::Conv_FloatToStringと同じ結果が得られます。
さらに深く潜る
FString::SanitizeFloatからGo To Definitionを実行します。
floatからFStringに変換している処理を見られます。
「どうなっているのだろう?」はUnrealEngineやC++を勉強するチャンス
Unreal Engineの便利な関数はC++の勉強をするチャンスです。
- Unreal Engineがどうやって作られているのか知ることができます。
- C++の使い方を学習できます
「どうなっているのだろう?」という興味を持つことで自然に成長します。
Discussion