#nullable enable using UnityEngine; using UnityEngine.UIElements; namespace UVC.UIToolkit { /// /// UIToolkit 기반 이미지 메뉴 아이템 UI 컴포넌트입니다 (Image 또는 Material Icon 기반). /// 메뉴 아이템의 시각적 표현과 클릭 이벤트를 처리합니다. /// /// /// /// // 이미지 메뉴 아이템 생성 /// var menuItem = new UTKTopMenuImageItem(); /// menuItem.SetData(imageItemData); /// /// // 클릭 이벤트 구독 /// menuItem.OnClicked += (data) => Debug.Log($"Clicked: {data.ItemId}"); /// /// // 사용 후 정리 /// menuItem.Dispose(); /// /// [UxmlElement] public partial class UTKTopMenuImageItem : UTKMenuItemBase { #region Constants private const string UXML_PATH = "UIToolkit/Menu/UTKMenuImageItem"; private const string USS_PATH = "UIToolkit/Menu/UTKMenuImageItemUss"; private const string MATERIAL_ICONS_FONT_PATH = "Fonts/MaterialIcons-Regular"; #endregion #region Fields private UTKLabel? _iconLabel; // Material Icon용 private Image? _image; // 일반 이미지용 private bool _useMaterialIcon; #endregion #region Constructor /// /// UTKTopMenuImageItem의 새 인스턴스를 초기화합니다. /// public UTKTopMenuImageItem() : base() { _ussPath = USS_PATH; } #endregion #region Setup /// /// UI를 생성합니다. /// protected override void CreateUI() { AddToClassList("utk-menu-item"); AddToClassList("utk-menu-item--image"); var asset = Resources.Load(UXML_PATH); if (asset != null) { CreateUIFromUxml(asset); } else { CreateUIFallback(); } } /// /// UXML에서 UI를 생성합니다. /// /// UXML 에셋 private void CreateUIFromUxml(VisualTreeAsset asset) { var root = asset.Instantiate(); // USS를 root에 추가 var uss = Resources.Load(USS_PATH); if (uss != null) { root.styleSheets.Add(uss); } // UI 요소 참조 가져오기 (쿼리 캐싱) _button = root.Q