Одной из первых с такой задачкой решила бороться строптивая сторонница бескрайних опенворлод — Bethesda. Начав с обливиона и захватив все игры компании прошлого десятилетия, система Radiant AI с её идеологическими потомками, не то чтоб решили, но отлично разбавили геймплей одноликими, но бесконечными приключениями.
Цель и логика
Пред последовательным описанием непосредственно генерации квестов,
не лишним будет обрисовать всё в общих чертах.
Главной целью системы, не смотря на бесконечность, является конечно удержание игрока в игре на подольше, однако в более благородной
форме — эксплоринг еще не увиденного.
Creation Kit Tutorial №14 — Создание квеста (часть 1)
Любые пещеры и локации, что есть например в Скайриме, имеют свой скажем так тип. Так называемый искусственный интеллект не отправит нас по заданию гильдии воров похищать золотое блюдце в шахту с бандитами, где не то что блюдца нет, нет вообще ничего, ведь подземелье зачищено, а системе никто не давал отмашку генерировать в неё новых плохишей, бандитов по заданию ярла или вампиров от Стражей Рассвета например.
В этом и главный обман — система не ищет вам новые цели, она их создает.
И делает это с важнейшей для неё условностью — нужного типа локация в идеале должна быть еще не исследована, в другом случае — на пути к ней должно быть поболее неисследованных локаций.
Пошаговая бесконечность
Бесконечный квест можно получить как правило у представителей фракций, трактирщика, ярла или горожанина, поговорив с ними.
Еще есть способ триггернуть систему сделав плохое дело — обокрасть рядового NPC и попасться, убить его или просто стукнуть, но это я лучше расскажу в другой статье.
Система существует не абстрактно как одно из девяти божеств вселенной, а, вероятнее всего, привязано к каждому из радиант-квест-гиверов, ибо закончить его всё же можно — консольной командой.
Каждый из типов радиант квестов отличается — кого-то убить, зачистить подземелье, украсть, добыть, запугнуть, изучить, но самая по-моему мнению интересная и структурно насыщенная цепочка генерации у темного братства, потому на его примере и разберем.
Итак, после разговора с Матью Ночи, системка триггерится и избирает первую цель — заказчика, если быть точнее то его социальное положение скажем так, возможные вариации с елдерскроллс вики прилагаю :
В зависимости от выбранного системой заказчика, располагаться он будет в разных местах, жрец например в одном из храмов, слуга в доме ярла, а нервный посетитель в одной из таверн, что находятся не только в городах.
Вспоминая выше написанное, каждое из возможных мест выбирается сначала из еще неисследованных, потом из тех, что на своем пути имеют побольше других неисследованных локаций и потом наверно рандом.
Creation Kit Tutorial — №5 — Создание квестов — Часть 1
Кстати неисследованные локации точно находятся в специальном списке ибо на нем висит так же работа с картой и возможностью фаст-тревела.
Заказчик генерируется и это совсем не является проблемой, ведь игра уже содержит в себе генератор персонажей, но есть ограничения.
Например роль продажного агента со скриншота выше, логичнее всего займет персонаж расы Имперец, пол и внешность могут генерироваться на усмотрение системы, однако не исключаю наличие пресетов.
Сам диалог не то что генерируется, но состоит из нескольких частей — двух частей : приветствие, цель, окончание фразы и местоположение цели, воткнутое посреди. Кстати не будь его, всего возможных вариаций фраз было бы всего 110, по 10 возможных жертв у каждого из 11 заказчиков.
С генерацией жертвы всё вообщем-то так же : выбор локации согласно её соц. положению с неизменной приоритетностью неисследованных локаций, генерация визуального образа с учетом ограничений иии.
Всё. Генерируется всё вышеописанное конечно сразу, но в своих объяснениях я старался быть последовательным как и квест.
В догонку расскажу об отслеживании выполнения квестов :
- в случае с убийством кого-либо как в Тёмном Братстве, система может отслеживать очки здоровья жертвы и, в случае если они равны нулю, переводить квест в следующую стадию — снова прийти к Маме Ночи.
Именно стадия, ведь как я уже писал, квест можно закончить консольной командой, а значит он по сути действительно бесконечен, просто генерируются новые его этапы. - в случае с воровством, система может отслеживать наличие предмета (который она сама и сгенерирует) с нужным id в инвентаре игрока и по сдаче квеста делать это еще раз.
- в случае если надо наоборот, подкинуть что-либо кому-либо, система может отслеживать наличие предмета в их инвентаре, ведь по сути инвентарь — всего лишь скрипт, имеющий возможность висеть хоть на бочке, хоть на неписе, хоть на мешке.
Вот так, тратя кучу ресурсов, Тодд Говард сделал свои игры по-настоящему бесконечными, доказав свое неоспоримое величие в RPG мире, пока какие-то там поляки тратят еще больше ресурсов на создание какой-то там смешной сотни побочных квестов в Ведьмаке 3, хах.
Источник: dzen.ru
Генерируемые квесты (Скайрим)
- редактировано: 11г. назад
- +-
История изменений
+-
Новая особенность, представленная в Скайриме – это система Генерируемых квестов, введенная для создания динамического игрового контента.
Квесты
Система Генерируемых квестов – это генератор квестов, создающих их из серии компонентов, таких как стартовая локация, расположение врагов и награда. Некоторые, но не все, из них случайны. Случайные компоненты генерируются каждый раз при начале квеста. Генерируемые квесты используются на протяжении всей игры: В основном квесте, различных квестовых линиях, а также разовых квестов.
Хотя система квестов не может создать большие. Сложные и интересные квесты, она, тем не менее, может создать практически бесконечное количество квестов, экономя время и силы, необходимые для создания традиционных квестов, в результате чего каждое последующее прохождение будет слегка отличаться от предыдущего.
NPC и существа
Характеристики многих NPC и существ сгенерированы случайно. И хотя предыдущие игры серии использовали листы левеллинга для создания обычных врагов, в Скайриме это стало распространяться на именных и уникальных персонажей.
Например, Моварт Пикуин – босс-вампир квеста «Упокоить». Хотя он всегда будет вампиром, его раса случайно определяется из списка левеллинга для боссов-вампиров. В некоторых случаях случайно может быть сгенерирован даже пол персонажа.
Источник: tespedia.ru
Как создать игру, ничего не умея. Часть вторая: сцена (уровень), квесты, интерактивные объекты
Привет^ народец, сегодня я продолжу свою попытку создать игру^ используя только информацию из интернета.
Первая часть вот тут — ТЫК.
В этой статье я попробую создать игровую комнату, она же сцена, уровень, локация и так далее, а так же попробуем прописать НПЦ (внутриигровых персонажей) с квестами, и взаимодействие с предметами. Ну что, начнём словоблудие!
Сцена
Для начала откроем наш проект над которым мы работали в прошлой статье, и переименуем нашего персонажа в Player.
Далее^ используя наши познания из прошлого урока^ создаём папку Prefabs, для тех^ кто забыл как это делается, нажимаем на Assets в древе, далее правой кнопкой в папке assets, Create -> Folder.
Далее перетягиваем нашего персонажа Player в папочку Prefabs, что даёт нам возможность его сохранить со всеми настройками и скриптами^ которые мы использовали в прошлой статье. Если выползет диалоговое окно, выбираем Original Prefab, а после в папочке Scene аналогичным способом создаем новую сцену под именем Scene_01 (и снова для самых-самых, правой кнопкой тык, и выбираем Create -> Scene). Это и будет наша рабочая сцена на эту статью, дважды тык на Scene_01 и у нас снова пустая рабочая область.
Смотрим в экран и вот тут начинается главная головная боль, необходимо придумать, как будет выглядеть наш первый уровень, который необходимо построить, а главное продумать его так, чтобы он полностью удовлетворял наши потребности. Обычно для таких целей я беру пачку листов А4 и карандаш, а после несколько дней рисую разные варианты уровня, если что-то мне не нравится после рисовки, я всё равно это оставляю на будущее, поскольку в итоге из всех рисунков и собирается один более-менее играбельный уровень для игры. Но мы сейчас всё делаем по велению интернета, поэтому возьмём за идею стандартную ситуацию.
- Построим закрытые ворота, перед которыми будут стоять стражники, а за воротами будет город, в который нам необходимо попасть.
- Стражники нас не пропустят, пока мы не выполним квест.
- Ворота откроются после выполнения квеста.
Вот такой вот незамысловатый сюжет будет в нашей сцене =)
Строительство
Для начала нам нужна земля, заходим в GameObjects -> 3D Object -> Terrain, это создало нам землю, но она довольно большая для моей сцены, поэтому заходим в Inspector, нажимаем на шестеренку (Terrain Setting) и ищем Mesh Resolution (On Terrain Data) для меня подошли показатели:
- Terrain Width: 70
- Terrain Length: 70
- Terrain Height: 120
Тут я наверное немного поясню ситуацию. Данный Terrain я использовать не буду, у меня есть все готовые префабы для создания играбельной сцены, но для людей, которые собираются САМИ создать свою землю и объекты, прийдётся использовать данную функцию. В ней есть всё необходимое, чтобы сделать из этого квадрата равнины, горы, леса, пустыню. Необходимо просто использовать нужную Вам кисть, и натянуть текстуру. Я же в буду использовать префабы, которые шли в комплекте с персонажем, а Terrain послужит мне границами уровня. (Для тех кто всё же хочет, чтобы я создал игровую область без префабов, пишите в комментариях, тогда будет понятно, нужна ли такая информация).
Используя префабы, я начинаю строительство, выбираю для начала зелень и растягиваю её почти на весь Terrain, далее выбираю ворота, стены, горы, деревья, дорогу, и просто перетаскиваю их в сцену, немного позиционирую, а далее делаю копи-паст и собираю простейший уровень, получилось примерно так.
Все префабы ландшафта я поместил в Terrain, чтобы они не загромождали древо сцены. За 5 минут получилось невесть, что, но если провести за этим делом пару дней, то можно собрать что-то подобное.
Давайте посмотрим как поведёт наш персонаж себя в новом месте проживания. Заходим в папку Prefabs и переносим наш префаб Player в сцену, у меня он появился где-то сбоку, но я простым движением переместил его в начало каменной дороги. После удаляю из сцены Main Camera, потому как к нашему персонажу уже прикреплена камера, и дабы не было конфликтов избавляемся от камеры в сцене.
Жму кнопку Play и осматриваю новые земли. Персонаж отлично себя чувствует в новом месте. Исходя из этого мы можем перейти наконец к НПЦ и квестам.
![]() |
![]() |
NPC или неигровые персонажи
В качестве НПЦ мы будем использовать такие же префабы рыцарей, что и наш персонаж. Давайте поставим их перед воротами.
И вот двое из ларца одинаковых с лица стоят и охраняют наши ворота. Им я сразу дал имена NPC_01 и NPC_02, давайте подойдём и посмотрим как это выглядит в игре.
Да уж, в игре это выглядит так же ужасно, как и в сцене =) Оживим наших горе-охранников, чтобы они не стояли как пугало в поле. Для этого вернёмся к нашей первой статье, где мы оживляли нашего персонажа, и проделываем туже процедуру с болванчиками у ворот. Для тех, кто не помнит, направляемся в mixamo, находим подходящие нам анимации, добавляем их в проект, создаём аниматор контроллер и прикрепляем его к болванчикам.
Я прикрепил анимацию засыпающего человека к одному болванчику, и строго стоящего второму, это мне нужно для более полного погружения для квеста. Я понимаю, что это совсем необязательно, ведь мы не пытаемся создать ААА проект прямо на коленке как Юбисофт (это лично моё мнение), но всё же и создавать Г* мне не хочется, хоть это и попытка сделать всё при помощи интернета. Наконец пришло время для квеста!
Квест
Тут мне пришлось немного использовать крота, дабы прорыть интернет для правильного скрипта и построения квеста. Его выполнение, тоже должно было работать правильно и не вызывать ошибок, и я снова на коне! Давайте приступим.
Для начала создадим папку с названием Quest, а в ней соответственно создадим три скрипта с названиями: Sword, Quest, NPC (названия произвольны, Вы можете их назвать как Вам будет удобнее, но не забывайте тогда исправить class и обращения к скриптам). Первым же будет скрипт Quest:
Скрипт Quest
using UnityEngine;
using System.Collections;
public class Quest: MonoBehaviour
public bool quest; // отображает название квеста на экране;
public string MissionText; // название квеста;
public string ObjectTag; // тэг объекта;
public bool MissionObjects; //отображает собран предмет или нет;
public int Money; // количество денег;
if (quest)
GUI.Label(new Rect(20, 80, 300, 30), » » + MissionText); // значение названия квеста будет браться из скрипта NPC;
if (MissionObjects)
< // если предмет собран;
GUI.Label(new Rect(150, 80, 200, 30), «[Выполнено]»); // выводит надпись;
>
>
>
>
Его мы добавляем к нашему персонажу, и изменяем его ТЕГ на Player, тег Вы можете поставить в inspector нашего Player
Далее создаём скрипт NPC
Скрипт NPC
using UnityEngine;
using System.Collections;
GameObject MissionTagScanner = GameObject.FindGameObjectWithTag(«Player»); // персонаж у которого берем квест будет взаимодейстWowать только с тем объектом у которого тэг Player;
if (Input.GetKeyDown(KeyCode.E) 2) // При нажатии на клавишу Е и при дистанции между персонажами меньше чем 2;
vis = true; // переменная vis принимает значение true;
>
>
void OnGUI()
if (vis) // если переменная равна true;
if (!quest) // и если квест еще не взят;
GUI.Box(new Rect((Screen.width — 300) / 2, (Screen.height — 300) / 2, 300, 300), «Квест»); // то на экране отображается окно с названием Квест;
GUI.Label(new Rect((Screen.width — 300) / 2 + 5, (Screen.height — 300) / 2 + 15, 290, 250), «Куда ломишься, не видишь закрыто, вали отсюда пока не получил по щам.Еще и этот бездельник меч свой потерял вчера, всю ночь искал так и не нашел, теперь вот спит на посту.Сделаем так, принесешь мне потерянный меч моего напарника и я тебя пропущу, берешься? „); // и текстом который описывает квест;
if (GUI.Button(new Rect((Screen.width — 100) / 2, (Screen.height — 300) / 2 + 250, 100, 40), “Ок»)) // при нажатии на кнопку Ok;
quest = true; // квест взят;
MP.quest = true; // отображает название квеста на экране;
MP.MissionText = «Принести меч»; // текст квеста;
MP.ObjectTag = missionTag; // тэг объекта который необходимо принести;
vis = false; // все диалоговые окна закрываются;
>
>
else
< // если же квест уже взят;
GUI.Box(new Rect((Screen.width — 300) / 2, (Screen.height — 300) / 2, 300, 300), «Квест»);
GUI.Label(new Rect((Screen.width — 300) / 2 + 5, (Screen.height — 300) / 2 + 15, 290, 250), «Принес?»); //то описание квеста меняется на другой текст;
if (MP.MissionObjects) // если вы уже подобрали объект;
if (GUI.Button(new Rect((Screen.width — 100) / 2, (Screen.height — 300) / 2 + 250, 100, 40), «Да»)) // то появится кнопка да, при нажатии на которую;
quest = false; // переменная квест принимает значение false, т.е. не взят ;
MP.quest = false; // название квеста не будет отображаться на экране ;
MP.MissionText = «»; // убирается название квеста;
MP.ObjectTag = «»; // обнуляется тэг объекта;
MP.MissionObjects = false; // объект считается не подобранным;
vis = false; // диалоговое окно закрывается;
>
>
else
< // если вы еще не подобрали объект;
if (GUI.Button(new Rect((Screen.width — 100) / 2, (Screen.height — 300) / 2 + 250, 100, 40), «Нет»)) // то вместо кнопки да, будет кнопка нет;
vis = false; // при нажатии на которую, окно просто закроется;
>
>
>
>
>
>
Этот скрипт мы добавляем к NPC_01, так как я решил, что именно он будет давать нам квест!
Ну и, соответственно, нам необходим предмет, который мы будем искать по квесту. У меня это меч, который я также взял из папки префаб и аккуратно поместил его возле повозки.
Создаём скрипт Sword:
Скрипт Sword
using UnityEngine;
using System.Collections;
Добавляем скрипт к нашему мечу, и теперь необходимо создать для него тег Sword. В Inspector нажимаем на Tag выбираем Add Tag, жмём на плюсик и прописываем название Sword. Готово, тег Sword готов. Возвращаемся к NPC_01, смотрим Inspector, видим наш NPC(Script) и в строке Mission Tag прописываем sword. Если всё сделано правильно, то у нас появился наш первый квест!
Давайте проверим как он работает.Запускаю игру, подхожу к НПЦ и нажимаю клавишу Е (именно она прописана в скрипте как клавиша вызова диалога).
НПЦ дал наш первый квест! Нажимаю ОК и отправляюсь на поиски меча. Как видим, у нас появилась надпись, оповещающая нас, какой именно квест мы сейчас проходим в левой части экрана.
Подойдя к мечу, нажимаю на него, и он пропадает, что говорит о правильной работе скрипта! И также появляется надпись, что мы выполнили квест, а значит нужно возвращаться и отдать меч стражнику.
Вернувшись к стражнику, он задаёт вопрос, я на него отвечаю, и вижу что квест выполнен, YoHOO!
Наш первый выполненный квест в этом мире, теперь мы настоящий герой! Но остался другой вопрос, ведь квест мы выполнили, а охранник обещал нас пропустить. Теперь необходимо сделать анимацию открывающейся решетки, чтобы она открывалась, как только мы выполняем квест.
Для этого выбираем нашу решетку и заходим во вкладку Animation (если у Вас её нет, то зайдите в Window -> Animation -> Animation и у Вас появится эта вкладка либо нажмите Ctrl+6). Решетку я назвал Door_01 и теперь во вкладке Animation давайте сделаем анимацию поднятия решетки. Нажимаем Create и я ставлю название DoorOpen. Далее я выбираю кадр 0:55 нажимаю на красную кнопку, а после поднимаю решетку, снова нажимаю на красную кнопку, и вот у нас есть ключи анимации как поднимается решетка.
Создаю еще одну анимацию, но на этот раз решетка находится внизу, и сохраняю её как DoorClose. После захожу в Animator, и подключаю анимацию, как мы это делали уже множество раз. Проверяю и вижу, что анимация работает, решетка непрерывно открывается =).
Ну что же, вперед к финишной прямой сегодняшней статьи =). Первым делом создаю очередной скрипт OpenDoor.
Скрипт OpenDoor
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
Это единственный скрипт, что я нашел в интернете, который мне подошел. Я конечно его немного подправил под мои нужны в виде MP.Money. А для того, чтобы эта строчка работала, необходимо подключить скрипт Quest, что мы и сделали в самом начале. В скриптах, что я нашел ранее, есть параметр, который даёт вознаграждение в виде денег за выполнение квеста, поэтому мы добавим одну строчку, которая нам даст 100 монет, на которые и будет отвечать скрипт открывающий решетку.
Добавляем строчку в скрипт NPC
if (GUI.Button(new Rect((Screen.width — 100) / 2, (Screen.height — 300) / 2 + 250, 100, 40), «Да»)) // то появится кнопка да, при нажатии на которую;
quest = false; // переменная квест принимает значение false, т.е. не взят ;
MP.quest = false; // название квеста не будет отображаться на экране ;
MP.MissionText = «»; // убирается название квеста;
MP.ObjectTag = «»; // обнуляется тэг объекта;
MP.MissionObjects = false; // объект считается не подобранным;
MP.Money = MP.Money + 100;
vis = false; // диалоговое окно закрывается;
После всех манипуляций, добавляем наш скрипт OpenDoor на объект решетки, и вперед тестить!
После того как я сдал квест и получил свои 100 монет, решетка открылась =). На этом я думаю на сегодня хватит, продолжение будет скоро!
Заключение
Очередной этап создания игры закончен, абсолютно всё, что я тут проделал было взято из уроков или статей интернета.
Я конечно многое бы сделал по другому, но эксперимент есть эксперимент, и с каждой статьёй мне кажется игру я всё же закончу. Всегда рад Вашим комментариям, увидимся в следующей статье!
ПС
Большинство роликов на ютубе были абсолютно бесполезны! Зря потраченное время =).
Источник: www.ixbt.com