なすびぼうろく

主に技術系の備忘録をつけたり

【UE5】ImGuiで日本語を使おうとするとフォントアトラスが破壊される

github.com

これをUnrealEngine5に導入してイケイケなデバッグウィンドウを作っちゃおうってワケ! と、意気揚々に作業していたらつまずいたので備忘。

日本語化対応で苦戦

いろんな記事で日本語化対応が紹介されていますが、自分の環境だとうまくいかず。 下記参考にさせて頂いた記事。 zenn.dev

具体的には、フォントアトラスが破壊されてバラバラな矩形が表示されたり、またはクラッシュしたり。

何が違うんだろうと思ってフォントビルドのところにログを入れてみたら何回も走っている。 どうやらマルチプレイヤーオプションのプレイヤー数を複数人にしているのが原因らしい。 そしてフォントアトラスを書き込む領域は同じなので変な表示になってしまうと。

対策

参考にさせていただいた記事とおなじImGuiContextProxyに処理を書いているので そこのContextIndexを見て初期化時とプレイヤー1実行時に走るとき以外はスキップするようにした。

  if (!bFontInitialized && ContextIndex <= 0)
    {
        bFontInitialized = true;
        IO.Fonts->Clear();
        const FString FontPath = FPaths::ProjectDir() + TEXT("rounded-l-mplus-2p-medium.ttf");
        UE_LOG(LogTemp, Log, TEXT("ImGui FontPath: %s, ContextIndex: %d"), *FontPath, InContextIndex);
        
        IO.Fonts->AddFontFromFileTTF(TCHAR_TO_ANSI(*FontPath), 18.0f, nullptr, IO.Fonts->GetGlyphRangesJapanese());
        const bool FontBuildResult = IO.Fonts->Build();
        UE_LOG(LogTemp, Log, TEXT("ImGui FontBuild %s"), FontBuildResult ? TEXT("Success!!") : TEXT("Failed!"));    
    }

これで表示できた。 しかし、こんな場当たり的な対応で良いのかは甚だ疑問である。 明確な答えを持っている人がいたら教えてくださいませ……。