【UE5】BeginPlayの実行順について
😸BeginPlayの処理の順番について紹介していきますが、正直ちょっとややこしいです。なぜならエディタ内でプレイした時とビルドしてからプレイした時にBeginPlayの順番が異なるためです。今回はそれぞれのBeginPlayの実行される順番と問題が起きないような実装方法について紹介していきます。
結論 BeginPlayの正確な実行順↓
1から順にBeginPlayが実行されます。これが正しい実行順になります↓
- レベルに配置したアクタのブループリント
- HUD
- レベルブループリント
- プレイヤー(CharactorまたはPawnクラス)
- ゲームモード
- GameState
- PlayerState
- PlayerController
なおアクタが複数ある場合は検証した結果としてはランダムな順番になりました。なのでプレイする度にアクタのBeginPlayの順番は変更されるような感じでした(詳細は不明)。つまりBP_AとBP_Bというブループリントクラスがレベル上に配置されていた場合、BP_Aから処理されるパターンとBP_Bから処理される場合のパターンがありました。なのでアクタの実行順に関してはランダムっぽいかなと。他のブループリントクラスは何度かプレイしましたが順番が前後する事はありませんでした。
そして重要なポイントですがエディタ内でプレイした時とパッケージ後のBeginPlayの順番は異なります。なのでパッケージ後のBeginPlayの順番(上記の順番)が正しい実行順になります。
これが↑本当に正しいのか検証してみました
行った検証方法
- まずはブループリントクラスのActorをBP_A , BP_B , BP_Cという名前で作成してレベルにAから順に配置しました。
- その後GameMode,CharacterクラスのPlayer,HUD,PlayerController,GameState,PlayerState,Spectatorのブループリントクラスを作成してゲームオードにセットしました。
- 1と2の手順で作成した全てのブループリントクラスとレベルブループリントに以下の様にBeginPlayからPrintStringで繋げたこんな感じにノードを作成しました。
これをレベルブループリント含む全てのブループリントクラスでそれぞれの名前で実装しました。 - プレイした結果とパッケージ化後のPrintStringで表示される順をそれぞれ下記のようにスクリーンショットしています。
①エディタ内でプレイした場合のBeginPlay順番(ただしこれは参考にしてはいけません)
エディタ内でプレイしたらこんな感じの結果になりました↓
なお把握されていると思いますがPrintStringでは表示された順は下から上です。なので一番上が一番最後に処理されているといった感じです。
順番をテキストにするとこんな感じです↓
- レベルに配置したアクタ
- ゲームモード
- レベルブループリント
- GameState
- PlayerController
- PlayerState
- HUD
- プレイヤー(CharactorまたはPawnクラス)
何回かプレイしても同じ結果でした。アクタの順番はエディタに配置した順番に実行されました。
②パッケージ化した場合のBeginPlay順番(こっちが正しい順です)
パッケージ化してプレイ↓
何回かプレイしたらアクタの順番だけは前後しました。まとめるとこんな感じに↓
- レベルに配置したアクタ
- HUD
- レベルブループリント
- プレイヤー(CharactorまたはPawnクラス)
- ゲームモード
- GameState
- PlayerState
- PlayerController
つまりこのパッケージ化後の結果が正しい実行順という事になります。なおアクタが複数ある場合は検証した結果としてはランダムな順番になりました。なのでプレイする度にアクタのBeginPlayの順番は変更されるような感じでした(詳細は不明)。つまりBP_AとBP_Bというブループリントクラスがレベル上に配置されていた場合、BP_Aから処理されるパターンとBP_Bから処理される場合のパターンがありました。なのでアクタの実行順に関してはランダムっぽいかなと。他のブループリントクラスは何度かプレイしましたが順番が前後する事はありませんでした。
BeginPlayの順番が前後するこの問題への対処法
仮にパッケージ後の正しい順番に合わせたとしても毎回、パッケージ化してプレイして..を試す訳にはいきません。なので基本的には順番に依存する実装方法は避けた方が良いです。対処法としては今私がぱっと思いつくかぎりでは以下です。
・GameModeのBeginPlayなどに順番が重要な処理をまとめてしまう
・例えばカスタムイベントを作成して、GameModeのBeginPlayで呼び出して順に実行させる
・Delayで処理を遅らせる(問題が発生しそうなので辞めた方が良いかも)
Tickでも検証してみた
結論としてはtickはエディタ内でプレイした時とパッケージ化後のプレイでも順番は変化しませんでした、なのでTickに関しては順番は特に気にする必要性は無さそうです。(アクタだけ前後するので注意)
①エディタ内でプレイした結果↓
複数回プレイした結果順番は全く同じでした。この順です↓
- PlayerController
- GameMode
- GameState
- PlayerState
- レベルに配置したアクタのブループリント
- レベルブループリント
- プレイヤー
- HUD
②パッケージ化してプレイした結果↓
複数回プレイした結果順番は全く同じでした。この順です↓
- PlayerController
- GameMode
- GameState
- PlayerState
- レベルに配置したアクタのブループリント
- レベルブループリント
- プレイヤー
- HUD
まとめ
BeginPlayのパッケージ化後の順番↓(エディタ内プレイだと順番変わるので注意)
- レベルに配置したアクタのブループリント
- HUD
- レベルブループリント
- プレイヤー(CharactorまたはPawnクラス)
- ゲームモード
- GameState
- PlayerState
- PlayerController
Tickのパッケージ化後の順番↓(エディタ内プレイでも順番変わらない)
- PlayerController
- GameMode
- GameState
- PlayerState
- レベルに配置したアクタのブループリント
- レベルブループリント
- プレイヤー
- HUD
😸このBeginPlayの問題についてはちょっとややこしいですね。なおスタンドアローンでプレイしてもエディタ内の結果と同じになったので、やっぱりパッケージ化して確認するしか無さそうです。基本的にBeginPlayの順番が重要になるようなノードの組み方は避けた方が良さそうですね。何かミスっていたらコメントでご教授頂けると助かります。
UE5のWeb本を公開&販売しています!
興味ある方はぜひ覗いてみてくださいー!半分まで無料公開してます。
#ue5 #ue4 #unreal engine 5 #order
Discussion