【UE4】パッケージング後だけ動作がおかしい?!→ BeginPlayの実行順の変化が原因でした
「エディタ上では正常に動作するのに、パッケージング後だけ動作がおかしい・・・」
→「BeginPlayの実行順の変化が原因でした」
という実体験を元にした記事になります。俺の屍を越えてゆけ・・・!👍
実験用プロジェクトの作成
新規プロジェクトを作成し、いまいち実行順の分からないアセット
・Level
・GameInstance
・GameMode
・PlayerController
・PlayerStart & Pawn
を作成。各種設定を済ます。
PlayerStartをワールド上に配置。
各ブループリントのBeginPlayイベント直後に、確認用のPrintStaringノードを配置。
いざ、実行!
・Before
・After
まとめ
実行順、変わります。マジですか・・・
上記の場合は
エディタ上では「GameMode → Levelブループリント」だった実行順が、
パッケージング後には「Levelブループリント → GameMode」と変化。
そこ、変わっちゃうの・・・!?
実際に私の場合はGameModeのBeginPlay時に初期値をSetした変数を、他BPのBeginPlay時にGetして利用していたのが原因で「パッケージング後だけ動作がおかしい?!」という事態に。
パッケージング時にエラーが出る訳ではないため、気付きにくく何とも厄介・・・コワイ!
この場合の解決方法は
・各ブループリントのBeginPlayの開始直後にDelayノードを置き、BeginPlayの実行順を調節する
・GameMode内の初期値処理を「ブループリント関数ライブラリ」に移す
など。
BeginPlayの実行順は基本的に不定と考えたほうが良い様子。
実行順に依存しない作りがUE4開発では重要なようです。
[参考]
・UE4プログラマー勉強会 in 大阪 -エンジンの内部挙動について
・UE4でActor間のTick実行順序に依存関係を持たせる方法 - ほげたつブログ
・https://twitter.com/aizen76/status/966660257219993600
・https://twitter.com/rwiiug/status/1248766660137242624