using UnityEngine; using UnityEngine.UI; namespace TKS.OutGame { /// /// 해상도 대응 카드 격자(PD 2026-11-09 「한 줄 최대 4명 · 가로가 길면 4명 이상 · 좁으면 3명 · 자동 리사이징」) — /// 폭에 맞춰 열 수 = round((폭 + 간격) ÷ (목표 칸 폭 + 간격)) · 최소 minColumns · 칸 폭 = 폭을 열 수로 나눔(세로 = 원래 비율) · /// 각 칸(holder)의 첫 자식 = 원래 크기(design) 카드 → 배율 Scale 로 맞춤. 기준 1080 폭(좌우 24) = 4열. /// [RequireComponent(typeof(GridLayoutGroup))] public class UiAutoGrid : MonoBehaviour { public Vector2 design = new Vector2(320f, 431f); public float targetWidth = 246f; public float gap = 16f; public int minColumns = 3; GridLayoutGroup grid; bool busy; public float Scale { get; private set; } public int Columns { get; private set; } void Awake() { grid = GetComponent(); if (Scale <= 0f) Scale = targetWidth / design.x; } void OnRectTransformDimensionsChange() { Apply(); } /// 지금 폭으로 열 수·칸 크기·카드 배율을 다시 계산(칸을 새로 넣은 뒤에도 부른다). public void Apply() { if (busy) return; if (grid == null) Awake(); var rt = (RectTransform)transform; float w = rt.rect.width - grid.padding.left - grid.padding.right; if (w <= 1f) return; busy = true; int cols = Mathf.Max(minColumns, Mathf.RoundToInt((w + gap) / (targetWidth + gap))); float cw = (w - (cols - 1) * gap) / cols; Scale = cw / design.x; Columns = cols; var cell = new Vector2(cw, design.y * Scale); if (grid.cellSize != cell) grid.cellSize = cell; if (grid.spacing != new Vector2(gap, gap)) grid.spacing = new Vector2(gap, gap); if (grid.constraintCount != cols) grid.constraintCount = cols; foreach (Transform c in transform) if (c.childCount > 0) c.GetChild(0).localScale = new Vector3(Scale, Scale, 1f); busy = false; } } }