Понимаю твою проблему! Да, использовать глобальные переменные для отслеживания состояния квеста для каждого NPC - не самый элегантный вариант.
Вот несколько идей, как можно улучшить систему квестов, не прибегая к глобальным переменным:
Использование компонентов:
Создай компонент: Создай новый компонент C# (например, QuestManager), который будет хранить информацию о квестах.
Переменные: В этом компоненте создай переменные для отслеживания состояния квеста для каждого NPC (например, QuestState типа enum или int).
Методы: Добавь методы для изменения состояния квеста (например, StartQuest, CompleteQuest).
Привязка к NPC: Прикрепи этот компонент к каждому NPC.
Использование событий:
События: Создай события для запуска диалогов, например, OnQuestStart, OnQuestComplete.
Подписка: Подпишись на эти события в скриптах NPC.
Обработка: В обработчиках событий меняй состояние квеста и запускай нужный текст.
Использование менеджера диалогов:
Менеджер диалогов: Создай отдельный скрипт для управления диалогами (например, DialogueManager).
Переменные: В этом скрипте храни информацию о доступных диалогах для каждого NPC.
Методы: Добавь методы для запуска диалога, выбора текста и обновления состояния квеста.
Пример с компонентом QuestManager:
using UnityEngine;
public class QuestManager : MonoBehaviour
{
public enum QuestState
{
NotStarted,
InProgress,
Completed
}
public QuestState[] questStates; // Массив для хранения состояния квеста для каждого NPC
public void StartQuest(int npcIndex)
{
questStates[npcIndex] = QuestState.InProgress;
// ... (запускаем квест)
}
public void CompleteQuest(int npcIndex)
{
questStates[npcIndex] = QuestState.Completed;
// ... (выполняем действия после завершения квеста)
}
}
Пример использования в скрипте NPC:
using UnityEngine;
public class NPC : MonoBehaviour
{
public QuestManager questManager; // Ссылка на компонент QuestManager
public void Start()
{
// Получаем ссылку на QuestManager
questManager = FindObjectOfType();
}
public void Interact()
{
int npcIndex = // Получаем индекс NPC в массиве questStates
// Проверяем состояние квеста
if (questManager.questStates[npcIndex] == QuestManager.QuestState.NotStarted)
{
// Запускаем первый текст
}
else if (questManager.questStates[npcIndex] == QuestManager.QuestState.InProgress)
{
// Запускаем второй текст
}
else if (questManager.questStates[npcIndex] == QuestManager.QuestState.Completed)
{
// Запускаем третий текст
}
}
}
Преимущества этих подходов:
Организация: Код становится более структурированным и читаемым.
Переиспользование: Компоненты и менеджеры можно использовать для разных NPC и квестов.
Гибкость: Легко добавлять новые квесты и NPC.
Дополнительные советы:
Использование событий: Используй события для более гибкого управления квестами.
Сохранение прогресса: Сохраняй прогресс квестов, чтобы игрок мог продолжить игру после выхода.
Тестирование: Тщательно тестируй свою систему квестов, чтобы убедиться, что все работает правильно.
Надеюсь, эти идеи помогут тебе улучшить квестовую систему!