ブループリントのイベントが発生する順番
妹「サンプルゲーム色々やってみてるんだけど、これゲームの説明書ってものがないんだね……」
「サンプルだからね。中身を自分で調べてってことなのでは」
妹「調べるのはいいんだけどさ、どこに書いてあるのかわからないんだよ。まず最初はどこから見たらいいのか、どういう順番で動いてるのか。BeginPlayが最初って話だけど、でも色んなとこにBeginPlayあるじゃん? どれが最初かわかんないじゃん? とにかく順番通りに見たいんだよ」
「昔のプログラムだと一番上の行から読み始めればよかったんだけど、UE4みたいにイベントで動くタイプのゲームエンジンって、どういう順番でイベントが動いていくのかわかりにくいからね。公式の資料にもなかった気がする」
妹「なんでそんな肝心なことわからないままでゲーム作れるの……」
「基本的にはどっちが先かで動きが変わるような作り方をしてない。公式の資料にもないってことは、そういう作り方をして欲しくないということだろうし。バージョンアップでいつ順番が変わってもおかしくないってことでもある」
妹「でも本当は順番あるんだよね? たしかブループリントが同時に実行されることはなかったはずだし」
「順番あるよ。まず大筋の流れとしては」
コンストラクションスクリプト ↓ BeginPlay ↓ ティックとかクリックとかのイベント
「こういう順番になっている。BeginPlayの段階で他のアクターのコンストラクションスクリプトは全部終わってるし、ティックイベントの段階ではBeginPlayは終わってる」
妹「うーん、つまりゲーム始まってすぐに超高速でクリックしても、BeginPlayより先にクリックイベントは起きないってこと?」
「起きない。もっともこれはレベルが開始した時からあるアクターの話で、後でスポーンさせたアクターはその段階でイベントが起きるから、弾のBeginPlayよりも、他のイベントが先になるけど」
妹「じゃあBeginPlayの中ではどれが早いの?」
「実際にそれぞれのイベントにPrintStringノードを置いて試してみたけど、」
PlayerController ↓ 自分でレベルに設置したActor ↓ GameMode ↓ レベルブループリント
「こういう順番だった。自分で設置したActorの中でも順番はあるみたいだけど条件が特定出来なかった」
妹「PlayerControllerというのは、GameModeの設定のとこにあったやつ?」
「そう。GameMode関連には空欄には出来ないとこがいくつかあるから、その分は何かのクラスが作られてる。そのへんのクラスはPlayerControllerのBeginPlayより前に自動作成される」
妹「それで結局どこを見たら良いんだろ?」
「ゲームの最初から順番に見ていくということなら、まず最初のレベルを確認しないと駄目かな。最初のステージだったり、タイトル画面だったりするんだけど」
「ここにゲームとして完成した時に最初のレベルになるやつが書いてある。ここに書いてあるGameModeを最初の画面で使ってるとは限らないけど、ここに書いてるのが一番重要なやつではある」
妹「ふむふむ」
「レベルを開いたら、まずレベルブループリントとGameModeのBeginPlayを確認して、次にPlayerControllerを見る。これでだいたいのことはわかる。あとは細かい動きとかはそれぞれのアクターを見ていく。終わったら次のレベルに行く。おしまい」
妹「もう少しヒント下さい」
「ヒントと言われてもなんだけど、エディタで見てる時点で不思議な事が起きたら、コンポーネントの設定か、コンストラクションスクリプトで色々してそう。逆にエディタで見てると普通なのに、プレイボタンを押すと突然色々出てきた時はBeginPlayがあやしい。レベルブループリントかGameModeのどっちかだと思うけど、どっちなのかはサンプルごとに違う」
妹「プレイボタンを押してすぐじゃなく、しばらく経ってから不思議なことが起きたら?」
「そうなったキッカケを探していくしかないね。例えば敵が死んだ時に起きる事なら、敵のダメージ処理か、弾の当たる時の処理か、もしくはレベルかGameModeのティックイベントで敵の数が変化に応じて何かしてるのかもしれない。全然関係ないアクタのティックイベントとかもありえるけど、サンプルだしそんな変なことはしないだろうから」
妹「やっぱりむずかしそうだなあ。なんだか他の人が書いたブループリントって読みにくい気がするんだよ」
「それはまあブループリントでなくてもそういうものだけど。一般的な方法を説明するよりも、どれか1つサンプルを攻略してみせた方が早いかもしれない」
妹「攻略出来るの?」
「見てみないとなんともいえないけど、ブループリントしか使ってないやつだったら多分……」