Unreal Tournament 2003 AI for Level Designers
Version 2.0
Last Updated: 02/15/03
Введение
Этот документ описывает, как настраивать пути на уровне, для того, чтобы NPC (None Playable Character - неуправляемый персонаж) эффективно могли передвигаться к любой точке карты. Также, туториал описывает AI актеры и, некоторые специфические для UT2003, проблемы, связанные с построением навигационных сетей.
Основы построения путей
Для построения путей, дизайнеры уровней расставляют так называемые PathNodes (подкласс NavigationPoint) на карте, на поверхностях, по которым могут перемещаться NPC, или в вольюмах (volume), в которых NPC могут плавать. Для того чтобы узловые точки (PathNode) удачно были соединены, они должны находиться на расстоянии не более 1000 юнитов друг от друга. PlayerStarts также являются узловыми точками, и играют такую же функцию во всей навигационной сети. Вдобавок ко всему, InventorySpots автоматически устанавливаются в точке размещения каждого пикапа на уровне во время "утверждения" путей (они невидимые, но Вы можете видеть, что пути присоединены к ним). Установка двух узловых точек слишком близко друг к другу могут быть причиной неправильной обработки AI, поэтому избегайте таких ситуаций. При установке узловых точек на карте, убедитесь, что Вы покрыли весь уровень навигационной сетью. Зона считается покрытой, если NPC может без лишних затруднений переместиться от одной узловой точки к другой (т.е. не пытаясь обойти препятствия)
После непосредственной установки самих узловых точек, дизайнер уровней должен построить связи между ними, используя опцию "Build AI Paths" в Build меню (или сделав полный ребилд). После "утверждения" путей, их можно посмотреть при помощи команды "Show Paths" в меню View любого из окон 3D вида. Пути представляют собой линии, соединяющие узловые точки друг с другом. Если NPC может двигаться по пути в любом направлении, то в этом случае путь будет представлен двумя линиями со стрелками, указывающими в каждом из направлений. Иначе, линия будет отображена с одной стрелкой, показывающей возможное направление передвижения. Линии путей могут быть разных цветов, отражая, тем самым, различную информацию о данном пути:
Даже если NPC имеет небольшие размеры, старайтесь расставлять узловые точки таким образом, чтобы путь, построенный на их основе, был как можно шире. В этом случае NPC будет без проблем огибать углы и непринужденно стрейфиться назад и вперед, поэтому, чем шире путь, тем естественнее будут передвигаться NPC.
По мере установления узловых точек на карте, время, необходимое для их "утверждения" (rebuild) также будет возрастать. Для того, чтобы избежать перестройки сразу всех путей используйте кнопку "Build changed paths" в Build меню. При этом будут перестроены пути только между теми узловыми точками, которые были добавлены, передвинуты или удалены. Тем не менее, перед сохранением уровня и перед его запуском, желательно производить полный ребилд путей.
Отладка путей
Во время перестройки (rebuild) путей, может появиться окно с сообщением об ошибках в навигационной сети. Щелкните мышкой на сообщении об ошибке для того, чтобы перейти к "бракованной" узловой точке.
После того, как Вы расставили все пути, и они были "подтверждены", воспользуйтесь командой 'Review Paths' в меню инструментов. При этом будет произведена проверка по следующим параметрам:
Если бот выглядит растерянным или делает непонятные вещи, проследите за ним при помощи консольной команды ViewBot, а затем воспользуйтесь командой ShowAI, для отображения его "мыслей", а также узловой точки, к которой он пытается переместиться. Каждый раз при вводе команды ViewBot, вид будет перемещаться к другому боту на уровне. В Вашем распоряжении также команда ViewFlag, для перехода к боту, несущему флаг. Если Вы хотите запомнить определенное место в навигационной сети, то воспользуйтесь RememberSpot командой. Затем, при помощи команды ShowDebug, Вы можете отслеживать постоянно обновляющийся путь, идущий от местоположения текущего бота к отмеченному ранее месту.
В дополнение ко всему, существует еще одна очень удобная команда для отслеживания проблем с навигационной сетью: SoakBots. После ввода этой команды в консоль, в любое время, когда бот столкнется с некоторыми проблемами, игра установится на паузу и камера переместится к этому боту. При этом, также, будет отображена информация о текущем состоянии бота (включая ошибку). Не смотря на то, что при помощи всех этих команд, будет выявлено большинство проблем, обычное слежение за ботами все еще остается не менее важным аспектом при отладке путей.
PlayerStart (подкласс NavigationPoint)
Каждый PlayerStart имеет опцию TeamNumber, которая показывает, игроки какой команды могут респавниться в этой точке. У актеров TriggeredPlayerStart может быть переключено состояние переменной bEnabled по событию извне. Также, при респавне игрока в точке PlayerStart возбуждается событие (если оно было предварительно указано).
UnrealScriptedSequence (подкласс Keypoint -> AIScript -> ScriptedSequence)
UnrealScriptedSequence является подклассом ScriptedSequence, который используется для всех скриптовых поведений (обычно это применяют для указания точек защиты вокруг баз). В свойствах этого актера Вы можете найти несколько, относящихся к "защитным" функциям настроек:
По умолчанию, боты перемещаются к местоположению UnrealScriptedSequence, и будут смотреть в направлении, указанном этим актером (в соответствии со значением Rotation). В большинстве случаев, этого достаточно и никаких дополнительных изменений дефолтных свойств не потребуется (кроме указаний сценарию напрямую ассоциироваться с игровыми целями, таких как FlagBase).
Не смотря на это, у "защитных" точек могут быть определены различные виды действий для ботов, они могут быть соединены в одну цепочку, как любой другой сценарий. Обратите внимание, что время между переходами от одного типа поведения к другому может быть настроено при помощи переменной PauseTime в качестве второго действия (если используется дефолтные действия)
UnrealScriptedSequences, которые не имеют ассоциации с игровыми целями (GameObjective) являются точками "свободного" сценария. Боты с freelance приказом или во время Deathmatch игры, будет бродить между этими точками, если им больше нечем будет заняться. Это отлично работает, если на карте установлено несколько таких точек - но, учтите, что лучше вообще не иметь такие точки на карте, если их количество меньше 5.
Двери
Узловая точка Door должна быть установлена в связке с мувером, который играет роль двери (в зависимости от положения, она разрешает, либо блокирует переход между двумя зонами уровня). Точки Door должны быть установлены в центре зоны мувера (обычно, прямо в центре статического меша двери, но на достаточно низком расстоянии, чтобы касаться земли). Также, при необходимости, нужно устанавливать некоторые важные опции в свойствах Door актера:
У муверов есть одно очень полезное свойство: bAutoDoor. Если значение этой переменной установлено равным true, то для этого мувера будет автоматически сгенерирована Door точка. Это будет выполняться для большинства дверей.
CTF
При строительстве путей для CTF карт, дизайнер должен установить один xRedFlagBase актер и один xBlueFlagBase актер. Для CTF баз существует одна очень важная опция, которую всегда нужно указывать:
Double Domination
Для этого типа игры, дизайнер уровня должен установить по одному актеру xDomPointA и xDomPointB. Наподобие CTF баз, каждая точка доминации должна иметь установленные DefenseScriptTags для указания сценариев UnrealScriptedSequence, которые будут использованы при обороне этих точек.
Bombing Run
При постройке BR карт, необходимо установить в центр уровня актер xBombSpawn (в этой точке мяч будет появляться), а также два актера xBombDelivery для каждой из команд. С целью указания оборонительных точек используется все тот же список DefenseScriptTags, в котором указывается соответствующие UnrealScriptedSequence. У актера xBombDelivery есть еще несколько очень полезных свойств. Для каждой команды должно быть указано свое значение Team. Свойство TouchDownDifficulty предназначено для указания ботам, стоит ли пытаться "забить" мяч, или запрыгнуть с ним в "ворота" (чем больше значение, тем больше вероятность того, что они будут пытаться "забить" мяч).
Для указания ботам закидывать мяч в "ворота" с дальней дистанции, необходимо дополнительно установить актеров класса ShootSpot. Используйте BlueShootSpot для указания точек броска по синим "воротам" для ботов красной команды, и наоборот, RedShootSpot, для синих ботов, пытающихся забить в "ворота" красной команды. Таких точек может быть указано несколько для одних ворот.
AssaultPath (подкласс NavigationPoint)
Актеры AssaultPath используются для указания альтернативных путей при попытке группы ботов атаковать объект (например, CTF базу). Ниже приведен список наиболее важных параметров, которые необходимо устанавливать:
Во время атаки вражеской базы, группа ботов выбирает случайным образом (вообще, это зависит от приоритетов) один из AssaultPath и перемещается к этой точке, перед тем, как атаковать базу. По этой причине, AssaultPath должны быть указаны для всех возможных подступов к вражеской базе. Например, красная база имеет три входа, и для каждого их них указано по AssaultPath. Атакующая группа ботов из синей команды выберет один из возможных путей с AssaultPath (на основе их приоритетов, игнорируя, при этом, все точки с bReturnOnly равными true), затем попытается проникнуть на вражескую базу, переместившись, сначала, к выбранной AssaultPath точке, а затем и к самой базе. Как только один из ботов схватит красный флаг, он покинет вражескую базу, опять же, выбрав для этого один из возможных AssaultPath путей, ведущих к красной базе (выбор происходит на основе их приоритетов, игнорируя все точки с bNoReturn установленным в положение true). Бот с флагом перемещается к выбранной точке, затем к своей базе.
Очень важно использовать параметр bNoReturn для "отключения" неподходящих путей отступления (например, путей, при которых боту необходимо было прыгать вниз для попадания на вражескую базу, или путей, требующих использования транслокатора).
Продвинутое построение AssaultPath путей
Для большинства создателей карт нет никакой необходимости использовать более тонкую настройку AssaultPath актеров, поэтому этот раздел предназначен, прежде всего, для продвинутых пользователей. Эти параметры почти нигде не применялись на стандартных UT2003 картах, и их использование может повлечь за собой проблемы, в случае их некорректной настройки.
Для атаки группой ботов вражеской базы, сперва, происходит выбор одной из наиболее близко расположенных AssaultPath точек, на основе их приоритетов. Только путь, имеющий наименьшее значение Position среди всех путей с одинаковым PathTags, будет выбран в качестве исходного. AssaultPath также используется в качестве точки сбора команды, поэтому они не должны находиться на открытых пространствах. Как только группа ботов достигнет выбранной точки, будет произведен поиск следующей точки, из всех AssaultPath цепочек, указанных в массиве PathTag[], и имеющей большее значение Position. Если несколько точек имеют одинаковые PathTag и одинаковые значения Position, то точка будет выбрана на основе ее приоритета.
UTJumpPad
UTJumpPad - это UT2003 версия актеров JumpPad. JumpPad выталкивает любого Pawn, дотронувшегося до него, в определенном направлении. Для настройки JumpPad, необходимо указать узловую точку в качестве пункта назначения, в нулевой ячейке массива ForcedPaths[]. Необходимая скорость будет автоматически вычислена во время "утверждения" (build) путей. Используйте JumpZModifier в случае, если автоматический подсчет скорости, по каким-то причинам, не устраивает или является некорректным.
JumpSpot
JumpDest актер в новой версии UT принял вид JumpSpot. Актеры JumpDest необходимо устанавливать на замену узловым точкам, которые находятся слишком высоко, чтобы до них допрыгнуть, но, тем не менее, имеющих связь с точкой, находящейся ниже. JumpSpot будут использованы NPC при низкой гравитации на уровне, или, если они обладают ускорением (boost). На пути, следуя по которому, боту предстоит совершать прыжок к JumpSpot, должна быть установлена соответствующая точка, у которой в массиве ForcedPath[] присутствует ссылка на этот JumpSpot. Актер JumpSpot будет использован в качестве пункта назначения во время прыжка, в верхней его точке. Эта точка никогда не используется при падении после прыжка, кроме тех случаев, когда бот применяет транслокатор, чтобы избежать повреждений. Лишних JumpSpot нужно избегать, т.к. они требуют больше ресурсов при просчете навигационного AI.
JumpSpot обладает следующими свойствами:
Для просмотра и отладки установленных на уровне JumpSpot, используйте консольную команду ReviewJumpSpots. Для этого, запустите уровень, затем напишите в консоли ReviewJumpSpots, но до того момента, как нажмете кнопку стрельбы (ее вообще нажимать не нужно). После ввода команды, на уровне появится бот, который попытается достигнуть все установленные JumpSpot при помощи:
Вы можете понаблюдать за ботом и проследить все его прыжки, при этом, в лог будет записана детальная информация о каждой неудачной попытке.
Лифты
Для муверов, используемых в качестве лифтов, никогда не должно быть указано состояние BumpOpenTimed (используйте вместо этого StandOpenTimed). Для муверов-лифтов существует два типа узловых точек. Точка LiftCenter должна быть установлена в центре, на площадке лифта. Актеры LiftExit устанавливаются на каждом выходе из лифта (но на отдаленном расстоянии, так, чтобы стоящий на лифте NPC не пересекался с этой точкой). Для обоих типов узловых точек, также, должно быть в LiftTag указано имя того мувера, с которым они ассоциированы. В дополнение ко всему, если лифт активируется при помощи датчика, то в свойствах у актера LiftCenter в поле LiftTrigger нужно указать активирующий его датчик. У LiftExits, также имеется дополнительное свойство, SuggestedKeyFrame, которое указывает на номер кадра-ключа (key) лифта, при котором этот LiftExit можно использовать. Указание этого параметра в некоторых ситуациях может повысить качество навигации NPC.
Вертикальные лестницы
LadderVolumes должны быть установлены таким образом, чтобы они были направлены в сторону стены, на которую необходимо взобраться (после изменения значения свойства WallDir, при выборе актера LadderVolume будет появляться стрелка, указывающая его направление). В большинстве случаев, при построении путей можно положится на автоматическую генерацию необходимых узловых точек. Вот и в этом случае, при "утверждении" путей, будут добавлены специальные точки навигации для лестниц, соответственно, снизу и сверху LadderVolume. Тем не менее, в случае неудачной генерации узловых точек, дизайнер может вручную установить их, указав, предварительно, в свойствах LadderVolume значение false для переменной bAutoPath. Точки LadderСenter необходимо устанавливать внутри LadderVolume. LadderVolume, также, должен нижней своей частью доходить (дотрагиваться) до пола, а наверху - торчать над поверхностью, на высоту, как минимум равную высоте NPC, для которого предназначена эта лестница.
Автор
Steven Polge
Epic MegaGames, Inc.
http://www.epicgames.com
Перевод сделан 32_Pistoleta