この記事でのバージョン
Unity 2020.3.25f1
はじめに
UnityはLightProbes(ライトプローブ)で動くオブジェクトに低負荷で光の影響を与える事が出来ます。
しかしLightProbes、普通にシーンをロードした時は自動で設定を反映してくれるのですが、
LoadSceneMode.Additiveでシーンを追加した時には自動では反映されません。
と言う事で今回はAdditiveでシーンを追加した時にLightProbesを反映する方法のご紹介です!
ちなみにLightMap(ライトマップ)はLoadSceneMode.Additiveで追加しても自動で反映されます。
なお、記事中では以下のアセットを使っています。
Village Environment Pack | 3D Historic | Unity Asset Store |
LightProbes.Tetrahedralize
さっそく本題ですが、LightProbesの設定を反映するにはLightProbes.Tetrahedralize
もしくは非同期用のTetrahedralizeAsyncを使います。
使い方は簡単、シーンを追加した後にメソッドを実行するだけ、
//ExampleSceneを追加 SceneManager.LoadScene("ExampleScene", LoadSceneMode.Additive); //ExampleSceneのLightProbesの設定を反映 LightProbes.Tetrahedralize();
とドキュメントのサンプルには書いてあるのですが、これだと反映されない事があります。
確実に反映させるにはLoadSceneとTetrahedralizeの後に待ち時間を設けます。
例えば以前紹介したDelayMethodという遅延処理用の拡張メソッドを使えば、
以下のような感じで実装出来ます。
//ExampleSceneを追加 SceneManager.LoadScene("ExampleScene", LoadSceneMode.Additive); //0.1秒後にExampleSceneのLightProbesの設定を反映 StartCoroutine(this.DelayMethod(0.1f, LightProbes.Tetrahedralize));
もしくはLoadSceneAsyncを使って非同期にシーン追加を待つという方法もあります。
(※下記の例ではUniTaskを使ってます)
public async Task AddScene(string sceneName) { //ExampleSceneを追加、ロードが完了するまで待機 await SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive); //シーンのロード完了後にExampleSceneのLightProbesの設定を反映 LightProbes.TetrahedralizeAsync(); }
なお、LightProbesの設定を反映するのは重い処理のため処理落ちする可能性が高く、
安全を期してフェードアウト中等に行うようにした方が良さそうです。
またLightProbes.needsRetetrahedralizationという
シーンの追加や削除により、LightProbesの数が変化したときに呼び出されるイベントがありますが、
Unity 2020.3.25f1では機能しておらず、どうやらUnity2021以降で使えるようです。
ちなみにLightProbes.tetrahedralizationCompletedという
Tetrahedralize(Async)が完了した時に呼び出されるイベントは機能しました。
//LightProbesの設定反映が終わったらログを出す LightProbes.tetrahedralizationCompleted += () => { Debug.Log("ライトプローブの反映完了"); };