Tickイベントの実行順・ティックグループの謎
www.slideshare.net
「先日紹介したアンリアルフェスの動画を見てたんだけど、まず気になったのがこのブループリントマニアックスのセッションで紹介されてた、ティックグループ。スライドの方で言うと22ページ目からのところ」
「これはクラス設定のパネルには表示されなくて、クラスのデフォルトの画面にあるし、最初は折りたたんであるから見つけにくいとこにある」
妹「見かけたことありませんな」
「セッションの方では4.13の英語版の画面で紹介されてるけど、日本語だとこんな感じで、4.13と4.14previewの両方とも同じだった。フィジックス前・中・後、アップデート後の4つで、実際に動作するのも順番もこの順」
妹「どういう設定なの?」
「フィジックスっていうのは物理演算処理のPhysicsの話で、要するにTickの発生タイミングを物理演算の前にするのか、後にするのか、それを変更出来る」
「これは空中のActorを、Physics有効、その中の重力も有効にした状態で、落っことした時に取ったログ。それぞれのタイミングでのGetActorLocationをPrintする仕組みにした」
妹「見てもよくわからない……」
「とりあえず落下したり、跳ね返ったりして、Zだけが変化するんだけど、"フィジックス前"と"フィジックス後"で座標が違う。つまりこの途中でアクターが移動がしてるってこと」
妹「"フィジックス中"は? この時だけXも動いてるような?」
「これはちょっと特殊で、フィジックスの前でも後でもなく、途中でやっちゃうやつ。でも途中だから計算途中の変な位置になるみたい。この場合で言うと、物理コンストレイントが設定してあって、XとYは固定されてるからZしか動かないはずなんだけど、でも計算中にはブレが起きてるみたい」
妹「なんかこれだけあやしいね」
「"フィジックス中"は物理演算と同時にやるとあやしい結果になる。座標とか回転とかの、物理に関係する箇所は扱わない方がいいティックグループ。でも一番高速になるらしいから、物理と関係ない処理や、物理オフのActorで使う分には良さそう。兄的には"フィジックス中"じゃなく、"フィジックス無"って印象」
妹「ふんふん。フィジックスはわかったけど、最後のアップデート後っていうのは?」
「Updateっていうのは、物理とかティックとかの毎フレームやる処理全般のことで、それが終わった後、つまり画面表示を更新する直前、最終調整用って感じになる。例えばCharacterMovementComponentは、"フィジックス後"のタイミングで動くから、その後にやりたい処理がある場合とかで使う」
妹「コンポーネントにもティックグループあるんだ」
「ある。アクターとコンポーネントとそれぞれにあって、それぞれのTickがそのタイミングで動く。4つのタイミングで位置をprintするのも、実際には4つのコンポーネントをくっつけて、それぞれのティックグループを変えて実験してる」
妹「コンポーネントのティックグループはどこで変えるの?」
「自分で作ったコンポーネントの場合は、アクターと同じで"クラスのデフォルト"で設定できる。それ以外にSetTickGroupノードを使っても変えられる」
妹「いままで気にしてなかっただけで、全部ティックグループというのが設定されてて、その順番で動いてたのか」
「そうなるね。どっちが先なのかで動きが変わりそうな場合とかは、気にした方が良さそう。ちなみにざっと調べた感じではこういう初期設定になってる」
- アクター全般 "フィジックス前"
- コンポーネント全般 "フィジックス中"
- MovementComponent系 "フィジックス前"
- CharacterMovement "フィジックス後"
妹「これってどこに書いてあるの?」
「C++で書いてあるのを見てきたんだけど、エディタ上やブループリントで普通に確認する方法はないかも。GetTickGroupというノードはないみたいだし。継承したクラスを作れる場合には、継承したクラスのデフォルト値を見てもわかる」