Files
Emberwild/Assets/GAME/Script/Settings/SettingsDefinition.cs
T
2026-06-26 16:23:20 +02:00

133 lines
4.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System.Collections.Generic;
using UnityEngine;
namespace Ashwild.Settings
{
/// <summary>
/// Authored data for a float setting driven by a <see cref="SettingSliderWidget"/>: its default
/// value, clamp range, and the label presentation hints the widget needs.
/// </summary>
[System.Serializable]
public struct FloatSetting
{
[SerializeField] private float defaultValue;
[SerializeField] private float min;
[SerializeField] private float max;
[Tooltip("Value is multiplied by this before formatting (e.g. 100 to show a 01 value as a percentage).")]
[SerializeField] private float labelScale;
[Tooltip("Composite format applied to the scaled value, e.g. \"{0:F0}%\" or \"{0:F0}°\".")]
[SerializeField] private string labelFormat;
public float DefaultValue => defaultValue;
public float Min => min;
public float Max => max;
public float LabelScale => labelScale;
public string LabelFormat => labelFormat;
}
/// <summary>
/// One stepper entry: a value plus the text shown for it. Mirrors the (value, label) pair the
/// <see cref="SettingStepperWidget"/> consumes.
/// </summary>
[System.Serializable]
public struct StepperPreset
{
[SerializeField] private int value;
[SerializeField] private string label;
public int Value => value;
public string Label => label;
}
/// <summary>
/// Authored data for a discrete int setting driven by a <see cref="SettingStepperWidget"/>: its
/// default value and the ordered preset list.
/// </summary>
[System.Serializable]
public struct StepperSetting
{
[SerializeField] private int defaultValue;
[SerializeField] private List<StepperPreset> presets;
public int DefaultValue => defaultValue;
public IReadOnlyList<StepperPreset> Presets => presets;
/// <summary>
/// Adapts the authored presets to the (value, label) tuples the stepper widget consumes,
/// keeping the widget decoupled from this settings-data type.
/// </summary>
public IReadOnlyList<(int value, string label)> ToWidgetPresets()
{
List<(int, string)> result = new List<(int, string)>(presets != null ? presets.Count : 0);
if (presets != null)
foreach (StepperPreset preset in presets)
result.Add((preset.Value, preset.Label));
return result;
}
}
/// <summary>
/// Single source of truth for all authored settings data: per-setting defaults, clamp ranges,
/// label formatting and the FPS preset list. Read by <see cref="SettingsManager"/> (defaults +
/// clamps) and by the settings sub-panels (widget configuration), so no magic numbers or UI
/// hints live in code. Resolution/monitor indices are intentionally absent — they are derived
/// from the running hardware and resolved at runtime.
/// </summary>
[CreateAssetMenu(fileName = "SettingsDefinition", menuName = "Settings/Settings Definition")]
public class SettingsDefinition : ScriptableObject
{
#region Display
[Header("Display")]
[SerializeField] private FloatSetting brightness;
[SerializeField] private FullScreenMode defaultFullscreenMode = FullScreenMode.FullScreenWindow;
public FloatSetting Brightness => brightness;
public FullScreenMode DefaultFullscreenMode => defaultFullscreenMode;
#endregion
#region Audio
[Header("Audio")]
[SerializeField] private FloatSetting masterVolume;
[SerializeField] private FloatSetting musicVolume;
[SerializeField] private FloatSetting sfxVolume;
public FloatSetting MasterVolume => masterVolume;
public FloatSetting MusicVolume => musicVolume;
public FloatSetting SfxVolume => sfxVolume;
#endregion
#region Graphics
[Header("Graphics")]
[Tooltip("-1 keeps the project's current quality level on first run.")]
[SerializeField] private int defaultQualityLevel = -1;
[SerializeField] private bool defaultVSync = true;
[SerializeField] private StepperSetting targetFps;
[SerializeField] private FloatSetting fov;
public int DefaultQualityLevel => defaultQualityLevel;
public bool DefaultVSync => defaultVSync;
public StepperSetting TargetFps => targetFps;
public FloatSetting Fov => fov;
#endregion
#region Controls
[Header("Controls")]
[SerializeField] private FloatSetting sensitivity;
[SerializeField] private bool defaultInvertY;
[SerializeField] private bool defaultCrosshairEnabled = true;
public FloatSetting Sensitivity => sensitivity;
public bool DefaultInvertY => defaultInvertY;
public bool DefaultCrosshairEnabled => defaultCrosshairEnabled;
#endregion
}
}