
頭上WidgetをScreenに表示している場合は、キャラクターが物陰の後ろに隠れた場合、自分で非表示にしなきゃならない。そのやり方をググると次のサイトがヒットする。

環境がUnreal Engine4.15.2とあるが、当時はちゃんと動いていたはず。それがどうして動かなくなったのか?

2018年12月の時点では既に仕様が変わった、というよりも調整したらしい。
以前はカリングして描画するものを減らせば軽くなるから、できるだけカリングしておこうとしていたんだと思うが、今はGPUが強力になったせいで、下手にカリングするよりも、どんどん描画させちゃった方が早いってなっちゃったみたいだ。それで動くオブジェクトをカリングの対象外にしたんだと思う。
まあそれでも折角だから、上記サイトの通りにエンジンを弄って動かしてみた。
//, bAllowApproximateOcclusion(InComponent->Mobility != EComponentMobility::Movable)
, bAllowApproximateOcclusion(true)
元のコードをコメントアウトして、常にtrueを返すようにした。動くものも全てカリングさせる。で、WasRecentlyRenderdがどうなるか?上記サイトにあるように不安定。遮蔽物があっても必ずWasRecentlyRenderdがfalseを返すとは限らない。それどころかスケーラビリティ・グループ「Epic」だと常にtrueを返してくる。シッピングしたらまた違うのかもしれないけど、そこまでテストする前に諦める。というか他に良いやり方があるのかな?とりあえずWorldの設定で表示しておく。
ただし、WasRecentlyRenderdはキャラクターが画面外にいるかどうかの判定はちゃんとできるからTickの最初に使う。
訂正)
ちょっと違ったかもしれない。エンジンを元に戻しても、遮蔽物の陰に隠れた時にWasRecentlyRenderdがfalseを返してくる。どうやらスケーラビリティのシャドウの設定が「Epic」だと必ずtrueを返してくる。「中」と「高」だとXにアップロードした動画くらいになる。「低」だとかなりちゃんとfalseを返してくる。それでもマルチプレーヤーゲームではどうだかな。他に良いやり方があれば一番いいんだけど。
コメント
[…] 【UE5】WasRecentlyRenderedについて […]