using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; using UnityEngine.UI; namespace MoreMountains.Tools { /// /// A class used to bind a slider to a MMDebugMenu /// public class MMDebugMenuItemSlider : MonoBehaviour { /// the possible modes this slider can operate on public enum Modes { Float, Int } [Header("Bindings")] /// the selected mode for this slider public Modes Mode = Modes.Float; /// the Slider to use to change the value public Slider TargetSlider; /// the text comp used to display the slider's name public Text SliderText; /// the text comp used to display the slider's value public Text SliderValueText; /// the target knob public Image SliderKnob; /// the line behind the knob public Image SliderLine; /// the value to remap the slider's 0 to public float RemapZero = 0f; /// the value to remap the slider's 1 to public float RemapOne = 1f; /// the name of the event bound to this slider public string SliderEventName = "Checkbox"; /// the current slider value [MMReadOnly] public float SliderValue; /// the current slider int value [MMReadOnly] public int SliderValueInt; protected bool _valueSetThisFrame = false; protected bool _listening = false; /// /// On Awake we start listening for slider changes /// protected virtual void Awake() { TargetSlider.onValueChanged.AddListener(delegate { ValueChangeCheck(); }); } /// /// Invoked when the slider value changes /// public void ValueChangeCheck() { if (_valueSetThisFrame) { _valueSetThisFrame = false; return; } bool valueChanged = true; SliderValue = MMMaths.Remap(TargetSlider.value, 0f, 1f, RemapZero, RemapOne); if (Mode == Modes.Int) { SliderValue = Mathf.Round(SliderValue); if (SliderValue == SliderValueInt) { valueChanged = false; } SliderValueInt = (int)SliderValue; } if (valueChanged) { UpdateValue(SliderValue); } TriggerSliderEvent(SliderValue); } protected virtual void UpdateValue(float newValue) { SliderValueText.text = (Mode == Modes.Int) ? newValue.ToString() : newValue.ToString("F3"); } /// /// Triggers a slider event /// /// protected virtual void TriggerSliderEvent(float value) { MMDebugMenuSliderEvent.Trigger(SliderEventName, value, MMDebugMenuSliderEvent.EventModes.FromSlider); } /// /// When we get a set slider event, we set our value /// /// /// protected virtual void OnMMDebugMenuSliderEvent(string sliderEventName, float value, MMDebugMenuSliderEvent.EventModes eventMode) { if ((eventMode == MMDebugMenuSliderEvent.EventModes.SetSlider) && (sliderEventName == SliderEventName)) { _valueSetThisFrame = true; TargetSlider.value = MMMaths.Remap(value, RemapZero, RemapOne, 0f, 1f); UpdateValue(value); } } /// /// Starts listening for events /// public virtual void OnEnable() { if (!_listening) { MMDebugMenuSliderEvent.Register(OnMMDebugMenuSliderEvent); _listening = true; } } /// /// Stops listening for events /// public virtual void OnDestroy() { _listening = false; MMDebugMenuSliderEvent.Unregister(OnMMDebugMenuSliderEvent); } } }