🔍

【C++&BP Column】好奇心が勉強のチャンス!BlueprintのノードをUnrealEngineのソースコードから探すテクニック 

2022/01/14に公開

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