Привет, Хабр 👋 Меня зовут Игорь, и я Unity Developer. В этой статье хотел бы рассказать, как можно сделать миссии в игре на Unity. Статья будет состоять из трех частей. В первой части напишем систему для миссий, во второй — интерфейс, а в третьей — сохранение. Ну что ж, поехали! Давайте предположим, что мы делаем игру, в которой игроку нужно выполнять различные задания и, когда они завершаются, получать награду в виде монет.  В данном примере механика миссий будет работать следующим образом: Миссии бывают трех уровней сложности: ЛЕГКАЯ, СРЕДНЯЯ, СЛОЖНАЯ Для каждого уровня сложности случайно генерируется по одной миссии Когда миссия выполнена, то игрок может забрать награду в качестве монет После получения награды, генерируется новая миссия того же уровня сложности В первую очередь начнем с разработки самих миссий, а затем уже будем реализовывать систему, которая будет ими управлять. Итак, согласно техническому заданию, структура миссии состоит из следующих элементов: название описание сложность состояние прогресса награда иконка Чтобы в Unity проекте можно было хранить и изменять настройки миссий, сделаем базовый класс MissionConfig, в котором будут храниться общие настройки для каждой миссии Также сделаем enum, в котором будет перечисление уровней сложности: Назревает вопрос, а где будем хранить информацию о том "сколько ресурсов нужно собрать" или "какое кол-во врагов нужно уничтожить"? Ответ для каждого типа задания сделаем класс-наследник, который и будет хранить дополнительную информацию о конкретном задании: Отлично, давайте теперь создадим, эти конфиги в Unity проекте: Супер! Конфигурация готова, теперь время разработать логику самих заданий. Очевидно, что логика миссий будет отличаться в зависимости от конкретного задания. Поэтому разумнее будет сделать базовый класс Mission, который будет хранить в себе общую логику, а классы наследники будут реализовывать выполнение условия под каждую миссию:  Абстрактный класс миссии можно написать так: Тогда миссия "Добыть ресурсы" будет выглядеть так: А миссия уничтожения противника — вот так: Для простоты примера я сделал вспомогательный класс Player. Этот класс является тестовой-заглушкой, который можно триггерить на события сбора ресурсов и уничтожения противников: Теперь напишем скрипт, с помощью которого проверим работоспособность системы: Подключим скрипты Player & MissionTest на сцену и проверим выполнение заданий: Отлично, все работает! Можно переходить к разработке системы :) Итак, давайте теперь поговорим о том, как можно сделать систему управления миссиями. Но перед этим вспомним, что нужно сделать по техническому заданию: Для каждого уровня сложности генерируется случайно по одной миссии Когда миссия выполнена, игрок может забрать награду в качестве монет После получения награды, генерируется новая миссия того же уровня сложности В результате менеджер миссий будет иметь следующую бизнес-логику: Ремарка: В будущем менеджер миссий можно будет разделить на несколько классов, поскольку сейчас он решает несколько задач и нарушает принцип единственной ответственности. Итак, напишем код для менеджера миссий: Для того, чтобы написать менеджер, мне пришлось добавить еще один класс MissionCatalog, который будет хранить список всех конфигов миссий. Когда менеджеру нужно будет сгенерировать следующую миссию, то он будет брать случайную миссию из каталога: Также пришлось немного подкрутить класс MissionConfig так, чтобы он занимался созданием экземпляра миссий через полиморфизм: Итак, мы почти готовы к проверки работоспособности нашего MissionsManager. Осталось только поправить тестовый скрипт MissionTest: Перетаскиваем скрипт MissionManager на сцену, подкючаем каталог и запускаем Play Mode в Unity: Как видно по логам, усе работает :) Вот так можно легко и быстро написать систему для миссий. В дополнение прикрепляю ссылку на полученное решение, если вам интересно пощупать самому. А так у меня все. В следующей части поговорим об интерфейсе для миссий. Спасибо за внимание :) Напоследок хочу пригласить вас на бесплатный урок, где поговорим о профессии Unity-разработчика и о том, чем он занимается. Расскажем какие проекты на Unity бывают и что лучше выбрать в качестве собственной первой игры. Рассмотрим текущий рынок вакансий в геймдеве и обсудим почему он постоянно увеличивается, а количество выпускаемых игр растёт. Дополнительно поговорим о ChatGPT и сможет ли он заменить разработчика игр на Unity.  Зарегистрироваться на бесплатный урок  Senior Game Developer