173 lines
4.1 KiB
C#
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);
|
|
}
|
|
}
|