ぼっちプログラマのメモ

UE4とかUE5とかについて書いたり書かなかったり。

【UE5】エディター右上にプロジェクト独自のテキスト・情報を表示する方法

はじめに

エディタ設定の Show Frame Rate and Memory をONにすると、エディタ右上にフレームレートやメモリなどの情報が出ます。

ここにプロジェクト固有の情報表示したい! パフォーマンス関連の情報ももっと出したい!!!

できた!!!

ということで、エンジンコードを彷徨ってたらやり方を見つけました、という話。

エディタ右上にテキストを追加する方法

FLevelEditorModule::AddTitleBarItem関数を使って、エディタ右上に表示されるテキストを追加します。 各テキスト項目はAddTitleBarItemに渡すFTitleBarItem の Label, ValueFText)で設定します。Valueは関数を渡すこともでき、リアルタイムに変化するデータも表示できます!

ということで、サンプルコードを。Moduleで実装していますが、Subsystemなどの他クラスでも利用可能です。

#define LOCTEXT_NAMESPACE "XXX"

// staticで宣言する必要あり
FText FXXXModule::GetGameThreadTime()
{
    // "RenderCore" を PrivateDependencyModuleNames に追加
    const float GameThreadTime = FPlatformTime::ToMilliseconds(GGameThreadTime);
    // const float GameThreadWaitTime = FPlatformTime::ToMilliseconds(GGameThreadWaitTime);
    // const float RenderThreadTime = FPlatformTime::ToMilliseconds(GRenderThreadTime);
    // const float RenderThreadWaitTime = FPlatformTime::ToMilliseconds(GRenderThreadWaitTime);

    return FText::Format(LOCTEXT("Game", "{0} ms"), GameThreadTime);
}

void FXXXModule::StartupModule()
{
    ...

    FLevelEditorModule* LevelEditorModule = FModuleManager::GetModulePtr<FLevelEditorModule>("LevelEditor");
    if (LevelEditorModule != nullptr)
    {
        FLevelEditorModule::FTitleBarItem Item;
        
        // 固定の文字列
        Item.Label = LOCTEXT("HogeLabel", "Hoge?: ");
        Item.Value = LOCTEXT("HogeValue", "Hoge Hoge!");
        LevelEditorModule->AddTitleBarItem(TEXT("Hoge"), Item);

        // 処理を直接渡す
        Item.Label = LOCTEXT("TimeLabel", "Time: ");
        Item.Value = MakeAttributeLambda([]() { return FText::FromString(FDateTime::Now().ToString()); });
        LevelEditorModule->AddTitleBarItem(TEXT("Time"), Item);

        // 関数を渡す
        Item.Label = LOCTEXT("GameLabel", "Game: ");
        Item.Value = TAttribute<FText>::Create(&GetGameThreadTime);
        LevelEditorModule->AddTitleBarItem(TEXT("Game"), Item);
    }
}

void FXXXModule::ShutdownModule()
{
...

    FLevelEditorModule* LevelEditorModule = FModuleManager::GetModulePtr<FLevelEditorModule>("LevelEditor");
    if (LevelEditorModule != nullptr)
    {
        LevelEditorModule->RemoveTitleBarItem(TEXT("Hoge"));
        LevelEditorModule->RemoveTitleBarItem(TEXT("Time"));
        LevelEditorModule->RemoveTitleBarItem(TEXT("Game"));
    }
}

#undef LOCTEXT_NAMESPACE

余談

Show Frame Rate and Memory有効時の処理はFMainFrameModule::MakeDeveloperToolsで実装されており、今回の記事で紹介した方法は FVPUtilitiesEditorModule::StartupModule()で使われています。 今回の内容で十分な気はしますが、もっとガリガリ弄りたいという方は上述のコードをみたり編集していくのがいいと思います!

さいごに

階層が深いところにあったり、なにか特殊な操作をしないと見れない情報は届かないことが多いです。 なので、本当に必要な情報であったり、スクショをもらったときにヒントとなる情報は絶対見えるところに出すと…少ししあわせになる…かもしれません!

おしまい