alarm class 정리
This commit is contained in:
@@ -1,51 +1,100 @@
|
||||
using TMPro;
|
||||
using System;
|
||||
using TMPro;
|
||||
using UnityEngine;
|
||||
using UVC.Data;
|
||||
using UVC.Util;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace UVC.Factory.Alarm
|
||||
{
|
||||
/// <summary>
|
||||
/// 개별 알람을 나타내는 가장 기본적인 UI 컴포넌트입니다.
|
||||
/// 이 컴포넌트는 버튼 기능과 텍스트 표시 기능을 가지고 있으며,
|
||||
/// 상위 관리자인 'AlarmSigleIconManager'에 의해 제어됩니다.
|
||||
/// </summary>
|
||||
public class AlarmSingleIcon : MonoBehaviour
|
||||
{
|
||||
[Tooltip("클릭 가능한 UI 버튼입니다.")]
|
||||
[SerializeField] private Button button;
|
||||
|
||||
[Tooltip("알람 내용을 표시하는 텍스트입니다.")]
|
||||
[SerializeField] private TextMeshProUGUI text;
|
||||
// 버튼 내에 텍스트를 표시하기 위한 TextMeshPro 컴포넌트입니다.
|
||||
private TextMeshProUGUI buttonText;
|
||||
|
||||
private DataObject data;
|
||||
private Transform equipmentTransform;
|
||||
|
||||
public void SetData(DataObject newData, Transform equipment)
|
||||
/// <summary>
|
||||
/// 아이콘에 표시될 텍스트를 가져오거나 설정하는 프로퍼티입니다.
|
||||
/// </summary>
|
||||
public string Text
|
||||
{
|
||||
if (data == null)
|
||||
get => buttonText != null ? buttonText.text : string.Empty;
|
||||
set
|
||||
{
|
||||
data = newData;
|
||||
if (buttonText != null)
|
||||
{
|
||||
buttonText.text = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 이 버튼이 클릭되었을 때 호출될 이벤트를 정의합니다.
|
||||
/// 상위 관리자(AlarmSigleIconManager)가 이 이벤트를 구독하여 클릭 시 특정 동작(예: 상세 정보 표시)을 수행합니다.
|
||||
/// </summary>
|
||||
public Action OnClickHandler;
|
||||
|
||||
/// <summary>
|
||||
/// 컴포넌트가 생성될 때 가장 먼저 호출되는 Unity 생명주기 메서드입니다.
|
||||
/// </summary>
|
||||
private void Awake()
|
||||
{
|
||||
buttonText = GetComponentInChildren<TextMeshProUGUI>();
|
||||
if (buttonText == null)
|
||||
{
|
||||
Debug.LogWarning("Text component not found in children.", this);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 첫 번째 프레임 업데이트 전에 호출되는 Unity 생명주기 메서드입니다.
|
||||
/// </summary>
|
||||
private void Start()
|
||||
{
|
||||
if (button != null)
|
||||
{
|
||||
// 버튼의 onClick 이벤트에 HandleClick 메서드를 리스너로 등록합니다.
|
||||
// 이렇게 하면 버튼이 클릭될 때마다 HandleClick 메서드가 실행됩니다.
|
||||
button.onClick.AddListener(HandleClick);
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (var keyValue in newData)
|
||||
{
|
||||
if (data.ContainsKey(keyValue.Key))
|
||||
{
|
||||
data[keyValue.Key] = keyValue.Value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
equipmentTransform = equipment;
|
||||
|
||||
string icon = data.GetString("ICON");
|
||||
if (text != null && icon != null)
|
||||
{
|
||||
text.text = icon;
|
||||
Debug.LogWarning("Button is not assigned.");
|
||||
}
|
||||
}
|
||||
|
||||
public void OnPointerClick()
|
||||
/// <summary>
|
||||
/// 버튼 클릭 이벤트가 발생했을 때 실행되는 메서드입니다.
|
||||
/// </summary>
|
||||
private void HandleClick()
|
||||
{
|
||||
// 클릭 시 해당 설비로 카메라 포커스
|
||||
CameraController.Instance.FocusOnTarget(equipmentTransform.position, 3.0f);
|
||||
Debug.Log($"알람 [{data.GetString("MESSAGE")}]이 발생한 설비로 이동합니다.");
|
||||
// 여기서 알람 상세정보 패널을 띄워도 좋음
|
||||
// OnClickHandler 이벤트에 등록된 메서드가 있는지 확인하고, 있다면 호출합니다.
|
||||
// '?'는 Null 조건부 연산자로, OnClickHandler가 null이 아닐 경우에만 Invoke()를 실행합니다.
|
||||
OnClickHandler?.Invoke();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 이 컴포넌트가 파괴될 때 호출되는 Unity 생명주기 메서드입니다.
|
||||
/// </summary>
|
||||
private void OnDestroy()
|
||||
{
|
||||
if (button != null)
|
||||
{
|
||||
// Start에서 등록했던 클릭 이벤트 리스너를 제거합니다.
|
||||
// 이를 통해 메모리 누수를 방지할 수 있습니다.
|
||||
button.onClick.RemoveListener(HandleClick);
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogWarning("Button is not assigned.");
|
||||
}
|
||||
// 이벤트 핸들러 참조를 null로 만들어 잠재적인 메모리 문제를 방지합니다.
|
||||
OnClickHandler = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user