※本記事はUE4.26で検証しております
Unreal Engine 4 (UE4) Advent Calendar 2020にて、おかずさんがImGuiの記事を投稿してくださいました。
pafuhana1213.hatenablog.com
この記事を元にImGuiを実装してみたのですが、その際にハマった点や気付いた点、感想をまとめてみました。UE4で実装する方には役に立つと思いますので見て頂けると嬉しいです。
日本語対応
※後日追記。↓の方法だとStandaloneで文字化けするようです。これを防ぐ為にはFImGuiContextManager::BuildFontAtlas()のFontAtlas.AddFontDefaultをFontAtlas.AddFontFromFileTTFに変更して下の引数にすれば対応できますが、プラグインを触る形になるので何か代案がないか調べ中。
「imgui 日本語」でググると参考になるサイト様がたくさん現れますが自分はそれで対応しても上手くいきませんでした。詳しく説明すると長くなりますのでまずはソースコードを。これをGameInstanceクラスのInitに書いて対応しました。
static bool bInitialize = true; if (bInitialize) { bInitialize = false; ImGuiIO& io = ImGui::GetIO(); io.Fonts->Clear(); io.Fonts->AddFontFromFileTTF( "c:\\Windows\\Fonts\\meiryo.ttc", 18.0f, nullptr, io.Fonts->GetGlyphRangesJapanese() ); io.Fonts->Build(); }
AddFontFromFileTTFの後にはBuildを呼ぶ必要があるようです。詳しく流れを知りたい方はImFontAtlas::AddFont関数にブレークを貼っておき、UE4を起動すると流れが分かりやすいかと思います。
また上の対応だけでは一部の文字が「?」になるようですが下記サイト様に対応方法が書かれているのでソチラも参照してみてください。
qiita.com
FImGuiDelegates::OnWorldDebug()関数に注意
上記関数ですが引数有り版と無し版の二種類があり、無し版はGWorldを使用してDelegateを取り出しています。GWorldは中身の値が状況によって変わります。なので使う場所によっては「Delegateに登録したのに解除できない」「自分が意図していないWorldに登録される」といった不具合に繋がります。使う際はアクターの場合
FImGuiDelegates::OnWorldDebug(GetWorld()).RemoveAll(this);
このようにちゃんと自分のWorldを渡してやることが大切です。
ImGui.ToggleInputを入れた状態でPlayerControllerの入力を有効にしたい
プロジェクト設定の上記パラメータを触る事でキーボード・マウス・ゲームパッドの入力を有効にすることが出来ます。またC++からも以下の関数で有効無効が出来ます。
FImGuiModule::Get().GetProperties().SetGamepadInputShared(false); FImGuiModule::Get().GetProperties().SetKeyboardInputShared(false); FImGuiModule::Get().GetProperties().SetMouseInputShared(false);
ImGuiが情報を記録しているデータの保存場所
- Saved\ImGui
上のフォルダの中に座標情報用の設定ファイルが保存されています。またプロジェクト設定で変更した値は
- Config
このフォルダにDefaultImGui.iniとして格納されています。
const char*への対応
下記サイト様が非常に参考になります。
papersloth.hatenablog.com
最後に。使ってみた感想
自分が見たい数値が手軽に画面上に表示される(消すのも楽)というのは本当に有難く感じます。Standaloneでも表示されるのも素晴らしいですね。これからの実装が捗る事間違いなしです。
一点難点として思ったのは設計が難しいという事。効率の良いデバッグ環境を作るには時間をかけて自分好みに仕上げる必要があります。個人的にはそれに見合ったリターンは確実にあったので、もしもっと環境を良くしたいと思った人はやってみてはいかがでしょうか。
というわけで今回の記事は終わります。それでは!