14 [Tooltip(
"The main bar of the slider, used to get the actual width of the slider")]
16 [Tooltip(
"The visual marker of the slider value")]
18 [Tooltip(
"The fill that represents the volume of the shader value")]
20 [Tooltip(
"The text representation of the slider value")]
23 [Tooltip(
"Used for centered format only, will be turned off if LeftJustified")]
26 [Tooltip(
"Sends slider event information on Update")]
32 public float SliderValue
36 if (sliderValue != value)
39 OnUpdateEvent.Invoke(sliderValue);
49 [Tooltip(
"Set the starting value for the slider here.")]
50 private float sliderValue = 0;
52 [Tooltip(
"Min numeric value to display in the slider label")]
53 public float MinSliderValue = 0;
55 [Tooltip(
"Max numeric value to display in the slider label")]
56 public float MaxSliderValue = 1;
58 [Tooltip(
"Switches between a left justified or centered slider")]
59 public bool Centered =
false;
61 [Tooltip(
"Format the slider value and control decimal places if needed")]
62 public string LabelFormat =
"#.##";
65 private float mValueSpan;
66 private float mCachedValue;
67 private float mDeltaValue;
68 private Vector3 mStartCenter =
new Vector3();
69 private float mSliderMagnitude;
70 private Vector3 mStartSliderPosition;
73 private Vector3 mKnobVector;
74 private Vector3 mSliderFillScale;
75 private float mSliderWidth;
77 private float autoSliderTime = 0.25f;
78 private float autoSliderTimerCounter = 0.5f;
79 private float autoSliderValue = 0;
81 private Vector3 mSliderVector;
82 private Quaternion mCachedRotation;
88 if (MinSliderValue >= MaxSliderValue)
90 Debug.LogError(
"Your SliderGestureControl has a min value that's greater than or equal to its max value.");
91 gameObject.SetActive(
false);
95 if (Centered && MinSliderValue != -MaxSliderValue)
97 Debug.LogError(
"A centered SliderGestureControl requires that the min and max values have the same absolute value, one positive and one negative.");
98 gameObject.SetActive(
false);
104 mStartCenter.z = Knob.transform.localPosition.z;
107 mCachedRotation = SliderBar.transform.rotation;
111 SliderBar.transform.rotation = Quaternion.identity;
114 mSliderMagnitude = SliderBar.transform.InverseTransformVector(SliderBar.GetComponent<Renderer>().bounds.size).x;
117 mStartSliderPosition = mStartCenter + Vector3.left * mSliderMagnitude / 2;
119 mValueSpan = MaxSliderValue - MinSliderValue;
120 sliderValue = Mathf.Clamp(SliderValue, MinSliderValue, MaxSliderValue);
124 mDeltaValue = (SliderValue - MinSliderValue) / mValueSpan;
128 mValueSpan = (MaxSliderValue - MinSliderValue) / 2;
129 mDeltaValue = (SliderValue + mValueSpan) / 2 / mValueSpan;
132 mSliderFillScale =
new Vector3(1, 1, 1);
133 mSliderWidth = mSliderMagnitude;
134 if (SliderFill != null)
136 mSliderFillScale = SliderFill.transform.localScale;
137 mSliderWidth = SliderFill.transform.InverseTransformVector(SliderFill.GetComponent<Renderer>().bounds.size).x;
140 if (CenteredDot != null && !Centered)
142 CenteredDot.SetActive(
false);
145 SliderBar.transform.rotation = mCachedRotation;
148 mCachedValue = mDeltaValue;
150 mSliderVector = SliderBar.transform.InverseTransformPoint(mStartCenter + SliderBar.transform.right * mSliderMagnitude / 2) - SliderBar.transform.InverseTransformPoint(mStartCenter - SliderBar.transform.right * mSliderMagnitude / 2);
151 AlignmentVector = SliderBar.transform.right;
152 AlignmentVector = mSliderVector;
157 if (AlignmentVector != SliderBar.transform.right)
159 mSliderVector = SliderBar.transform.InverseTransformPoint(mStartCenter + SliderBar.transform.right * mSliderMagnitude / 2) - SliderBar.transform.InverseTransformPoint(mStartCenter - SliderBar.transform.right * mSliderMagnitude / 2);
160 AlignmentVector = SliderBar.transform.right;
162 mCachedRotation = SliderBar.transform.rotation;
165 base.ManipulationUpdate(startGesturePosition, currentGesturePosition, startHeadOrigin, startHeadRay, gestureState);
168 float delta = (CurrentDistance > 0) ? CurrentPercentage : -CurrentPercentage;
171 mDeltaValue = Mathf.Clamp01(delta + mCachedValue);
175 SliderValue = mDeltaValue * mValueSpan + MinSliderValue;
179 SliderValue = mDeltaValue * mValueSpan * 2 - mValueSpan;
187 mCachedValue = mDeltaValue;
204 switch (gestureValue)
210 autoSliderValue = 0.5f;
216 autoSliderTimerCounter = 0;
226 mValueSpan = max - min;
227 MaxSliderValue = max;
228 MinSliderValue = min;
242 SliderValue = Mathf.Clamp(value, MinSliderValue, MaxSliderValue);
243 mDeltaValue = SliderValue / MaxSliderValue;
245 mCachedValue = mDeltaValue;
249 private void UpdateVisuals()
252 mKnobVector = mStartSliderPosition + Vector3.right * mSliderMagnitude * mDeltaValue;
253 mKnobVector.z = mStartCenter.z;
259 Knob.transform.localPosition = mKnobVector;
263 if (SliderFill != null)
265 Vector3 scale = mSliderFillScale;
266 scale.x = mSliderFillScale.x * mDeltaValue;
268 Vector3 position = Vector3.left * (mSliderWidth * 0.5f - mSliderWidth * mDeltaValue * 0.5f);
274 position = Vector3.left * (mSliderWidth * 0.5f - mSliderWidth * 0.5f * (mDeltaValue + 0.5f));
275 scale.x = mSliderFillScale.x * (1 - mDeltaValue / 0.5f) * 0.5f;
279 position = Vector3.right * ((mSliderWidth * 0.5f * (mDeltaValue - 0.5f)));
280 scale.x = mSliderFillScale.x * ((mDeltaValue - 0.5f) / 0.5f) * 0.5f;
284 SliderFill.transform.localScale = scale;
285 SliderFill.transform.localPosition = position;
291 if (LabelFormat.IndexOf(
'.') > -1)
293 Label.text = SliderValue.ToString(LabelFormat);
298 Label.text = Mathf.Round(SliderValue).ToString(LabelFormat);
310 if (autoSliderTimerCounter < autoSliderTime)
314 autoSliderTimerCounter = autoSliderTime;
318 autoSliderTimerCounter += Time.deltaTime;
319 if (autoSliderTimerCounter >= autoSliderTime)
321 autoSliderTimerCounter = autoSliderTime;
322 mCachedValue = autoSliderValue;
325 mDeltaValue = (autoSliderValue - mCachedValue) * autoSliderTimerCounter / autoSliderTime + mCachedValue;
329 SliderValue = mDeltaValue * mValueSpan + MinSliderValue;
333 SliderValue = mDeltaValue * mValueSpan * 2 - mValueSpan;