見出し画像

[Unreal Engine] Ensure condition failedエラーでパッケージ化に失敗する

UE5プロジェクトの途中で構造体を使い始めて、構造体にまとめられる部分を構造体に置き換えている最中にパッケージ化ができなくなる問題が発生
しましたので、その原因箇所と解決法をここに残しておこうと思います。

(当方はまだUnrealEngine初心者ですので誤りもあるかもしれません。
もし誤りを発見された場合は、コメントなどで教えていただけると嬉しい
です。)

エラーの内容

まずパッケージ化の最中に起こるエラーの画像がこちら。

アウトプットログのエラー部分

以下重要部分をコピペ。

--------------------------------------------------------------------------------
begin: stack for UAT
=== Handled ensure: ===
Ensure condition failed: DestinationExpression->AssociatedVarProperty [File:D:\build++UE5\Sync\Engine\Source\Editor\KismetCompiler\Private\
KismetCompilerVMBackend.cpp] [Line: 1463]
--------------------------------------------------------------------------------

「Ensure condition failed」という文字が出てきていますね。

Ensureは原義は「確か(なもの)にする」。事の実現に必要な事を「保証
する、確保する、確実にする」という意味で使う(Weblio英和辞書より)。

なので何かの値の不確実性が問題になっていそうな雰囲気です。

問題箇所

それで発覚した問題部分のブループリントがこちら。

Ensure condition failedエラーを引き起こしていると思われる問題箇所

この部分は人間から見てもかなり強引な組み方で自分自身も書いていて
「これちゃんと動くのかな?(;^ω^)」
という感じだったので「やはり!」という感想。

(※画像に写っていませんが、始めに構造体配列を参照渡しでゲットして
います。そしてそれをBreak(分解)した)構造体をピン分割し、
そこから便利な「選択する(Select)」(ピュア関数)ノードに(構造体の中の)複数の配列を渡して選択させ、
その選ばれた配列に「リファレンス渡し変数を設定」ノードで別の配列変数を設定する、という流れ。
(このスクリーンショット内の「浮動小数点(倍精度)の配列を設定」
ノードがリファレンス渡しです。配列から線を引っ張って「Set Ref」
検索で出てきます(正確にはSet By-Ref Var)。)

構造体配列という時点ですでに「どのアイテム?」という問題を抱えているのに、その選ばれた一つの配列の中にある複数の配列を渡して選択させ、
それをリファレンス渡しでセットするようなやり方をするとエラーが出る
ようです。
(配列でなければうまくいきます・・・というかエディター内ではこれでも動作します。パッケージ化の際にエラーになります。)

エラーを直す方法

解決法は「選択する」(Selectノード)部分を排除することにありました。Switch on Int(整数型でスイッチ)ノードで実行線を枝分かれさせて、
下図のように配列選択のピュア関数の部分を、同じ機能を果たすように
書き換えてみました。

解決法の一つ。ピュア関数をやめて複数実行線で組む。
(GM Best Check Point Timesがハイライトされていますが意味は無いので無視してください)

これでパッケージ化に成功しました!
(ピュア関数は毎回データを読み出すらしいので、この書き方はノード数は増えますがゲームの処理としては軽くなるかもしれません。)

他の方法として構造体の「メンバを設定(Set member~)」を同様にして
複数実行線で組むやり方も考えられます。

UE5でのことでしたが、内容的にUE4でも同様のことが起きそうですね。
そしてその場合の解決法も同じだと思われます。

ただし、これは恐らくEnsure condition failedエラーの一つの形態だと思われるので、この解決法が役に立たない場合、別の箇所の「値の不確実性」が
問題になっているかもしれません。その場合はそのような箇所を探すこと
から始めないといけないかも知れません。(値が設定されていないとかピンが差し込まれていないとか? 何より、最近何を変更したか?)

こちらの記事は以上になります。
誰かの参考になれば幸いです。
(・・・こまめなパッケージ化チェックは原因特定に重要そうです!)

いいなと思ったら応援しよう!