Unity は、シーンをロードまたはアンロードする方法に応じて、ライトプローブのデータを異なる方法で更新します。
Unity は LightProbes C# オブジェクトを使用して、現在ロードされているすべてのシーンのライトプローブデータを保存します。LightProbes オブジェクトには、4 面体テッセレーションと呼ばれる内部データ 構造体が含まれています。Unity は計算に 4 面体テッセレーションを使用して、ライトプローブがゲームオブジェクトをどのように照らすかを決定します。
シーンをロードまたはアンロードすると、Unity は自動的に LightProbes オブジェクトを更新し、現在ロードされているすべてのシーンのすべてのライトプローブの位置と係数を加えます。ただし、Unity が 4 面体テッセレーションを更新するかどうかは、シーンのロード方法とアンロード方法によって異なります。
LoadSceneMode.Single を使用してシーンをロードするときには、新しいライトプローブデータが以前のライトプローブデータを完全に置き換えるため、Unity はロードプロセスの一部として 4 面体テッセレーションを自動的に更新します。
LoadSceneMode.Additiveを使用してシーンをロードするとき、またはUnloadSceneAsync でシーンをアンロードするときには、Unity は 4 面体テッセレーションを自動的に更新しません。これは、新規または削除されたライトプローブデータを再計算する必要があり、計算量が多く、この操作後にロードまたはアンロードするシーンがある可能性があるためです。
そのため、Unity は needsRetetrahedralization イベントを提供し、新しいライトプローブデータを 4 面体化するタイミングを決定できるようにしています。例えば、5 つの新しいシーンを追加ロードする場合、各シーンのロード後に 1 回ずつ、5 回データを 4 面体化することは望ましくありません。代わりに、5 つのシーンすべてがロードされ、新しいライトプローブデータがすべて準備できた後にのみ、データを 4 面体化します。
Unity が古い 4 面体テッセレーションを使用して計算を実行する場合、結果は新しくロードまたはアンロードされたライトプローブを考慮しません。つまり、ライトプローブによるゲームオブジェクトへのライティングが期待通りにならず、LightProbes.CalculateInterpolatedLightAndOcclusionProbes() または LightProbes.GetInterpolatedProbe() の呼び出しが予期しない結果を返す場合があります。
4 面体テッセレーションを強制的に更新するには、LightProbes.Tetrahedralize または LightProbes.TetrahedralizeAsync() を呼び出します。これらの関数は、現在ロードされているすべてのシーンのすべてのライトプローブからのデータで 4 面体テッセレーションを更新します。
4 面体テッセレーションの更新は CPU に負荷がかかり、ライトプローブの数に応じて CPU への影響が増加します。複数のシーンをロード/アンロードしているときに、4 面体テッセレーションの更新によってパフォーマンスに影響が出る場合は、一定量のコンテンツをロード/アンロードするまで、または、CPU がアプリケーションのパフォーマンスに影響するとは考えられなくなる時点まで、更新を遅らせるほうが良い場合があります。