using UnityEngine; using UnityEngine.UI; public class QuestManager : MonoBehaviour { private const string LevelCompletePanelKey = "LevelComplete"; public static QuestManager Instance { get; private set; } [SerializeField] private int totalNotes = 3; [SerializeField] private Text statusText; [SerializeField] private GameObject questCompletePanel; [SerializeField] private Text questCompleteText; [SerializeField] private GameObject exitDoor; [SerializeField] private GameObject exitTrigger; [SerializeField] private GameObject levelCompletePanel; [SerializeField] private Text levelCompleteText; private int notesCollected; private bool talkedToNPC; private bool questCompleted; private bool levelFinished; public int TotalNotes => totalNotes; public int NotesCollected => notesCollected; public bool TalkedToNPC => talkedToNPC; public bool IsQuestCompleted => questCompleted; public bool HasCollectedAllNotes => notesCollected >= totalNotes; public bool IsLevelFinished => levelFinished; public void Configure( Text statusLabel, GameObject completionPanel, Text completionLabel, GameObject doorObject, GameObject exitTriggerObject, GameObject levelFinishedPanel, Text levelFinishedLabel, int requiredNotes) { statusText = statusLabel; questCompletePanel = completionPanel; questCompleteText = completionLabel; exitDoor = doorObject; exitTrigger = exitTriggerObject; levelCompletePanel = levelFinishedPanel; levelCompleteText = levelFinishedLabel; totalNotes = Mathf.Max(1, requiredNotes); if (questCompletePanel != null) { questCompletePanel.SetActive(false); } if (exitTrigger != null) { exitTrigger.SetActive(false); } if (levelCompletePanel != null) { levelCompletePanel.SetActive(false); } UpdateStatus(); } private void Awake() { if (Instance != null && Instance != this) { Destroy(gameObject); return; } Instance = this; if (questCompletePanel != null) { questCompletePanel.SetActive(false); } if (exitTrigger != null) { exitTrigger.SetActive(false); } if (levelCompletePanel != null) { levelCompletePanel.SetActive(false); } UpdateStatus(); } public void NoteCollected() { notesCollected = Mathf.Min(notesCollected + 1, totalNotes); UpdateStatus(); CheckCompletion(); } public void NPCTalked() { if (talkedToNPC) { return; } talkedToNPC = true; UpdateStatus(); CheckCompletion(); } public void FinishLevel() { if (!questCompleted || levelFinished) { return; } levelFinished = true; if (levelCompletePanel != null) { levelCompletePanel.SetActive(true); } if (levelCompleteText != null) { levelCompleteText.text = "Уровень завершен!\nЛабораторная работа пройдена."; } GameUIState.SetPanelOpen(LevelCompletePanelKey, true); UpdateStatus(); } private void CheckCompletion() { if (questCompleted || notesCollected < totalNotes || !talkedToNPC) { return; } questCompleted = true; if (exitDoor != null) { exitDoor.SetActive(false); } if (exitTrigger != null) { exitTrigger.SetActive(true); } if (questCompletePanel != null) { questCompletePanel.SetActive(true); } if (questCompleteText != null) { questCompleteText.text = "Квест выполнен!\nВыход открыт."; } UpdateStatus(); } private void UpdateStatus() { if (statusText == null) { return; } statusText.text = $"Записки: {notesCollected}/{totalNotes}\n" + $"Диалог с NPC: {(talkedToNPC ? "✓" : "✗")}\n" + (levelFinished ? "Статус: уровень завершен" : questCompleted ? "Статус: пройдите к выходу" : "Статус: исследуйте уровень"); } }