読者です 読者をやめる 読者になる 読者になる

妹でもわかるUnrealEngine4

毎日更新? 妹に説明するために書いてるけど、たまにわかってない場合もあるUnrealEngine4を中心としたゲーム制作の話。略すとイモリアル

毎日更新? 妹に説明するために書いてるけど、たまにわかってない場合もあるUnrealEngine4を中心としたゲーム制作の話。略すとイモリアル

Tickイベントの実行順・ティックグループの謎

youtu.be

www.slideshare.net

「先日紹介したアンリアルフェスの動画を見てたんだけど、まず気になったのがこのブループリントマニアックスのセッションで紹介されてた、ティックグループ。スライドの方で言うと22ページ目からのところ」

f:id:una_unagi:20161107215657p:plain

「これはクラス設定のパネルには表示されなくて、クラスのデフォルトの画面にあるし、最初は折りたたんであるから見つけにくいとこにある」

妹「見かけたことありませんな」

「セッションの方では4.13の英語版の画面で紹介されてるけど、日本語だとこんな感じで、4.13と4.14previewの両方とも同じだった。フィジックス前・中・後、アップデート後の4つで、実際に動作するのも順番もこの順」

妹「どういう設定なの?」

「フィジックスっていうのは物理演算処理のPhysicsの話で、要するにTickの発生タイミングを物理演算の前にするのか、後にするのか、それを変更出来る」

f:id:una_unagi:20161107220509p:plain
f:id:una_unagi:20161107220421p:plain

「これは空中のActorを、Physics有効、その中の重力も有効にした状態で、落っことした時に取ったログ。それぞれのタイミングでのGetActorLocationをPrintする仕組みにした」

妹「見てもよくわからない……」

「とりあえず落下したり、跳ね返ったりして、Zだけが変化するんだけど、"フィジックス前"と"フィジックス後"で座標が違う。つまりこの途中でアクターが移動がしてるってこと」

妹「"フィジックス中"は? この時だけXも動いてるような?」

「これはちょっと特殊で、フィジックスの前でも後でもなく、途中でやっちゃうやつ。でも途中だから計算途中の変な位置になるみたい。この場合で言うと、物理コンストレイントが設定してあって、XとYは固定されてるからZしか動かないはずなんだけど、でも計算中にはブレが起きてるみたい」

妹「なんかこれだけあやしいね」

「"フィジックス中"は物理演算と同時にやるとあやしい結果になる。座標とか回転とかの、物理に関係する箇所は扱わない方がいいティックグループ。でも一番高速になるらしいから、物理と関係ない処理や、物理オフのActorで使う分には良さそう。兄的には"フィジックス中"じゃなく、"フィジックス無"って印象」

妹「ふんふん。フィジックスはわかったけど、最後のアップデート後っていうのは?」

「Updateっていうのは、物理とかティックとかの毎フレームやる処理全般のことで、それが終わった後、つまり画面表示を更新する直前、最終調整用って感じになる。例えばCharacterMovementComponentは、"フィジックス後"のタイミングで動くから、その後にやりたい処理がある場合とかで使う」

妹「コンポーネントにもティックグループあるんだ」

「ある。アクターとコンポーネントとそれぞれにあって、それぞれのTickがそのタイミングで動く。4つのタイミングで位置をprintするのも、実際には4つのコンポーネントをくっつけて、それぞれのティックグループを変えて実験してる」

妹「コンポーネントのティックグループはどこで変えるの?」

「自分で作ったコンポーネントの場合は、アクターと同じで"クラスのデフォルト"で設定できる。それ以外にSetTickGroupノードを使っても変えられる」

妹「いままで気にしてなかっただけで、全部ティックグループというのが設定されてて、その順番で動いてたのか」

「そうなるね。どっちが先なのかで動きが変わりそうな場合とかは、気にした方が良さそう。ちなみにざっと調べた感じではこういう初期設定になってる」

  • アクター全般 "フィジックス前"
  • コンポーネント全般 "フィジックス中"
  • MovementComponent系 "フィジックス前"
  • CharacterMovement "フィジックス後"

妹「これってどこに書いてあるの?」

C++で書いてあるのを見てきたんだけど、エディタ上やブループリントで普通に確認する方法はないかも。GetTickGroupというノードはないみたいだし。継承したクラスを作れる場合には、継承したクラスのデフォルト値を見てもわかる」