ひよっこ創作ブログ@Rwi

UE4(+ゲーム制作関連)で何やら書いていきます

【UE4】パッケージング後だけ動作がおかしい?!→ BeginPlayの実行順の変化が原因でした

「エディタ上では正常に動作するのに、パッケージング後だけ動作がおかしい・・・」
→「BeginPlayの実行順の変化が原因でした」

という実体験を元にした記事になります。俺の屍を越えてゆけ・・・!👍



実験用プロジェクトの作成

f:id:rwiiug:20200613050616p:plain

新規プロジェクトを作成し、いまいち実行順の分からないアセット
 ・Level
 ・GameInstance
 ・GameMode
 ・PlayerController
 ・PlayerStart & Pawn
を作成。各種設定を済ます。


f:id:rwiiug:20200613050526p:plain
PlayerStartをワールド上に配置。

f:id:rwiiug:20200613053159p:plain
各ブループリントのBeginPlayイベント直後に、確認用のPrintStaringノードを配置。




いざ、実行!

・Before
f:id:rwiiug:20200613052435p:plain
エディタ上の実行(PIE、スタンドアロンゲーム)
何度プレイしてもこの実行順は不変。

・After
f:id:rwiiug:20200613052417p:plain
パッケージング後(Developmentビルド、Windows 64bit)
BeginPlayの実行順が変化している!




まとめ

実行順、変わります。マジですか・・・

上記の場合は
エディタ上では「GameModeLevelブループリント」だった実行順が、
パッケージング後には「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