こんにちは。プログラマのKです。
今回はUE4でのアニメーション最適化で利用できるVisibility Based Anim Tick Optionについてご紹介していきます。本記事は最適化についての話題ですので、UE4の基本操作やアニメーションについてある程度知識のある方向けの内容になっています。ご了承ください。

Visibility Based Anim Tick Optionとは?

SkeletalMeshComponentOptimizationカテゴリにあるプロパティで、アニメーションのTick・BoneTransformのリフレッシュ頻度を、レンダリングの有無に応じて変更することができます。(4.20以前ではMeshComponentUpdateFlagという名前だったようです)

Visibility Based Anim Tick Option

4.27.0時点では、以下の4種類のEnumが用意されています。

AlwaysTickPoseAndRefreshBones

レンダリングの有無にかかわらず、常にポーズをTick、BoneTransformをリフレッシュ。

AlwaysTickPose

常にポーズをTick、レンダリング時のみBoneTransformsをリフレッシュ。

OnlyTickMontagesWhenNotRendered

レンダリング時のみポーズをTick、BoneTransformsをリフレッシュ。レンダリングされない場合は、モンタージュのみ更新し、他はすべてスキップ。(AnimBPグラフは更新されない)

OnlyTickPoseWhenRendered

レンダリング時のみポーズをTick、BoneTransformsをリフレッシュ。
また、iniファイルからコンポーネントのデフォルト値を変更できるようです。


[/Script/Engine.SkeletalMeshComponent]
VisibilityBasedAnimTickOption=OnlyTickMontagesWhenNotRendered

※ ACharacterクラスにあらかじめ用意されているSkeletalMeshComponentは、ACharacterのコンストラクタでデフォルト値がAlwaysTickPoseに設定されているようです。

Optionの使い分け例

最適化という観点からはなるべくOnlyTickPoseWhenRenderedを選択したいところですが、いくつか注意すべき点があります。例えば、キャラクターの攻撃発生タイミングをAnimNotifyから通知している場合などにOnlyTickPoseWhenRenderedにしてしまうと、画面外にいるキャラクターから攻撃された場合にヒットが発生しない等、困ったことになってしまいます。

OnlyTickMontagesWhenNotRenderedはモンタージュが再生された場合のみTickを行ってくれる便利な設定ですので、重要なゲームロジックのNotifyはモンタージュに仕込んでおくなど、用途に応じてAnimNotifyの設定場所を使い分けておけば、必要最低限の時だけTickを回すことが可能になります。

DedicatedServerでの動作

VisibilityBasedAnimTickOptionはあくまでレンダリングの有無によって判別されるので、DedicatedServerでも例外なく「レンダリングされない」判定になります。

前項で記載したAnimNotifyについてももちろんですが、キャラクターの手や足のボーンに対してコリジョンをアタッチしたりトレースを行ったりなど、ゲームロジック側でボーンのTransformが必要な場合は、当然サーバー上でも計算が必要なため、AlwaysTickPoseAndRefreshBonesに設定する必要があります。(当然サーバーの処理負荷があがってしまうことになるので、本当に必要な場合のみにしましょう!)

最後に

いかがでしたでしょうか。今回ご紹介した内容はほんのごく一部分ですが、最適化を行う際の参考になれば幸いです。最後まで読んでいただきありがとうございました!

著者紹介 K
2013年にトイロジック入社。『Happy Wars』『ハッピーダンジョン』の開発に参加。現在はアクションゲームのキャラクター制御・AI関連などを担当。

トイロジックでは現在、一緒に働くプログラマーを募集しています。

不明点などもお気軽にお問い合わせくださいフルリモート採用も行っております、ご応募お待ちしております!