我有一个设置菜单,里面有音量、视距和质量滑块的选项。我想保存这些值,并在玩家加载到游戏中时使用它们。我的问题是在音量保存正确的情况下重置质量级别和视距。
private void Start()
{
if(!PlayerPrefs.HasKey("musicVolume"))
{
PlayerPrefs.SetFloat("musicVolume",1);
Load();
}
else
{
Load();
}
if (!PlayerPrefs.HasKey("qualityLevel"))
{
PlayerPrefs.SetInt("qualityLevel",6);
Load();
}
else
{
Load();
}
if (!PlayerPrefs.HasKey("ViewDistance"))
{
PlayerPrefs.SetFloat("ViewDistance", 10);
Load();
Debug.Log("saved viewdistance" + qualityslider.value * 1000);
}
else
{
Load();
}
}
private void Save()
{
PlayerPrefs.SetFloat("musicVolume", volumeslider.value);
PlayerPrefs.SetInt("qualityLevel", QualitySettings.GetQualityLevel());
PlayerPrefs.SetFloat("ViewDistance", qualityslider.value);
}
private void Load()
{
volumeslider.value = PlayerPrefs.GetFloat("musicVolume");
qualityslider.value = PlayerPrefs.GetFloat("ViewDistance");
QualitySettings.SetQualityLevel(PlayerPrefs.GetInt("qualityLevel"));
}
public void ChangeVolume ()
{
Save();
AudioListener.volume = volumeslider.value;
}
public void ChangeViewDistance()
{
Save();
Camera.main.farClipPlane = viewDistanceSlider.value * 1000;
}
public void ChangeQuality(float level)
{
//level = qualityslider.value;
// QualitySettings.SetQualityLevel(level, false);
switch((float)level)
{
case 0:
QualitySettings.SetQualityLevel(0); // For lowest quality
break;
case 1:
QualitySettings.SetQualityLevel(1); // For lowest quality
break;
case 2:
QualitySettings.SetQualityLevel(2); // For lowest quality
break;
case 3:
QualitySettings.SetQualityLevel(3); // For lowest quality
break;
case 4:
QualitySettings.SetQualityLevel(4); // For lowest quality
break;
case 5:
QualitySettings.SetQualityLevel(5); // For lowest quality
break;
case 6:
QualitySettings.SetQualityLevel(6); // For lowest quality
break;
}
}
这是我第一次尝试保存和加载播放器首选项的统一。我没有收到任何错误,也找不到任何在线。音量保存,但视图距离和质量没有。
第一节第三节第一节第一节第四节第一节
4条答案
按热度按时间sr4lhrrt1#
主要的错误在于
滑球打错了!)
一般来说,您可以将值
Load
到滑块中,但不会将其应用到实际系统中!在谈到这一点之前,还有一些其他的评论。
在
ChangeQuality
中,您正在对float
值使用switch
。对于
float
,它们几乎不可能完全匹配整数值!例如,0.5 + 0.5
可能不是预期的1
,而是1.0000001
或0.99999999
,在这种情况下,它不会输入预期的case
。你可能更愿意这样做。
除此之外,如前所述,您不会在该方法中调用
Save
。一般来说,整个
Start
方法可以通过简单地提供如下的回退/默认值来大大简化然后,后来我总是只实际设置更改的值,而不是每次轮询并保存它们。
因此,您应该使用参数化回调并执行以下操作
最后回到第一点:
实际上加载后调用所有这些一次!
a11xaf1n2#
ChangeVolume()函数调用保存(),但ChangeQuality()函数不调用。
c8ib6hqw3#
嗯,首先,
你检查密钥是否存在,如果你没有设置值,你可以只使用
PlayerPrefs.GetFloat("YourKey", DefaultValue)
,因为当玩家需要一个不同的值时,他们只需要在设置中更改它,新的值就会被读取。其次,你不需要总是更新的首选项,只有当他们改变,即你改变音量和只保存音量,它更容易写和读。
第三,在
ChangeQuality(float level)
中,如果你想使用0到6的范围,你可以只使用QualitySettings.SetQualityLevel(level)
和Mathf.Clamp(level, 0, 6)
。检查之后,如果调用
ChangeViewDistance()
和ChangeQuality()
,这可能就是问题的全部原因。e7arh2l64#
要将滑块的更改值保存到PlayerPrefs,您的公共方法必须如下所示
您需要使用
System.Single
,因为它将帮助Unity自动传递新值,以便您保存它。列表中的方法必须位于“动态浮点”标签下