こんにちは。プログラマのKです。
今回はUE4でのアニメーション最適化で利用できるVisibility Based Anim Tick Optionについてご紹介していきます。本記事は最適化についての話題ですので、UE4の基本操作やアニメーションについてある程度知識のある方向けの内容になっています。ご了承ください。
目次
Visibility Based Anim Tick Optionとは?
SkeletalMeshComponent
のOptimization
カテゴリにあるプロパティで、アニメーションのTick・BoneTransformのリフレッシュ頻度を、レンダリングの有無に応じて変更することができます。(4.20以前ではMeshComponentUpdateFlagという名前だったようです)
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
に設定する必要があります。(当然サーバーの処理負荷があがってしまうことになるので、本当に必要な場合のみにしましょう!)
最後に
いかがでしたでしょうか。今回ご紹介した内容はほんのごく一部分ですが、最適化を行う際の参考になれば幸いです。最後まで読んでいただきありがとうございました!