(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]


本ブログの運営者kan.kikuchiが個人で開発したゲームです!

    

LoadSceneMode.Additiveでシーンを追加した時にLightProbes(ライトプローブ)を反映する方法【Unity】


このエントリーをはてなブックマークに追加


この記事でのバージョン
Unity 2020.3.25f1


はじめに

UnityはLightProbes(ライトプローブ)で動くオブジェクトに低負荷で光の影響を与える事が出来ます。

f:id:kan_kikuchi:20220131075423g:plain


しかしLightProbes、普通にシーンをロードした時は自動で設定を反映してくれるのですが、

LoadSceneMode.Additiveでシーンを追加した時には自動では反映されません。

f:id:kan_kikuchi:20220131075501g:plain


と言う事で今回は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("ライトプローブの反映完了");
};