using UnityEngine; using Unity.Netcode; namespace Northbound { public class InteractableModalManager : MonoBehaviour { [Header("UI Reference (Optional - auto-finds if null)")] public InteractableModal interactableModal; [Header("References")] [SerializeField] private PlayerInteraction playerInteraction; private IInteractable _currentInteractable; private IInteractable _previousUnavailableInteractable; private bool _isEnabled = false; private void Awake() { if (playerInteraction == null) { playerInteraction = GetComponent(); } FindModalComponent(); } private void Start() { FindModalComponent(); // Start()에서 HideModal()을 호출하지 않음 - 첫 번째 Update에서 Modal이 표시되지 않는 문제 방지 // modalPanel과 unavailablePanel은 InteractableModal.Start()에서 이미 false로 설정됨 } private void FindModalComponent() { if (interactableModal != null) { return; } InteractableModal[] modals = GetComponentsInChildren(true); if (modals.Length > 0) { interactableModal = modals[0]; } } private void Update() { if (playerInteraction == null) { return; } bool isLocalPlayer = IsLocalPlayer(); if (!isLocalPlayer) { if (_isEnabled) { HideModal(); _isEnabled = false; } return; } _isEnabled = true; IInteractable detectedInteractable = GetDetectedInteractable(); IInteractable unavailableInteractable = playerInteraction.CurrentUnavailableInteractable; bool interactableChanged = detectedInteractable != _currentInteractable; bool unavailableChanged = unavailableInteractable != _previousUnavailableInteractable; if (interactableChanged || unavailableChanged) { _currentInteractable = detectedInteractable; _previousUnavailableInteractable = unavailableInteractable; if (_currentInteractable != null) { ShowModal(_currentInteractable); } else if (unavailableInteractable != null) { ShowUnavailableMessageModal(unavailableInteractable); } else { HideModal(); } } else if (_currentInteractable != null) { UpdateModalContent(); } } private bool IsLocalPlayer() { if (playerInteraction == null) return false; var networkPlayerController = playerInteraction.GetComponent(); if (networkPlayerController != null) { return networkPlayerController.IsLocalPlayer; } return false; } private IInteractable GetDetectedInteractable() { var field = playerInteraction.GetType().GetField("_currentInteractable", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); if (field != null) { return field.GetValue(playerInteraction) as IInteractable; } return null; } private void ShowModal(IInteractable interactable) { if (interactableModal != null) { interactableModal.ShowModal(interactable); } } private void HideModal() { if (interactableModal != null) { interactableModal.HideModal(); } } private void ShowUnavailableMessageModal(IInteractable interactable) { if (interactableModal != null) { interactableModal.ShowUnavailableMessage(interactable); } } private void UpdateModalContent() { if (interactableModal != null) { interactableModal.UpdateModalContent(); } } } }