unity3d 如何修复保存和加载播放首选项

hec6srdp  于 2023-02-05  发布在  其他
关注(0)|答案(4)|浏览(132)

我有一个设置菜单,里面有音量、视距和质量滑块的选项。我想保存这些值,并在玩家加载到游戏中时使用它们。我的问题是在音量保存正确的情况下重置质量级别和视距。

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

这是我第一次尝试保存和加载播放器首选项的统一。我没有收到任何错误,也找不到任何在线。音量保存,但视图距离和质量没有。

第一节第三节第一节第一节第四节第一节

sr4lhrrt

sr4lhrrt1#

主要的错误在于

qualityslider.value = PlayerPrefs.GetFloat("ViewDistance");

滑球打错了!)
一般来说,您可以将值Load到滑块中,但不会将其应用到实际系统中!
在谈到这一点之前,还有一些其他的评论。
ChangeQuality中,您正在对float值使用switch
对于float,它们几乎不可能完全匹配整数值!例如,0.5 + 0.5可能不是预期的1,而是1.00000010.99999999,在这种情况下,它不会输入预期的case
你可能更愿意这样做。

var level = Mathf.Clamp(Mathf.RoundToInt(value), 0, 6);
QualitySettings.SetQualityLevel(level);

除此之外,如前所述,您不会在该方法中调用Save
一般来说,整个Start方法可以通过简单地提供如下的回退/默认值来大大简化

private void Start ()
{
    Load();
}

private void Load()
{
    var volume = PlayerPrefs.GetFloat("musicVolume", 1);
    var distance = PlayerPrefs.GetFloat("ViewDistance", 10);
     var quality= PlayerPrefs.GetInt("qualityLevel", 6);

    // ... See below 
}

然后,后来我总是只实际设置更改的值,而不是每次轮询并保存它们。
因此,您应该使用参数化回调并执行以下操作

public void ChangeVolume (float value)   
{
    AudioListener.volume = volumeslider.value;
    PlayerPrefs.SetFloat("musicVolume", value);
}

public void ChangeViewDistance(float value)
{
    Camera.main.farClipPlane  = viewDistanceSlider.value * 1000;
    PlayerPrefs.SetFloat("ViewDistance", value);
}

public void ChangeQuality(float value)
{
    var level = Mathf.Clamp(Mathf.RoundToInt(value), 0, 7);
    QualitySettings.SetQualityLevel(level);
    PlayerPrefs.SetInt("qualityLevel", level));
}

最后回到第一点:
实际上加载后调用所有这些一次!

private void Load()
{
    var volume = PlayerPrefs.GetFloat("musicVolume", 1);
    ChangeVolume(Volume);
    var quality =  PlayerPrefs.GetInt("qualityLevel", 6);
    ChangeQuality(quality);
    var distance = PlayerPrefs.GetFloat("ViewDistance", 10);
    ChangeViewDistance(distance);
}
a11xaf1n

a11xaf1n2#

ChangeVolume()函数调用保存(),但ChangeQuality()函数不调用。

c8ib6hqw

c8ib6hqw3#

嗯,首先,
你检查密钥是否存在,如果你没有设置值,你可以只使用PlayerPrefs.GetFloat("YourKey", DefaultValue),因为当玩家需要一个不同的值时,他们只需要在设置中更改它,新的值就会被读取。
其次,你不需要总是更新的首选项,只有当他们改变,即你改变音量和只保存音量,它更容易写和读。
第三,在ChangeQuality(float level)中,如果你想使用0到6的范围,你可以只使用QualitySettings.SetQualityLevel(level)Mathf.Clamp(level, 0, 6)
检查之后,如果调用ChangeViewDistance()ChangeQuality(),这可能就是问题的全部原因。

e7arh2l6

e7arh2l64#

要将滑块的更改值保存到PlayerPrefs,您的公共方法必须如下所示

public void ChangeQuality(System.Single value) => PlayerPrefs.SetFloat("qualityLevel", Mathf.Clamp(value, 0, 6));

您需要使用System.Single,因为它将帮助Unity自动传递新值,以便您保存它。
列表中的方法必须位于“动态浮点”标签下

相关问题