Unity中动态切换光照贴图的方法
关键代码:LightmapSettings.lightmaps = lightmapDatas;
LightmapData中操作三张图:lightmapColor,lightmapDir,以及一张ShadowMap
这里只操作前两张:
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class LightingSwitchBtn : MonoBehaviour
{
public bool IsTurnOn = false;
// / 光照信息
LightmapData[] lightmapDatas;
/// 暗的时候的贴图
public Texture2D[] lightmapDark;
public Texture2D[] lightmapDarkDir;
/// 亮的时候的贴图
public Texture2D[] lightmapLight;
public Texture2D[] lightmapLightDir;
void Awake()
{
}
public void OnPointerClick()
{
Debug.Log("1111");
SwichState();
}
public void SwichState()
{
Debug.Log("2222");
bool ClickState = !IsTurnOn;
if (ClickState)
{
SetLightMap(lightmapLight, lightmapLightDir);
}
else
{
SetLightMap(lightmapDark, lightmapDarkDir);
}
IsTurnOn = ClickState;
}
public void SetLightMap(Texture2D[] lightmapTex, Texture2D[] lightmapDir)
{
if (lightmapTex == null)
{
return;
}
lightmapDatas = new LightmapData[lightmapTex.Length];
for (int i = 0; i < lightmapTex.Length; i++)
{
LightmapData lmd = new LightmapData();
lmd.lightmapColor = lightmapTex[i];
lmd.lightmapDir = lightmapDir[i];
lightmapDatas[i] = lmd;
}
LightmapSettings.lightmaps = lightmapDatas;
}
}
更新光照贴图后,还需要更新天空球,这里以HDRP管线为例,URP和build in同理:
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Rendering;
using UnityEngine.Rendering.HighDefinition;
using UnityEngine.UI;
public class LightingSwitchBtn : MonoBehaviour
{
public bool IsTurnOn = false;
LightmapData[] lightmapDatas; /// 光照信息
[Header("上午")] /// 亮的时候的贴图
public Texture2D[] lightmapLightDir;
public Texture2D[] lightmapLight;
[Header("下午")] /// 暗的时候的贴图
public Texture2D[] lightmapDarkDir;
public Texture2D[] lightmapDark;
[Header("晚上")]/// 晚上的贴图
public Texture2D[] lightmapNightDir;
public Texture2D[] lightmapNight;
[Header("天空")]
public Texture SkyAM;
public Texture SkyPM;
public Texture SkyNight;
[Header("Volume组件")]
public Volume myVolume;
public Texture mySkyTex;
private HDRISky hdriSky;
[Range(0,1)]
public float TimeSwitch = 0;
#region BoolIsTurnOn
// public void SwichState()
// {
// Debug.Log("啊啊啊");
// bool ClickState = !IsTurnOn;
// if (ClickState)
// {
// SetLightMap(lightmapLight, lightmapLightDir);
// }
// else
// {
// SetLightMap(lightmapDark, lightmapDarkDir);
// }
// IsTurnOn = ClickState;
// }
#endregion
//天空切换
void Awake()
{
VolumeProfile volumeProfile = myVolume.profile;
volumeProfile.TryGet<HDRISky>(out hdriSky);
mySkyTex = hdriSky.hdriSky.value;
}
//光照贴图切换
public void AM_Time()
{
Debug.Log("AM");
SetLightMap(lightmapLight, lightmapLightDir);
hdriSky.hdriSky.value = SkyAM;
}
public void PM_Time()
{
Debug.Log("PM");
SetLightMap(lightmapDark, lightmapDarkDir);
hdriSky.hdriSky.value = SkyPM;
}
public void Night_Time()
{
Debug.Log("Night");
SetLightMap(lightmapNight, lightmapNightDir);
hdriSky.hdriSky.value = SkyNight;
}
public void SetLightMap(Texture2D[] lightmapTex, Texture2D[] lightmapDir)
{
if (lightmapTex == null)
{
return;
}
lightmapDatas = new LightmapData[lightmapTex.Length];
for (int i = 0; i < lightmapTex.Length; i++)
{
LightmapData lmd = new LightmapData();
lmd.lightmapColor = lightmapTex[i];
lmd.lightmapDir = lightmapDir[i];
lightmapDatas[i] = lmd;
}
LightmapSettings.lightmaps = lightmapDatas;
}
}