Android 为什么在播放模式结束时,对Skybox材质的脚本更改不会重置?

Android 为什么在播放模式结束时,对Skybox材质的脚本更改不会重置?,android,unity3d,unityscript,skybox,Android,Unity3d,Unityscript,Skybox,我的Unity应用程序随时间(基于音频)为场景的Skybox材质曝光属性设置动画。我的项目文件中的重大资产的风险敞口=1(初始值)。这很有效 当我在Unity内播放应用程序时: 在播放之前,我选择项目中的材质(以查看所需内容) 发生时) 在Unity中播放应用程序 一旦应用程序启动,该材料的曝光量就会设置为非常低 价值(如预期) Skybox曝光按预期设置动画(即,Skybox为 换上音乐) 曝光值(在Inspector中)在开始时(#3)的第一次变化后,在播放期间(看起来很奇怪),不会发生变化

我的Unity应用程序随时间(基于音频)为场景的Skybox材质曝光属性设置动画。我的项目文件中的重大资产的风险敞口=1(初始值)。这很有效

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

  • 在播放之前,我选择项目中的材质(以查看所需内容) 发生时)
  • 在Unity中播放应用程序
  • 一旦应用程序启动,该材料的曝光量就会设置为非常低 价值(如预期)
  • Skybox曝光按预期设置动画(即,Skybox为 换上音乐)
  • 曝光值(在Inspector中)在开始时(#3)的第一次变化后,在播放期间(看起来很奇怪),不会发生变化
  • 退出播放模式时,曝光(在Inspector中)设置为最后一次 播放过程中的值(运行时不会显示在检查器中)
  • ==>我希望材质在退出后返回到其播放前的值

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

    很明显,我错过了团结的核心。我已经读了所有我能找到的东西&仍然不见了。(想知道问题是场景的skybox上的默认隐藏还是类似的东西。)

    更改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);
        }
    }
    
    我希望材料在播放后恢复到播放前的值 退出

    RenderSettings.skybox
    的工作原理与其他具有材质的游戏对象不同。它返回共享材质引用,与访问其材质属性时由
    渲染器返回的唯一材质不同

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

    如果您仅更改
    \u Exposure
    属性,则您甚至不需要进行材料备份。只需使用
    RenderSettings.skybox.GetFloat(“\u Exposure”)备份
    \u Exposure
    属性即可然后在单击停止时重新分配它

    曝光值(在Inspector中)在第一次曝光后不会改变 在比赛开始时(#3)和比赛期间(看起来很奇怪)发生变化

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

    使用UI
    滑块更改Skybox
    属性的示例:

    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
    设置的原始副本,我建议您将
    \u Exposure
    属性设置为默认值
    1.3
    ,然后尝试上述解决方案。

    谢谢!你到底是怎么知道skybox.material是一个共享的参考资料的?我读过关于Unity的所有内容,但在任何地方都没有看到。我想你没有读过文件。对于我回答的第二个问题,它说“如果您在播放模式下更改skybox,您必须使用
    DynamicGI.UpdateEnvironment
    函数调用来更新环境探测器。”在.For.you的第一个问题和您的评论中,Unity在
    RenderSettings.skybox
    中没有提到这一点,相反,他们在
    Skybox.material
    中提到了它,其中说“Skybox使用的材质。请注意,与
    Renderer.material
    不同,它返回的是共享材质引用,而不是唯一的副本”。这是他们的错误,不是你的错误。我想他们希望您知道,
    RenderSettings.skybox
    skybox.material
    返回的材质与
    skybox
    使用的材质相同。再次感谢您花时间回答并提供代码示例。