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