Tanoda
TileSizeFitter.cs
Go to the documentation of this file.
1
3
5
7{
8 [ExecuteInEditMode]
9 [RequireComponent(typeof(RectTransform))]
10 [AddComponentMenu("Layout/Extensions/Tile Size Fitter")]
11 public class TileSizeFitter : UIBehaviour, ILayoutSelfController
12 {
13 [SerializeField]
14 private Vector2 m_Border = Vector2.zero;
15 public Vector2 Border { get { return m_Border; } set { if (SetPropertyUtility.SetStruct(ref m_Border, value)) SetDirty(); } }
16
17 [SerializeField]
18 private Vector2 m_TileSize = Vector2.zero;
19 public Vector2 TileSize { get { return m_TileSize; } set { if (SetPropertyUtility.SetStruct(ref m_TileSize, value)) SetDirty(); } }
20
21 [System.NonSerialized]
22 private RectTransform m_Rect;
23 private RectTransform rectTransform { get { if (m_Rect == null) m_Rect = GetComponent<RectTransform>(); return m_Rect; } }
24
25 private DrivenRectTransformTracker m_Tracker;
26
27 #region Unity Lifetime calls
28
29 protected override void OnEnable()
30 {
31 base.OnEnable();
32 SetDirty();
33 }
34
35 protected override void OnDisable()
36 {
37 m_Tracker.Clear();
38 LayoutRebuilder.MarkLayoutForRebuild(rectTransform);
39 base.OnDisable();
40 }
41
42 #endregion
43
44 protected override void OnRectTransformDimensionsChange()
45 {
46 UpdateRect();
47 }
48
49 private void UpdateRect()
50 {
51 if (!IsActive())
52 return;
53
54 m_Tracker.Clear();
55
56 m_Tracker.Add(this, rectTransform,
57 DrivenTransformProperties.Anchors |
58 DrivenTransformProperties.AnchoredPosition);
59 rectTransform.anchorMin = Vector2.zero;
60 rectTransform.anchorMax = Vector2.one;
61 rectTransform.anchoredPosition = Vector2.zero;
62
63 m_Tracker.Add(this, rectTransform,
64 DrivenTransformProperties.SizeDeltaX |
65 DrivenTransformProperties.SizeDeltaY);
66 Vector2 sizeDelta = GetParentSize() - Border;
67 if (TileSize.x > 0.001f)
68 sizeDelta.x -= Mathf.Floor(sizeDelta.x / TileSize.x) * TileSize.x;
69 else
70 sizeDelta.x = 0;
71 if (TileSize.y > 0.001f)
72 sizeDelta.y -= Mathf.Floor(sizeDelta.y / TileSize.y) * TileSize.y;
73 else
74 sizeDelta.y = 0;
75 rectTransform.sizeDelta = -sizeDelta;
76 }
77
78 private Vector2 GetParentSize()
79 {
80 RectTransform parent = rectTransform.parent as RectTransform;
81 if (!parent)
82 return Vector2.zero;
83 return parent.rect.size;
84 }
85
86 public virtual void SetLayoutHorizontal() { }
87 public virtual void SetLayoutVertical() { }
88
89 protected void SetDirty()
90 {
91 if (!IsActive())
92 return;
93
94 UpdateRect();
95 }
96
97#if UNITY_EDITOR
98 protected override void OnValidate()
99 {
100 m_TileSize.x = Mathf.Clamp(m_TileSize.x, 0.001f, 1000f);
101 m_TileSize.y = Mathf.Clamp(m_TileSize.y, 0.001f, 1000f);
102 SetDirty();
103 }
104#endif
105 }
106}
Credit Erdener Gonenc - @PixelEnvision.