Update
This commit is contained in:
@@ -39,6 +39,9 @@ namespace Hallucinate.UI
|
||||
private Action<float> _hoveredOnChanged;
|
||||
private float _sliderMin, _sliderMax;
|
||||
|
||||
// Audio Slider Tracking for Sync
|
||||
private readonly Dictionary<string, (Slider slider, TextField input)> _audioSliders = new Dictionary<string, (Slider slider, TextField input)>();
|
||||
|
||||
// Osu-style Volume Overlay
|
||||
private VisualElement _volumeContainer;
|
||||
private VisualElement _masterRing;
|
||||
@@ -303,6 +306,7 @@ namespace Hallucinate.UI
|
||||
_sectionHeaders["SOUND"] = header;
|
||||
_content.Add(header);
|
||||
|
||||
_audioSliders.Clear();
|
||||
_content.Add(CreateSubSection("AUDIO_VOLUMES"));
|
||||
_content.Add(CreateAudioSlider(GetT("MASTER"), "MasterVolume"));
|
||||
_content.Add(CreateAudioSlider(GetT("MUSIC"), "MusicVolume"));
|
||||
@@ -456,20 +460,31 @@ namespace Hallucinate.UI
|
||||
evt.StopPropagation();
|
||||
}
|
||||
|
||||
private void UpdateMasterVolume(float delta)
|
||||
{
|
||||
_masterVol = Mathf.Clamp(_masterVol + delta, 0f, 100f);
|
||||
PlayerPrefs.SetFloat("MasterVolume", _masterVol);
|
||||
AudioManager.Instance?.SetVolume("MasterVolume", _masterVol);
|
||||
_masterVolLabel.text = $"{Mathf.RoundToInt(_masterVol)}%";
|
||||
}
|
||||
private void UpdateMasterVolume(float delta) => UpdateVolume("MasterVolume", _masterVol + delta);
|
||||
|
||||
private void UpdateSubVolume(string key, float delta)
|
||||
private void UpdateSubVolume(string key, float delta) => UpdateVolume(key, PlayerPrefs.GetFloat(key, 80f) + delta);
|
||||
|
||||
private void UpdateVolume(string key, float volume, bool updateSlider = true)
|
||||
{
|
||||
float newVal = Mathf.Clamp(PlayerPrefs.GetFloat(key, 80f) + delta, 0f, 100f);
|
||||
PlayerPrefs.SetFloat(key, newVal);
|
||||
AudioManager.Instance?.SetVolume(key, newVal);
|
||||
if (_subRings.TryGetValue(key, out var data)) data.label.text = $"{Mathf.RoundToInt(newVal)}%";
|
||||
volume = Mathf.Clamp(volume, 0f, 100f);
|
||||
PlayerPrefs.SetFloat(key, volume);
|
||||
AudioManager.Instance?.SetVolume(key, volume);
|
||||
|
||||
if (key == "MasterVolume")
|
||||
{
|
||||
_masterVol = volume;
|
||||
if (_masterVolLabel != null) _masterVolLabel.text = $"{Mathf.RoundToInt(volume)}%";
|
||||
}
|
||||
else
|
||||
{
|
||||
if (_subRings.TryGetValue(key, out var data)) data.label.text = $"{Mathf.RoundToInt(volume)}%";
|
||||
}
|
||||
|
||||
if (updateSlider && _audioSliders.TryGetValue(key, out var sliderData))
|
||||
{
|
||||
sliderData.slider.SetValueWithoutNotify(volume);
|
||||
sliderData.input.value = volume.ToString("F1");
|
||||
}
|
||||
}
|
||||
|
||||
private async void ShowVolumeOverlay()
|
||||
@@ -508,12 +523,15 @@ namespace Hallucinate.UI
|
||||
return label;
|
||||
}
|
||||
|
||||
private VisualElement CreateSliderWithInput(string labelText, float min, float max, float startVal, Action<float> OnValueChanged)
|
||||
private VisualElement CreateSliderWithInput(string labelText, float min, float max, float startVal, Action<float> OnValueChanged, string audioKey = null)
|
||||
{
|
||||
var row = new VisualElement { style = { flexDirection = FlexDirection.Row, alignItems = Align.Center, marginTop = 5, marginBottom = 5 } };
|
||||
var label = new Label(labelText) { style = { width = Length.Percent(35) } }; label.AddToClassList("text-body");
|
||||
var slider = new Slider(min, max) { value = startVal, style = { flexGrow = 1 } };
|
||||
var input = new TextField { value = startVal.ToString("F1"), style = { width = 50, marginLeft = 10 } }; input.AddToClassList("input-field");
|
||||
|
||||
if (audioKey != null) _audioSliders[audioKey] = (slider, input);
|
||||
|
||||
slider.RegisterCallback<PointerEnterEvent>(evt => { _hoveredSlider = slider; _hoveredOnChanged = OnValueChanged; _sliderMin = min; _sliderMax = max; });
|
||||
slider.RegisterCallback<PointerLeaveEvent>(evt => { if (_hoveredSlider == slider) { _hoveredSlider = null; _hoveredOnChanged = null; } });
|
||||
slider.RegisterValueChangedCallback(evt => { float val = Mathf.Round(evt.newValue * 10f) / 10f; if (input.panel?.focusController?.focusedElement != input.ElementAt(0)) input.value = val.ToString("F1"); OnValueChanged?.Invoke(val); });
|
||||
@@ -524,12 +542,10 @@ namespace Hallucinate.UI
|
||||
private VisualElement CreateAudioSlider(string label, string prefKey)
|
||||
{
|
||||
var sliderRow = CreateSliderWithInput(label, 0, 100, PlayerPrefs.GetFloat(prefKey, 80), val => {
|
||||
PlayerPrefs.SetFloat(prefKey, val); AudioManager.Instance?.SetVolume(prefKey, val);
|
||||
});
|
||||
UpdateVolume(prefKey, val, false);
|
||||
}, prefKey);
|
||||
sliderRow.RegisterCallback<WheelEvent>(evt => {
|
||||
float newVal = Mathf.Clamp(PlayerPrefs.GetFloat(prefKey, 80f) - (evt.delta.y * 2f), 0f, 100f);
|
||||
PlayerPrefs.SetFloat(prefKey, newVal); AudioManager.Instance?.SetVolume(prefKey, newVal);
|
||||
var slider = sliderRow.Q<Slider>(); if (slider != null) slider.value = newVal;
|
||||
UpdateVolume(prefKey, PlayerPrefs.GetFloat(prefKey, 80f) - (evt.delta.y * 2f));
|
||||
});
|
||||
return sliderRow;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user