概要
OX ENGINEER STUDIO クライアントエンジニアの吉川です。
プロジェクトをビルドした際に長時間終了しなかった為、ログを確認したところ予想外な原因で進行がストップしていました。
またログを見るとエラーは発生していますが、ビルドが失敗とならずに進行しないので通知されず気付きにくいという厄介な問題があります。
今回はこちらについての解説記事となります。
問題
状況として、
①プロジェクト、またはプラグインのコード、またはロードしているDLL内でstd::snprintfなどを行う
②UEプロジェクトのクッキングもしくはパッケージ化を行う
といった場合に発生します。
問題が発生している場合はビルドログでWindows関連のエラーが確認出来ます。
また完了・失敗の通知が出ずビルドが終了しない状態になります。
解決法
標準出力を使う箇所ではワイド文字列を扱える出力(std::wcout等)に置き換える。
(※未検証)wprintf_sなども可?
原因
ビルドツールで標準出力がUTF-8指定されている為。
※文字コード・ロケールについての説明は割愛いたします
(原文)
I’ve got recently the same error. I couldn’t package my game because of a printf() on a third party plugin. But after few day we find out a simple solution to avoid the error and package or game (we are in4.26.2). Like it was said when you cook, the engine forcing stdout to UTF-8, but its an option that can be remove.
(翻訳)最近、同じエラーが発生しました。サードパーティのプラグインの printf() が原因で、ゲームをパッケージ化できませんでした。しかし、数日後、エラーを回避してゲームをパッケージ化する簡単な解決策を見つけました (現在は 4.26.2 です)。クック時に言われたように、エンジンは stdout を UTF-8 に強制しますが、これは削除できるオプションです。
https://forums.unrealengine.com/t/cant-package-and-cook-the-game-version-4-11-2/354967/33
(リンク先にはprintfを使用していてもこの指定を削除する事で解決する方法があるが、この場合エンジンビルドが必要。また文字コードを指定しない事による影響を考慮する必要有り。)
引用・まとめ
解決にあたり、こちらの投稿を参考にしました。
https://forums.unrealengine.com/t/packaging-fatal-error-when-cooking/540160
今回発生を確認したのはDLL上でコンソールを生成、そちらへログ表示を行った際に発生しましたが、原理的にはプロジェクトのコードから行っても同様になります。
基本的にUEアプリ単体であれぱPrintString等でログ表示しますが、「デバイスの状態を取得してデバッグ表示したい」といった場合に、「アプリとは別にコンソールウィンドウを出し、そちらにログを表示する」ような状況もあると思います。
そのような際に更にアプリをビルドしようとしたが完了しない場合はこの辺りをチェックしていただければと思います。