You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity脚本切换Skybox后场景GameObject过暗问题求助

Unity脚本切换Skybox后场景对象过暗的解决方法

问题描述

我需要通过脚本根据玩家选择的Skybox切换游戏中的Skybox,实现代码如下:

if(SaveGame.Load<string>("Map").Contains("Night"))
{
    dayLight.SetActive(false);
    nightLight.SetActive(true);
    RenderSettings.skybox = skyboxes[1];
}
else if(SaveGame.Load<string>("Map").Contains("Day"))
{
    dayLight.SetActive(true);
    nightLight.SetActive(false);
    RenderSettings.skybox = skyboxes[0];
}

已确认SaveGame.Load<string>("Map")功能正常,Skybox能完成日夜切换,但场景内所有GameObject会变得极暗发黑。只有从Project面板手动将Skybox材质拖到场景视图时,对象才会恢复正常,脚本切换时无控制台报错。

解决方案

1. 同步Skybox材质的曝光与伽马参数

手动拖拽材质时Unity会自动匹配场景颜色空间配置,但脚本直接赋值可能未同步这些参数。可以在赋值后强制设置材质的曝光和伽马值(替换为你手动拖拽时的参数值):

if(SaveGame.Load<string>("Map").Contains("Night"))
{
    dayLight.SetActive(false);
    nightLight.SetActive(true);
    RenderSettings.skybox = skyboxes[1];
    // 同步夜间Skybox的曝光与伽马
    RenderSettings.skybox.SetFloat("_Exposure", 1.0f);
    RenderSettings.skybox.SetFloat("_Gamma", 2.2f);
}
else if(SaveGame.Load<string>("Map").Contains("Day"))
{
    dayLight.SetActive(true);
    nightLight.SetActive(false);
    RenderSettings.skybox = skyboxes[0];
    // 同步日间Skybox的曝光与伽马
    RenderSettings.skybox.SetFloat("_Exposure", 1.2f);
    RenderSettings.skybox.SetFloat("_Gamma", 2.2f);
}

2. 强制刷新场景环境光照

脚本切换Skybox后,动态光照可能未及时更新,手动操作会触发Unity的光照刷新逻辑。在切换代码末尾添加环境光照更新:

// 切换完成后调用
DynamicGI.UpdateEnvironment();

如果使用URP/HDRP管线,需要额外更新管线的天空盒配置:

// URP管线示例
var urpAsset = GraphicsSettings.currentRenderPipeline as UniversalRenderPipelineAsset;
if(urpAsset != null)
{
    urpAsset.skyboxMaterial = RenderSettings.skybox;
    // 触发管线设置刷新
    urpAsset.renderScale = urpAsset.renderScale;
}

3. 校验灯光参数的正确性

确认dayLight和nightLight的强度、颜色参数是否符合预期,脚本激活灯光时可强制设置一次参数:

nightLight.SetActive(true);
var nightLightComp = nightLight.GetComponent<Light>();
nightLightComp.intensity = 0.6f; // 设置合适的夜间灯光强度
nightLightComp.color = new Color(0.2f, 0.3f, 0.5f); // 匹配夜间环境的灯光颜色

4. 同步环境光设置

Skybox切换后,环境光模式或强度可能未自动适配,可在脚本中手动设置:

if(SaveGame.Load<string>("Map").Contains("Night"))
{
    // ... 其他代码
    RenderSettings.ambientMode = AmbientMode.Skybox;
    RenderSettings.ambientIntensity = 0.3f; // 夜间环境光强度
}
else
{
    // ... 其他代码
    RenderSettings.ambientMode = AmbientMode.Skybox;
    RenderSettings.ambientIntensity = 0.8f; // 日间环境光强度
}

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 14:39:25