104 lines
2.8 KiB
C#
104 lines
2.8 KiB
C#
|
/// Credit ??
|
||
|
/// Sourced from - http://forum.unity3d.com/threads/scripts-useful-4-6-scripts-collection.264161/page-3#post-2280109
|
||
|
|
||
|
using System.Collections;
|
||
|
using UnityEngine.EventSystems;
|
||
|
|
||
|
namespace UnityEngine.UI.Extensions
|
||
|
{
|
||
|
[ExecuteInEditMode]
|
||
|
[RequireComponent(typeof(RectTransform))]
|
||
|
[AddComponentMenu("Layout/Extensions/Tile Size Fitter")]
|
||
|
public class TileSizeFitter : UIBehaviour, ILayoutSelfController
|
||
|
{
|
||
|
[SerializeField] private Vector2 m_Border = Vector2.zero;
|
||
|
public Vector2 Border { get { return m_Border; } set { if (SetPropertyUtility.SetStruct(ref m_Border, value)) SetDirty(); } }
|
||
|
|
||
|
[SerializeField] private Vector2 m_TileSize = Vector2.zero;
|
||
|
public Vector2 TileSize { get { return m_TileSize; } set { if (SetPropertyUtility.SetStruct(ref m_TileSize, value)) SetDirty(); } }
|
||
|
|
||
|
[System.NonSerialized] private RectTransform m_Rect;
|
||
|
private RectTransform rectTransform { get { if (m_Rect == null) m_Rect = GetComponent<RectTransform>(); return m_Rect; } }
|
||
|
|
||
|
private DrivenRectTransformTracker m_Tracker;
|
||
|
|
||
|
#region Unity Lifetime calls
|
||
|
|
||
|
protected override void OnEnable()
|
||
|
{
|
||
|
base.OnEnable();
|
||
|
SetDirty();
|
||
|
}
|
||
|
|
||
|
protected override void OnDisable()
|
||
|
{
|
||
|
m_Tracker.Clear();
|
||
|
LayoutRebuilder.MarkLayoutForRebuild(rectTransform);
|
||
|
base.OnDisable();
|
||
|
}
|
||
|
|
||
|
#endregion
|
||
|
|
||
|
protected override void OnRectTransformDimensionsChange()
|
||
|
{
|
||
|
UpdateRect();
|
||
|
}
|
||
|
|
||
|
private void UpdateRect()
|
||
|
{
|
||
|
if (!IsActive())
|
||
|
return;
|
||
|
|
||
|
m_Tracker.Clear();
|
||
|
|
||
|
m_Tracker.Add(this, rectTransform,
|
||
|
DrivenTransformProperties.Anchors |
|
||
|
DrivenTransformProperties.AnchoredPosition);
|
||
|
rectTransform.anchorMin = Vector2.zero;
|
||
|
rectTransform.anchorMax = Vector2.one;
|
||
|
rectTransform.anchoredPosition = Vector2.zero;
|
||
|
|
||
|
m_Tracker.Add(this, rectTransform,
|
||
|
DrivenTransformProperties.SizeDeltaX |
|
||
|
DrivenTransformProperties.SizeDeltaY);
|
||
|
Vector2 sizeDelta = GetParentSize() - Border;
|
||
|
if (TileSize.x > 0.001f)
|
||
|
sizeDelta.x -= Mathf.Floor(sizeDelta.x / TileSize.x) * TileSize.x;
|
||
|
else
|
||
|
sizeDelta.x = 0;
|
||
|
if (TileSize.y > 0.001f)
|
||
|
sizeDelta.y -= Mathf.Floor(sizeDelta.y / TileSize.y) * TileSize.y;
|
||
|
else
|
||
|
sizeDelta.y = 0;
|
||
|
rectTransform.sizeDelta = -sizeDelta;
|
||
|
}
|
||
|
|
||
|
private Vector2 GetParentSize()
|
||
|
{
|
||
|
RectTransform parent = rectTransform.parent as RectTransform;
|
||
|
if (!parent)
|
||
|
return Vector2.zero;
|
||
|
return parent.rect.size;
|
||
|
}
|
||
|
|
||
|
public virtual void SetLayoutHorizontal() { }
|
||
|
public virtual void SetLayoutVertical() { }
|
||
|
|
||
|
protected void SetDirty()
|
||
|
{
|
||
|
if (!IsActive())
|
||
|
return;
|
||
|
|
||
|
UpdateRect();
|
||
|
}
|
||
|
|
||
|
#if UNITY_EDITOR
|
||
|
protected override void OnValidate()
|
||
|
{
|
||
|
m_TileSize.x = Mathf.Clamp(m_TileSize.x, 0.001f, 1000f);
|
||
|
m_TileSize.y = Mathf.Clamp(m_TileSize.y, 0.001f, 1000f);
|
||
|
SetDirty();
|
||
|
}
|
||
|
#endif
|
||
|
}
|
||
|
}
|