Files
Ultimate-Fishing-Simulator-…/Assets/Scripts/Assembly-CSharp/GameSettingBinder.cs
2026-03-04 09:37:33 +08:00

173 lines
4.1 KiB
C#

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<ValueToEventBind> 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<int> OnSettingChanged = new UnityEvent<int>();
public UnityEvent<float> OnChangeAudioUnderwater = new UnityEvent<float>();
public UnityEvent<int> OnChangeDrawDistance = new UnityEvent<int>();
public List<SettingsPrefs> 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);
}
}