5using System.Collections;
12 [AddComponentMenu(
"UI/Extensions/Stepper")]
13 [RequireComponent(typeof(RectTransform))]
16 private Selectable[] _sides;
18 [Tooltip(
"The current step value of the control")]
19 private int _value = 0;
21 [Tooltip(
"The minimum step value allowed by the control. When reached it will disable the '-' button")]
22 private int _minimum = 0;
24 [Tooltip(
"The maximum step value allowed by the control. When reached it will disable the '+' button")]
25 private int _maximum = 100;
27 [Tooltip(
"The step increment used to increment / decrement the step value")]
28 private int _step = 1;
30 [Tooltip(
"Does the step value loop around from end to end")]
31 private bool _wrap =
false;
33 [Tooltip(
"A GameObject with an Image to use as a separator between segments. Size of the RectTransform will determine the size of the separator used.\nNote, make sure to disable the separator GO so that it does not affect the scene")]
34 private Graphic _separator;
35 private float _separatorWidth = 0;
37 private float separatorWidth
43 _separatorWidth =
separator.rectTransform.rect.width;
46 _separatorWidth /= image.pixelsPerUnit;
48 return _separatorWidth;
63 if (_sides ==
null || _sides.Length == 0)
71 public int value {
get {
return _value; }
set { _value =
value; } }
73 public int minimum {
get {
return _minimum; }
set { _minimum =
value; } }
75 public int maximum {
get {
return _maximum; }
set { _maximum =
value; } }
77 public int step {
get {
return _step; }
set { _step =
value; } }
79 public bool wrap {
get {
return _wrap; }
set { _wrap =
value; } }
85 get {
return _onValueChanged; }
86 set { _onValueChanged =
value; }
93 protected override void OnValidate()
97 RecreateSprites(
sides);
103 DisableAtExtremes(
sides);
110 if (isActiveAndEnabled)
111 StartCoroutine(DelayedInit());
116 StartCoroutine(DelayedInit());
119 IEnumerator DelayedInit()
123 RecreateSprites(
sides);
126 private Selectable[] GetSides()
128 var buttons = GetComponentsInChildren<Selectable>();
129 if (buttons.Length != 2)
131 throw new InvalidOperationException(
"A stepper must have two Button children");
136 DisableAtExtremes(buttons);
153 private void Step(
int amount)
167 DisableAtExtremes(
sides);
170 _onValueChanged.Invoke(
value);
173 private void DisableAtExtremes(Selectable[]
sides)
179 private void RecreateSprites(Selectable[]
sides)
181 for (
int i = 0; i < 2; i++)
183 if (
sides[i].image ==
null)
186 var sprite = CutSprite(
sides[i].image.sprite, i == 0);
187 var side =
sides[i].GetComponent<StepperSide>();
190 side.cutSprite = sprite;
192 sides[i].image.overrideSprite = sprite;
196 static internal Sprite CutSprite(Sprite sprite,
bool leftmost)
198 if (sprite.border.x == 0 || sprite.border.z == 0)
201 var rect = sprite.rect;
202 var border = sprite.border;
206 rect.xMax = border.z;
211 rect.xMin = border.x;
215 return Sprite.Create(sprite.texture, rect, sprite.pivot, sprite.pixelsPerUnit, 0, SpriteMeshType.FullRect, border);
222 RecreateSprites(
sides);
224 RectTransform transform = this.transform as RectTransform;
225 float width = (transform.rect.width / 2) - separatorWidth;
227 for (
int i = 0; i < 2; i++)
229 float insetX = i == 0 ? 0 : width + separatorWidth;
231 var rectTransform =
sides[i].GetComponent<RectTransform>();
232 rectTransform.anchorMin = Vector2.zero;
233 rectTransform.anchorMax = Vector2.zero;
234 rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Left, insetX, width);
235 rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Top, 0, transform.rect.height);
242 var sepTransform = gameObject.transform.Find(
"Separator");
243 Graphic sep = (sepTransform !=
null) ? sepTransform.GetComponent<Graphic>() : (GameObject.Instantiate(
separator.gameObject) as GameObject).GetComponent<Graphic>();
244 sep.gameObject.name =
"Separator";
245 sep.gameObject.SetActive(
true);
246 sep.rectTransform.SetParent(this.transform,
false);
247 sep.rectTransform.anchorMin = Vector2.zero;
248 sep.rectTransform.anchorMax = Vector2.zero;
249 sep.rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Left, width, separatorWidth);
250 sep.rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Top, 0, transform.rect.height);
System.Drawing.Image Image
void LayoutSides(Selectable[] sides=null)
StepperValueChangedEvent onValueChanged
Credit Erdener Gonenc - @PixelEnvision.