using TMPro; using UnityEngine; namespace Northbound { public class InteractableModal : MonoBehaviour { [Header("UI References")] [SerializeField] private GameObject modalPanel; [SerializeField] private TextMeshProUGUI keyText; [SerializeField] private TextMeshProUGUI interactText; [SerializeField] private GameObject unavailablePanel; [SerializeField] private TextMeshProUGUI unavailableText; [Header("Settings")] [SerializeField] private string defaultKey = "E"; private IInteractable _currentInteractable; private Canvas _parentCanvas; private void Awake() { _parentCanvas = GetComponentInParent(); } private void Start() { if (modalPanel != null) { modalPanel.SetActive(false); } if (unavailablePanel != null) { unavailablePanel.SetActive(false); } } public void ShowModal(IInteractable interactable) { if (interactable == null) { HideModal(); return; } _currentInteractable = interactable; if (modalPanel != null) { modalPanel.SetActive(true); UpdateModalContent(); } } public void HideModal() { _currentInteractable = null; if (modalPanel != null) { modalPanel.SetActive(false); } if (unavailablePanel != null) { unavailablePanel.SetActive(false); } } public void UpdateModalContent() { if (_currentInteractable == null) return; if (keyText != null) { keyText.text = defaultKey; } if (interactText != null) { string prompt = _currentInteractable.GetInteractionPrompt(); interactText.text = ExtractInteractText(prompt); } } private string ExtractInteractText(string prompt) { if (string.IsNullOrEmpty(prompt)) return string.Empty; int startIndex = prompt.IndexOf(']'); if (startIndex >= 0 && startIndex + 1 < prompt.Length) { return prompt.Substring(startIndex + 1).Trim(); } return prompt; } /// /// 상호작용 불가능 메시지를 표시합니다. /// /// 상호작용 불가능한 대상 public void ShowUnavailableMessage(IInteractable interactable) { if (interactable == null) { HideModal(); return; } if (unavailablePanel != null) { // unavailablePanel이 할당된 경우 전용 패널 사용 if (modalPanel != null) { modalPanel.SetActive(false); } unavailablePanel.SetActive(true); if (unavailableText != null) { string prompt = interactable.GetInteractionPrompt(); unavailableText.text = ExtractInteractText(prompt); } } else if (modalPanel != null && interactText != null) { // unavailablePanel이 없는 경우 modalPanel을 사용하여 불가능 메시지 표시 modalPanel.SetActive(true); if (keyText != null) { keyText.text = ""; } string prompt = interactable.GetInteractionPrompt(); interactText.text = ExtractInteractText(prompt); } } } }