【UE5】WasRecentlyRendered()の罠
今回はアクターが描画されていたかを判定するWasRecentlyRenderedについてのお話です。
WasRecentlyRendered(float)とは
直近の描画でそのアクターが描画されていたかを判定する関数です。floatを引数に取ることができ、どれくらいの時間まで遡って判定するかを設定することができます。つまり引数の値が1.5だった場合、1.5秒以内に1フレームでも描画されていればtrueを返すということです。
FPSで視界内にいなければプレイヤーを追いかける敵のような実装をこれだけで行うことができます。後述の 罠 にさえかからなければ...
タイトル回収
このWasRecentlyRendered、一見かなり便利な関数に思えますが、実際は大きな落とし穴があります。
この関数が判定する「描画」には、なんとシャドウの描画も含まれているのです。
シャドウの描画は設定を切っているかよほど品質を落としていない限り、遮蔽物の有無を問わず行われるためカメラの範囲内に入ってさえいればWasRecentlyRenderedはtrueを返してしまいます。使用する際は対象アクターのシャドウ描画を切るか、遮蔽状態は関係ないものとして割り切りましょう。
#UnrealEngine5 #UE5 #UE5Study
— 鳩サブレー(服部) (@hatosable___) 2025年9月17日
WasRecentlyRendererd検証動画
遮蔽物があってもtrueが返ってくるのはシャドウ描画が悪さしていたからでした... pic.twitter.com/Zw3d98WZla
代替手段
遮蔽物をどうしても考慮に入れたい場合、C++が必要ですがプリミティブコンポーネントが持っているGetLastRenderTimeOnScreen()関数を利用しましょう。こちらはスクリーンへの描画が基準となるためシャドウ描画の影響を無視することができます。プリミティブコンポーネントの数だけ判定回数によって負荷が増える点には注意。
