Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Как лучше мне сделать квестовую систему?

Вова Денисов Ученик (202), на голосовании 3 месяца назад
Я опишу проблему в целом, потому что то, что я написал в своём коде навряд ли кто то поймёт и вообще захочет на этот ужас смотреть. У меня есть два NPC и у обоих есть по 1 квесту и по 3 текста. Первый текст - это как бы подводящий к самому заданию, второй текст - это выражение благодарности игроку, за выполненное поручение и третий текст - это уже не имеющие смысла предложения по типу "ПРИВЕТ, ХОРОШАЯ СЕГОДНЯ ПОГОДКА", потому что дальше квестов нет. Проблема заключается в том, что у меня условия для переходов этих текстов одинаковые для всех NPC, потому что я хотел добиться максимально универсального и эффективного способа решения этой задачи. И из за этого у меня при выполнении любого одного квеста из персонажей, при подходе к другому NPC выводится сразу третий текст, как будто я уже выполнил и это задание тоже. Условия прикреплю и объясню. Вообщем для запуска первого текста нужно, чтобы квест был ещё не выполнен, для второго текста я создал перечисление для отслеживания на каком этапе я нахожусь, и вообщем условие такое: " квест должен быть выполнен и переменная типа QuestGo, должна быть равной quest1 ", после выполнения этого условия, значение переменной меняется на quest2. Ну и третье условие вы сами на фотке увидите. Короче я пытался по нормальному решить, но так как код у меня изначально не то, чтобы хороший, но и не супер пупер, нормально я решить этого не могу. Мне хочется услышать мнение насчёт этой задачки, потому что моё решение мне кажется убогим, типо я просто создам для каждого персонажа отдельную глобальную булевую переменную и с помощью неё буду решать этот вопросик, так как я уже вынес в отдельный метод квест каждого персонажа, я могу это провернуть, но изначально я хотел сделать эти булевые переменные локальными, но они своё значение сохранять не могут нормально, поэтому только с глобальными может получиться. Я не хотел бы засорять свой код, излишком глобальных переменных и хотел бы услышать чужое мнение, мало ли кто то додумается, а то у меня немного башка кипит от этого. Я просто не вижу других способов, ибо всё стирать и писать весь код заново мне точно не хочется, ибо он рабочий и мне лень, и мне не хочется засорять код глобальными переменными
Голосование за лучший ответ
AlexandrBuybuz Гуру (4780) 4 месяца назад
не знаю я программирую на ассемблере
Максим Искусственный Интеллект (213233) 4 месяца назад
Я всё читать не стал, но если у тебя действие одного НПС влияет на действия другого НПС, значит ты хранишь свои данные не у этого НПС, а где-то глобально. У каждого НПС должны быть свои данные о том, выполнен квест или нет. А ещё учись пользоваться else if.
А вообще, тебе надо больше изучать и применять ООП, а также лучше продумать архитектуру квестовой механики.
666 Профи (620) 4 месяца назад
Понимаю твою проблему! Да, использовать глобальные переменные для отслеживания состояния квеста для каждого 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.
Дополнительные советы:
Использование событий: Используй события для более гибкого управления квестами.
Сохранение прогресса: Сохраняй прогресс квестов, чтобы игрок мог продолжить игру после выхода.
Тестирование: Тщательно тестируй свою систему квестов, чтобы убедиться, что все работает правильно.
Надеюсь, эти идеи помогут тебе улучшить квестовую систему!
Похожие вопросы