using System; using UnityEngine; using UnityEngine.Events; [Serializable] public class MemoryProgressChangedEvent : UnityEvent { } public class MemoryProgressManager : MonoBehaviour { [Header("References")] [Tooltip("진행도 UI가 여러 곳에 있으면 모두 넣으세요. 예: HUD용, 방 선택용")] [SerializeField] private MemoryProgressUI[] memoryProgressUIs; [Header("Progress")] [SerializeField] private int requiredPieces = 5; [SerializeField] private int currentPieces = 0; [Header("Events")] public MemoryProgressChangedEvent onProgressChanged; public UnityEvent onAllPiecesCollected; [Header("Debug")] [SerializeField] private bool showDebugLog = true; private bool completionEventInvoked; public int CurrentPieces => currentPieces; public int RequiredPieces => requiredPieces; public bool IsCompleted => currentPieces >= requiredPieces; private void Start() { requiredPieces = Mathf.Max(1, requiredPieces); currentPieces = Mathf.Clamp(currentPieces, 0, requiredPieces); RefreshUI(); } public void AddMemoryPiece() { AddMemoryPiece(1); } public void AddMemoryPiece(int amount) { if (amount <= 0) return; if (IsCompleted) { if (showDebugLog) Debug.Log("[MemoryProgressManager] 이미 모든 기억의 조각을 모았습니다."); return; } currentPieces += amount; currentPieces = Mathf.Clamp(currentPieces, 0, requiredPieces); RefreshAndNotify(); CheckCompletion(); } public void SetMemoryPieces(int value) { currentPieces = Mathf.Clamp(value, 0, requiredPieces); if (!IsCompleted) completionEventInvoked = false; RefreshAndNotify(); CheckCompletion(); } public void ResetProgress() { currentPieces = 0; completionEventInvoked = false; RefreshAndNotify(); } public void RegisterUI(MemoryProgressUI ui) { if (ui == null) return; ui.SetProgress(currentPieces, requiredPieces); } private void RefreshAndNotify() { RefreshUI(); onProgressChanged?.Invoke(currentPieces, requiredPieces); if (showDebugLog) Debug.Log($"[MemoryProgressManager] 기억의 조각 {currentPieces}/{requiredPieces}"); } private void RefreshUI() { if (memoryProgressUIs == null) return; for (int i = 0; i < memoryProgressUIs.Length; i++) { if (memoryProgressUIs[i] != null) memoryProgressUIs[i].SetProgress(currentPieces, requiredPieces); } } private void CheckCompletion() { if (!IsCompleted) return; if (completionEventInvoked) return; completionEventInvoked = true; onAllPiecesCollected?.Invoke(); if (showDebugLog) Debug.Log("[MemoryProgressManager] 기억의 조각을 모두 모았습니다."); } }