Реализация глобальных настроек игры
Для шашечного приложения я хочу реализовать глобальные настройки, которые сохраняются с выходом из игры: пользовательские цвета полей доски, цвета шашек, скорость передвижения шашек, громкость музыки и т.п.
Эти характеристики могут быть изменен из разных мест в игре (главное меню, основные настройки, настройки партии...)
Вопрос: как это правильно реализовать?
У меня есть 2 варианта:
- Сделать статичный класс для настроек и обращаться к нему напрямую, а при выходе из игры сериализовать настройки в файл.
public static class GlobalSettings
{
public static float CheckerJumpTime;
public static Color SquareWhiteColor;
public static Color SquareBlackColor;
...
}
- Сделать настройки ScriptableObject и отдельный класс для управления настройками. Так можно будет иметь несколько экземпляров настроек (несколько по умолчанию, несколько пользовательских) и выбирать/менять нужные по необходимости. Но в таком случае класс для управления настройками у меня неизбежно сводится к Singleton.
public class GlobalSettings : ScriptableObject
{
public float CheckerJumpTime = 0.2f;
public Color SquareWhiteColor = new Color(0.96f, 0.89f, 0.82f);
public Color SquareBlackColor = new Color(0.70f, 0.39f, 0.24f);
// ...
}
public class GlobalSettingsManager : MonoBehaviour
{
[SerializeField] private GlobalSettings[] _settings; // Экземпляры настроек
private int _currentSettingsIndex = 0; // Индекс используемых сейчас настроек
private static GlobalSettingsManager _instance; // Синглтончик :(
private void Awake()
{
if (_instance != null)
Destroy(gameObject);
_instance = FindObjectOfType<GlobalSettingsManager>();
DontDestroyOnLoad(gameObject);
}
}
В первом случае меня пугает статика, а во втором Singleton. Существует ли более "гибкий" вариант?
Ответы (1 шт):
На тему singleton и статика, singleton и есть статика. От того что там не каждое поле static (таких классов не должно существовать) и сам класс не статический, а только одно поле, не меняет того факта что весь доступ через статику.
Я бы порекомендовал все параметры настроек хранить в одной/нескольких структуре, которую легко сохранять/загружать как json в playerprefs. Готовые присеты настроек могут храниться в scriptableobject (so) который как handler этой структуры.
А непосредственно so или singleton содержащая настройки выполняет роль прокладки, которая грузит параметры в начале и автоматически/по команде сохраняет при изменении.
So это конечно замечательно, но прокидывать на него ссылку везде и ограничевать себя только связями с monobehaviour не целесообразно, тот случай когда singleton все же практичнее. Не monobeh или so, класический c# singleton.
П.с. so это не способ сохранения, он сериализуется только в редакторе и залит цементом в билде.