ライトマップをスクリプトでリアルタイムに変更する

投稿者: | 2019-12-09

こちらの記事の方法でゲーム中にライトマップを切り替えてみます。

まずブラウザ向けのビルドを想定して、Window -> Rendering -> Lighting Settings からRealtime GIをオフに、Baked GIをオンにします。

また、すぐ下のLightmapping Settings でDirectional ModeをNon-Directionalにします。

さらに下のGenerate Lightingをクリックすると、Assetsフォルダ -> Scenes -> シーン名と同名のフォルダ にライトマップとリフレクションプローブが作られます。


(ライトマップは1つしか作られませんでした。)

この2つをコピーします。コピー元のファイルを消してしまうと、新しいライトマップと入れ替わってしまうようです。

ライトの設定を変更します。

冒頭の記事のスクリプトをお借りして、ライトプローブのファイルも取り出します。

もう一度Generate Lightingをクリックしてライトマップを作ります。

ライトプローブファイルも持ってきました。

ライトマップを変更するためのコードを書きます。

// 宣言
[SerializeField] Texture2D[] lightMap;
[SerializeField] LightProbes[] lightProbe;
[SerializeField] Cubemap[] reflectionProbe;
[SerializeField] ReflectionProbe probeComponent;

LightmapData[] lightMapData0;
LightmapData[] lightMapData1;

// ---
// Start()
lightMapData0 = LightmapSettings.lightmaps; // デフォルトのライトマップをlightMapData0に入れる

lightMapData1 = new LightmapData[1]; // 空のLightmapData型の配列を作る。
lightMapData1[0] = new LightmapData(); // 1つめの要素にLightmapData型のインスタンスを作成する
lightMapData1[0].lightmapColor = lightMap[0]; // ライトマップを設定

// ---
// 1キーを押したら
LightmapSettings.lightmaps = lightMapData0;
LightmapSettings.lightProbes = lightProbe[0];
probeComponent.customBakedTexture = reflectionProbe[0];

// ---
// 2キーを押したら
LightmapSettings.lightmaps = lightMapData1;
LightmapSettings.lightProbes = lightProbe[1];
probeComponent.customBakedTexture = reflectionProbe[1];

LightmapSettings.lightmapsに LightmapData型の配列を入れるとライトマップを変更できるようです。
LightmapData型のインスタンスの lightmapColorプロパティにライトマップを設定しています。LightmapData型のインスタンスが1つでも、そのインスタンスを1つ目の要素とした配列を作らないとうまくいきません。

ライトプローブは、LightmapSettings.lightProbesにそのまま代入するだけです。

ライトプローブを変えないと、動くオブジェクトへのライトが変わりません。

コメントを残す

メールアドレスが公開されることはありません。