125 lines
3.1 KiB
C#
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] 기억의 조각을 모두 모았습니다.");
|
|
}
|
|
}
|