为什么在播放模式结束时,对Skybox材质的脚本更改没有重置



My Unity应用程序会随着时间的推移(基于音频(为场景的Skybox Material Exposure属性设置动画。我的项目文件中的"材质"资产的"暴露"=1(初始值(。这很管用。

当我在Unity:内玩应用程序时

  1. 在播放之前,我选择项目中的材质(查看正在发生(
  2. 在Unity中播放应用程序
  3. 应用程序一启动,"材质"的"曝光"就会设置为非常低值(如预期(
  4. Skybox Exposure按预期设置动画(即,Skybox改变为音乐(
  5. 曝光值(在Inspector中(在开始时(#3(的第一次更改后,在播放过程中(看起来很奇怪(
  6. 当我退出播放模式时,曝光(在Inspector中(设置为最后一个播放期间的值(运行时不会显示在Inspector中(

===>我希望"材质"在退出后返回到其播放前的值。

重要信息:如果我用Sphere radius(但没有脚本(尝试同样的实验,并且在播放时手动更改球体的半径,当我退出播放模式时,它会重置(如预期(为其原始播放前值。

很明显,我错过了团结的核心。我读了所有我能找到的东西&仍然迷失了方向。(想知道问题是场景的skybox上的默认隐藏标志还是类似的东西。(

更改skybox.material.Export每个帧的场景控制器脚本:

public class AnimateSkyboxFromAudio : BaseAnimateFromAudio {
    protected override void Start() {
         base.Start ();
    }
    protected override void MyUpdate () {
        float rms = GetAttrByName (AudioAnalyzer.RMS);
        RenderSettings.skybox.SetFloat ("_Exposure", rms * 5);
    }
}

我希望材料在退出。

RenderSettings.skybox的工作方式与其他具有材质的GameObjects不同。它返回共享材料引用,这与Renderer.material在访问其材料属性时返回的唯一材料不同。

因此,在修改之前必须备份该材料。当您单击"停止"时,将备份材料分配回RenderSettings.skybox。这两者都可以在Start()OnDisable()函数中完成。通过使用material参数调用material类构造函数,可以生成备份材质。(Material newMat = new Material(RenderSettings.skybox)(。

如果只有在更改_Exposure属性,那么您甚至不需要进行材料备份。只需使用RenderSettings.skybox.GetFloat("_Exposure");备份_Exposure属性,然后在单击停止时重新分配它。

曝光值(在Inspector中(在第一次开始时的变化(#3(,在播放过程中(看起来很奇怪(,

更改材质值后,请调用DynamicGI.UpdateEnvironment();

使用UI Slider:更改Skybox _Exposure属性的示例

public Slider slider;
Material backUpMaterial;
void Start()
{
    slider.minValue = 0f;
    slider.maxValue = 3f;
    slider.value = 1.3f;

    //Get Material Backup
    backUpMaterial = makeSkyboxBackUp();
    slider.onValueChanged.AddListener(delegate { sliderCallBack(slider.value); });
}
void sliderCallBack(float value)
{
    RenderSettings.skybox.SetFloat("_Exposure", value);
    DynamicGI.UpdateEnvironment();
}
Material makeSkyboxBackUp()
{
    return new Material(RenderSettings.skybox);
}

//Restore skybox material back to the Default values
void OnDisable()
{
    RenderSettings.skybox = backUpMaterial;
    DynamicGI.UpdateEnvironment();
    slider.onValueChanged.RemoveListener(delegate { sliderCallBack(slider.value); });
}

由于您已经修改了skybox设置的原始副本,我建议您通过将_Exposure属性设置为默认值1.3来重置它,然后尝试上面的解决方案。

相关内容

  • 没有找到相关文章

最新更新