using UnityEngine; using UnityEngine.UI; namespace Cryville.Common.Unity.UI { /// /// Fits the size of a with its cells. /// [RequireComponent(typeof(GridLayoutGroup))] public class GridLayoutSizeFitter : MonoBehaviour { RectTransform rectTransform; GridLayoutGroup gridLayoutGroup; Canvas canvas; /// /// The item count per line. /// public int GroupItemCount = 3; #pragma warning disable IDE0051 void Awake() { rectTransform = GetComponent(); gridLayoutGroup = GetComponent(); canvas = GetComponentInParent(); } void Update() { var cellSize = gridLayoutGroup.cellSize; var frameSize = rectTransform.sizeDelta; int lineCount = Mathf.CeilToInt((float)transform.childCount / GroupItemCount); var rect = RectTransformUtility.PixelAdjustRect((RectTransform)transform, canvas); if (gridLayoutGroup.startAxis == GridLayoutGroup.Axis.Horizontal) { cellSize.x = rect.width / GroupItemCount; frameSize.y = cellSize.y * lineCount; } else { cellSize.y = rect.height / GroupItemCount; frameSize.x = cellSize.x * lineCount; } gridLayoutGroup.cellSize = cellSize; rectTransform.sizeDelta = frameSize; } #pragma warning restore IDE0051 } }