using System; using System.Collections.Generic; using Michsky.UI.Heat; using Obvious.Soap; using UnityEngine; using UnityEngine.Events; public class GameSettingBinder : MonoBehaviour { [Serializable] public struct SettingsPrefs { public enum SettingsType { HorizontalSelector = 0, Switch = 1, Dropdown = 2, Slider = 3 } [Serializable] public struct ValueToEventBind { public int value; public UnityEvent unityEvent; } public SettingsType type; public string prefsKey; public IntVariable soapVariableToUpdate; public BoolVariable soapBoolVariableToUpdate; public FloatVariable soapFloatVariableToUpdate; public List eventBinds; } public GraphicsManager graphicsManager; public BoolVariable settings_loadedFromPlayerPrefs; public IntVariable SettingLevel; public FloatVariable MouseSensitivity; public FloatVariable settings_audio_underwater; public IntVariable settings_drawDistance; public UnityEvent OnSettingChanged = new UnityEvent(); public UnityEvent OnChangeAudioUnderwater = new UnityEvent(); public UnityEvent OnChangeDrawDistance = new UnityEvent(); public List settingsPrefsToLoad; private void Start() { LoadFromPlayerPrefs(); } private void OnEnable() { SettingLevel.OnValueChanged += SettingLevelOnOnValueChanged; settings_audio_underwater.OnValueChanged += Settings_audio_underwater_OnValueChanged; settings_drawDistance.OnValueChanged += Settings_drawDistance_OnValueChanged; } private void OnDisable() { SettingLevel.OnValueChanged -= SettingLevelOnOnValueChanged; settings_audio_underwater.OnValueChanged -= Settings_audio_underwater_OnValueChanged; settings_drawDistance.OnValueChanged -= Settings_drawDistance_OnValueChanged; } private void SettingLevelOnOnValueChanged(int obj) { OnSettingChanged.Invoke(obj); } private void Settings_audio_underwater_OnValueChanged(float volume) { OnChangeAudioUnderwater.Invoke(volume); } private void Settings_drawDistance_OnValueChanged(int level) { OnChangeDrawDistance.Invoke(level); } private void LoadFromPlayerPrefs() { if (settings_loadedFromPlayerPrefs.Value) { return; } settings_loadedFromPlayerPrefs.Value = true; foreach (SettingsPrefs item in settingsPrefsToLoad) { string text = ""; switch (item.type) { case SettingsPrefs.SettingsType.HorizontalSelector: text = "HorizontalSelector_"; break; case SettingsPrefs.SettingsType.Switch: text = "Switch_"; break; case SettingsPrefs.SettingsType.Dropdown: text = "Dropdown_"; break; case SettingsPrefs.SettingsType.Slider: text = "Slider_"; break; } text += item.prefsKey; if (!PlayerPrefs.HasKey(text)) { continue; } float num = 0f; if (item.type == SettingsPrefs.SettingsType.Switch) { num = ((PlayerPrefs.GetString(text) == "true") ? 1f : 0f); } else if (item.type == SettingsPrefs.SettingsType.HorizontalSelector) { num = PlayerPrefs.GetInt(text); } else if (item.type == SettingsPrefs.SettingsType.Slider) { num = PlayerPrefs.GetFloat(text); } if ((UnityEngine.Object)(object)item.soapVariableToUpdate != null) { item.soapVariableToUpdate.Value = (int)num; } if ((UnityEngine.Object)(object)item.soapBoolVariableToUpdate != null) { item.soapBoolVariableToUpdate.Value = num == 1f; } if ((UnityEngine.Object)(object)item.soapFloatVariableToUpdate != null) { item.soapFloatVariableToUpdate.Value = num; } foreach (SettingsPrefs.ValueToEventBind eventBind in item.eventBinds) { if ((float)eventBind.value == num) { eventBind.unityEvent.Invoke(); break; } } } string key = "Dropdown_Resolution"; if (PlayerPrefs.HasKey(key)) { int value = PlayerPrefs.GetInt(key); value = Mathf.Clamp(value, 0, Screen.resolutions.Length); graphicsManager?.InitializeResolutions(); graphicsManager?.SetResolution(value); } OnSettingChanged.Invoke(SettingLevel.Value); OnChangeAudioUnderwater.Invoke(settings_audio_underwater.Value); OnChangeDrawDistance.Invoke(settings_drawDistance.Value); } }