using UnityEngine;
using UnityEngine.UI;
namespace TKS
{
///
/// UI 캔버스 갱신 등급(PD 2026-11-10 「리소스·정보가 얼마나 자주 바뀌는지에 따라 캔버스를 나누어 드로우콜·재구성 최소화」).
/// Static = 화면을 열 때만 바뀜(바탕 · 틀 · 고정 글자) · Event = 플레이어 조작·게임 사건 때 바뀜(값 · 선택 · 턴 · 팝업) ·
/// Frame = 매 프레임 바뀜(호흡 · 튀김 · 스크롤 · 미니맵 · 끌기 · 커서).
///
public enum UiRate
{
Static,
Event,
Frame
}
/// 캔버스 1장의 등급 표시(검증 보고 `UiLayerProbe` · 규칙 테스트가 읽는다).
[DisallowMultipleComponent]
public class UiLayerInfo : MonoBehaviour
{
public UiRate rate;
}
///
/// 캔버스 층 만들기 — 루트 캔버스(화면 단위 · 정렬 순서 · 평면 거리) + 중첩 캔버스(등급별 분리).
/// 규칙(프로젝트 CLAUDE.md 「UI 캔버스·아틀라스 구조」):
/// ① 중첩 캔버스는 overrideSorting = false(그리는 순서 · RectMask2D/Mask 자르기 유지) ② 눌리는 그래픽이 있는 층만 GraphicRaycaster
/// ③ 매 프레임 바뀌는 것은 가장 작은 단위로 자기 캔버스(UiPulse · UiPop 은 스스로 분리) ④ 캔버스 1장 = 최소 1 드로우콜이므로 등급이 같은 것은 합친다.
///
public static class UiLayer
{
public static readonly Vector2 Reference = new Vector2(1080f, 1920f);
/// 화면 단위 루트 캔버스(Screen Space - Camera · 카메라 캡처에도 찍힘).
public static Canvas Root(GameObject go, Camera cam, int order, float plane, Vector2 reference, UiRate rate, bool raycast = true)
{
var c = go.GetComponent