Files
Northbound/Assets/Scripts/InteractableModal.cs

146 lines
3.9 KiB
C#

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<Canvas>();
}
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;
}
/// <summary>
/// 상호작용 불가능 메시지를 표시합니다.
/// </summary>
/// <param name="interactable">상호작용 불가능한 대상</param>
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);
}
}
}
}