Version: 2023.2
言語: 日本語
ライトプローブとメッシュレンダラー
Move Light Probes at runtime

ライトプローブとシーンのロード

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 がアプリケーションのパフォーマンスに影響するとは考えられなくなる時点まで、更新を遅らせるほうが良い場合があります。

ライトプローブとメッシュレンダラー
Move Light Probes at runtime