PlayerPrefs не работает?
Вот как я сохраняю:
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class Menu : MonoBehaviour
{
void Start()
{
if (!PlayerPrefs.HasKey("Sensitivity"))
{
PlayerPrefs.SetFloat("Sensitivity", 1f);
}
PlayerPrefs.Save();
}
public void OnSensChange(float value)
{
PlayerPrefs.SetFloat("Sensitivity", value);
PlayerPrefs.Save();
}
}
И загружаю (в другой сцене):
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class Player : MonoBehaviour
{
private float Sensitivity;
private void Awake()
{
Sensitivity = PlayerPrefs.GetFloat("Sensitivity");
PlayerPrefs.Save();
}
}
И значение не сохраняется.
Ответы (2 шт):
Автор решения: Yaroslav
→ Ссылка
Загружается 1 раз.
public class Foo
{
private const string ValueKey = "Value";
private const float DefaultValue = 1f;
private static Foo _instance;
public static Foo Instance
{
get
{
if (_instance == null)
_instance = new Foo();
return _instance;
}
}
private float _value;
public float Value
{
get => _value;
set
{
if (_value != value)
{
_value = value;
Save();
}
}
}
private Foo ()
{
Load();
}
private void Load ()
{
_value = PlayerPrefs.GetFloat(ValueKey, DefaultValue);
}
private void Save ()
{
PlayerPrefs.SetFloat(ValueKey, _value);
PlayerPrefs.Save();
}
}
public class Test : MonoBehaviour
{
[SerializeField] private KeyCode _randomValueKey = KeyCode.Z;
private void Start ()
{
Debug.Log(Foo.Instance.Value);
}
private void Update ()
{
if (Input.GetKeyDown(_randomValueKey))
RandomValue();
}
private void RandomValue ()
{
float NewValue = Random.Range(0, 100f);
Foo.Instance.Value = NewValue;
Debug.Log(NewValue);
}
}
Автор решения: r1kki
→ Ссылка
using UnityEngine;
public class TestPlayerPrefs : MonoBehaviour
{ // в вопросе операционные скобки одни тут другие, где codeStyle?
// constants
// статику и константы всё-таки пишут в начале
private const string kSensitivity = "Sensitivity";
// Private vars? private fields!
// переменные в функциях а это поля класса
[SerializeField] private float _defaultSensitivity = 1;
private float _sensitivity;
// Accessors? propertys!
// свойства обычно после полей
public float Sensitivity => _sensitivity;
// подобные комменты, в которых написано, что белое это белое,
// а чёрное это не красное, называют излишними, это грех
private void Start ()
{
LoadSensitivity();
}
public void SaveSensitivity (float value)
{
PlayerPrefs.SetFloat(kSensitivity, value);
PlayerPrefs.Save();
// то Log в начале, то в конце, надо хоть какой-то codeStyle соблюдать
Debug.Log($"Save Sensitivity = {value}");
}
private void LoadSensitivity () // зачем тут public?
{
_sensitivity = PlayerPrefs.GetFloat(kSensitivity, _defaultSensitivity);
Debug.Log($"Load Sensitivity = {_sensitivity}");
}
}