Одной из первых с такой задачкой решила бороться строптивая сторонница бескрайних опенворлод — 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