メモメモ。
これなんで出るん?
ライトビルド時間掛かるからできるだけやりたくない。
コンソールコマンドで消せるけど正しい状態を維持したい。
⇒正しいお作法を学べば回避できるじゃないか!
エラー条件
このエラーが出る操作は以下の通り。
・DirectionalLightのRotationが可変時
・SpotLight、PointLightのLocationが可変時
・SkyLightは影響しない
⇒SkyLightはLightだけど扱いが他Lightと異なる
・DirectionalLight、SpotLight、PointLightは "ALight" 継承のActor
・SkyLightは"AInfo"継承のActor
⇒"AInfo"は設定情報を持つだけのActor、GameModeやWorldSettingも"AInfo"継承
⇒全く別物のためSkyLightはエラー検出の対象外として考える
もうちょい突っ込むと
・エディタ起動だと出る
・Shipping、DebugTestでは出ない
・ライトの情報はレンダリングスレッドで常に更新
⇒PIE実行中でなくともチェック
・コンソールコマンド「DumpUnbuiltLightInterractions」でどのライトがエラーとなっているかを表示することができる。以下の例だと、"SpotLight 2"がエラー対象。Viewportには出ない。OutputLogに出る。
・コンソールコマンド「DisableAllScreenMessages」でエラー表示を消せる。
⇒全部消える&ライト異常には変わりないので意味がない!
ちょっとまとめ
・影に変更があった時ではなく、影を生成するものに変化があった時に出る
⇒正確にはライトの持つStaticShadowの情報、もしくはDynamicShadowの情報のいずれかに変化があった時
⇒それはそうだ。
=================================================
<追記>
レンダリング関連の情報は以下のドキュメントが参考になった。
https://docs.unrealengine.com/latest/INT/Programming/Rendering/index.html
上記にも記載のある通り、ワールド上に存在する物体のレンダリング情報は、プレイヤーの動作などの制御とは別のクラスで行われ、UWorldに対応するレンダリングはFSceneクラスで行われる。エラー判定の基準となるLighting情報は、FPrimitiveSceneInfo、FPrimitiveSceneProxyクラスが持ち、これらの情報を元に判定が行われる(StaticLightか?とかDynamicLightを落としているか?など)。
ただし、判定基準はLighting情報だけでなくWorld上に配置されたComponent(影を生成する物体)にも及び、これを全て正確に追うのはかなり膨大な作業である(Component毎に影の生成条件などが異なる)ため割愛。
結論:Lightを動かすとリビルドが求められる
「Lightを動かさなくともエラー」が出るという報告がAH上に幾つか見られたが、Ver4.7系だとそういった既知の不具合があるようだ。基本的には上記の内容で問題ないと思われる。
以上、覚え書き。