5using System.Collections;
12 [AddComponentMenu(
"UI/Extensions/Segmented Control/Segmented Control")]
13 [RequireComponent(typeof(RectTransform))]
16 private Selectable[] m_segments;
18 [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")]
19 private Graphic m_separator;
20 private float m_separatorWidth = 0;
22 [Tooltip(
"When True, it allows each button to be toggled on/off")]
23 private bool m_allowSwitchingOff =
false;
25 [Tooltip(
"The selected default for the control (zero indexed array)")]
26 private int m_selectedSegmentIndex = -1;
29 [Tooltip(
"Event to fire once the selection has been changed")]
32 internal Selectable selectedSegment;
40 m_separatorWidth =
separator.rectTransform.rect.width;
43 m_separatorWidth /= image.pixelsPerUnit;
45 return m_separatorWidth;
56 if (m_segments ==
null || m_segments.Length == 0)
58 m_segments = GetChildSegments();
64 public Graphic
separator {
get {
return m_separator; }
set { m_separator = value; m_separatorWidth = 0;
LayoutSegments(); } }
66 public bool allowSwitchingOff {
get {
return m_allowSwitchingOff; }
set { m_allowSwitchingOff = value; } }
70 get {
return Array.IndexOf(
segments, selectedSegment); }
73 value =
Math.Max(value, -1);
76 m_selectedSegmentIndex = value;
80 var segment = selectedSegment.GetComponent<
Segment>();
85 selectedSegment =
null;
91 var segment = selectedSegment.GetComponent<
Segment>();
102 get {
return m_onValueChanged; }
103 set { m_onValueChanged = value; }
113 if (isActiveAndEnabled)
114 StartCoroutine(DelayedInit());
119 StartCoroutine(DelayedInit());
122 IEnumerator DelayedInit()
128 if (m_selectedSegmentIndex != -1)
133 protected override void OnValidate()
137 if (isActiveAndEnabled)
138 StartCoroutine(DelayedInit());
140 if (m_selectedSegmentIndex > transform.childCount)
147 private Selectable[] GetChildSegments()
149 var buttons = GetComponentsInChildren<Selectable>();
150 if (buttons.Length < 2)
152 throw new InvalidOperationException(
"A segmented control must have at least two Button children");
155 for (
int i = 0; i < buttons.Length; i++)
157 var segment = buttons[i].GetComponent<Segment>();
161 segment.segmentedControl =
this;
168 private void RecreateSprites()
170 for (
int i = 0; i <
segments.Length; i++)
175 var sprite = CutSprite(
segments[i].image.sprite, i == 0, i ==
segments.Length - 1);
176 var segment =
segments[i].GetComponent<Segment>();
179 segment.cutSprite = sprite;
181 segments[i].image.overrideSprite = sprite;
185 static internal Sprite CutSprite(Sprite sprite,
bool leftmost,
bool rightmost)
187 if (sprite.border.x == 0 || sprite.border.z == 0)
190 var rect = sprite.rect;
191 var border = sprite.border;
195 rect.xMin = border.x;
200 rect.xMax = border.z;
204 return Sprite.Create(sprite.texture, rect, sprite.pivot, sprite.pixelsPerUnit, 0, SpriteMeshType.FullRect, border);
211 RectTransform transform = this.transform as RectTransform;
214 for (
int i = 0; i <
segments.Length; i++)
218 var rectTransform =
segments[i].GetComponent<RectTransform>();
219 rectTransform.anchorMin = Vector2.zero;
220 rectTransform.anchorMax = Vector2.zero;
221 rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Left, insetX, width);
222 rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Top, 0, transform.rect.height);
226 var sepTransform = gameObject.transform.Find(
"Separator " + i);
227 Graphic sep = (sepTransform !=
null) ? sepTransform.GetComponent<Graphic>() : (GameObject.Instantiate(
separator.gameObject) as GameObject).GetComponent<Graphic>();
228 sep.gameObject.name =
"Separator " + i;
229 sep.gameObject.SetActive(
true);
230 sep.rectTransform.SetParent(this.transform,
false);
231 sep.rectTransform.anchorMin = Vector2.zero;
232 sep.rectTransform.anchorMax = Vector2.zero;
234 sep.rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Top, 0, transform.rect.height);
System.Drawing.Image Image
SegmentSelectedEvent onValueChanged
Credit Erdener Gonenc - @PixelEnvision.