using System; using TMPro; using UnityEngine; using UnityEngine.UI; namespace UVC.Factory.Alarm { /// /// 개별 알람을 나타내는 가장 기본적인 UI 컴포넌트입니다. /// 이 컴포넌트는 버튼 기능과 텍스트 표시 기능을 가지고 있으며, /// 상위 관리자인 'AlarmSingleIconManager'에 의해 제어됩니다. /// public class AlarmSingleIcon : MonoBehaviour { [Tooltip("클릭 가능한 UI 버튼입니다.")] [SerializeField] private Button button; // 버튼 내에 텍스트를 표시하기 위한 TextMeshPro 컴포넌트입니다. private TextMeshProUGUI buttonText; /// /// 아이콘에 표시될 텍스트를 가져오거나 설정하는 프로퍼티입니다. /// public string Text { get => buttonText != null ? buttonText.text : string.Empty; set { if (buttonText != null) { buttonText.text = value; } } } /// /// 이 버튼이 클릭되었을 때 호출될 이벤트를 정의합니다. /// 상위 관리자(AlarmSingleIconManager)가 이 이벤트를 구독하여 클릭 시 특정 동작(예: 상세 정보 표시)을 수행합니다. /// public Action OnClickHandler; /// /// 컴포넌트가 생성될 때 가장 먼저 호출되는 Unity 생명주기 메서드입니다. /// private void Awake() { buttonText = GetComponentInChildren(); if (buttonText == null) { Debug.LogWarning("Text component not found in children.", this); } } /// /// 첫 번째 프레임 업데이트 전에 호출되는 Unity 생명주기 메서드입니다. /// private void Start() { if (button != null) { // 버튼의 onClick 이벤트에 HandleClick 메서드를 리스너로 등록합니다. // 이렇게 하면 버튼이 클릭될 때마다 HandleClick 메서드가 실행됩니다. button.onClick.AddListener(HandleClick); } else { Debug.LogWarning("Button is not assigned."); } } /// /// 버튼 클릭 이벤트가 발생했을 때 실행되는 메서드입니다. /// private void HandleClick() { // OnClickHandler 이벤트에 등록된 메서드가 있는지 확인하고, 있다면 호출합니다. // '?'는 Null 조건부 연산자로, OnClickHandler가 null이 아닐 경우에만 Invoke()를 실행합니다. OnClickHandler?.Invoke(); } /// /// 이 컴포넌트가 파괴될 때 호출되는 Unity 생명주기 메서드입니다. /// private void OnDestroy() { if (button != null) { // Start에서 등록했던 클릭 이벤트 리스너를 제거합니다. // 이를 통해 메모리 누수를 방지할 수 있습니다. button.onClick.RemoveListener(HandleClick); } else { Debug.LogWarning("Button is not assigned."); } // 이벤트 핸들러 참조를 null로 만들어 잠재적인 메모리 문제를 방지합니다. OnClickHandler = null; } } }