1

我的 Unity 应用程序会随着时间(基于音频)为场景的 Skybox Material Exposure 属性设置动画。我的项目文件中的 Material 资产具有 Exposure=1(初始值)。这很好用。

当我在 Unity 中播放应用程序时:

  1. 在播放之前,我在 Project 中选择 Material(看看发生了什么),
  2. 在 Unity 中播放应用程序,
  3. 应用程序启动后,材质的曝光设置为非常低的值(如预期的那样),
  4. Skybox Exposure 的动画效果符合预期(即 Skybox 正在改变音乐),
  5. 曝光值(在 Inspector 中)在开始时(#3)的第一次更改后没有改变,在播放期间(看起来很奇怪),
  6. 当我退出播放模式时,曝光(在检查器中)设置为播放期间的最后一个值(运行时检查器中不显示)。

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

重要提示:如果我尝试使用 Sphere 半径(虽然没有脚本)进行相同的实验,并且在播放时手动更改球体的半径,当我退出播放模式时,它会(如预期)重置为其原始的播放前值。

显然,我缺少 Unity 的一些非常核心的东西。我已经阅读了所有我能找到但仍然丢失的东西。(想知道问题是否是场景天空盒上的默认隐藏标志或类似的东西。)

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

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);
    }
}
4

1 回答 1

3

我希望材质在退出后恢复到播放前的值。

RenderSettings.skybox与其他具有材质的游戏对象不同。它返回共享材料参考Renderer.material,这与访问其材料属性时返回的唯一材料不同。

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

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

曝光值(在 Inspector 中)在开始时(#3)的第一次更改后没有改变,在播放期间(看起来很奇怪),

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

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

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为默认值来重置它,然后尝试上面的解决方案。

于 2016-08-10T02:32:59.713 回答