Files
WhaleAdventure_VR/Assets/My project/Memory Scripts/UI/MemoryProgressManager.cs
skrwns304@gmail.com b1e85a5b89 2026-06-19 UI, UI로직
2026-06-19 14:27:40 +09:00

125 lines
3.1 KiB
C#

using System;
using UnityEngine;
using UnityEngine.Events;
[Serializable]
public class MemoryProgressChangedEvent : UnityEvent<int, int> { }
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] 기억의 조각을 모두 모았습니다.");
}
}