Главная » Статьи » > Unreal Editor 2.0

Unreal Tournament 2003 AI for Level Designers
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 больших размеров (максимальный collision radius: 120 юнитов)
  • Зеленая - широкий путь, который позволяет передвигаться NPC умеренных размеров (максимальный collision radius: 72 юнита)
  • Синяя - узкие тропинки, подходящие только для небольших NPC
  • Фиолетовая - путь с использованием лифта или телепортера
  • Светло фиолетовая - путь с использованием вертикальной лестницы
  • Желтая - принудительный путь. Путь между двумя узловыми точками может быть насильно установлен, в случае, если между ними автоматически не было создано никакой связи. Для этого укажите у исходной узловой точки в массиве ForcedPaths[] (в свойствах NavigationPoint) имя той точки, к которой нужно проложить путь.
  • Красная - запретный путь. Путь между двумя узловыми точками может быть запрещен. Для этого, у исходной точки в массиве ProscribedPaths[] (в свойствах NavigationPoint) укажите имя точки, на путь, к которой нужно наложить табу

Даже если NPC имеет небольшие размеры, старайтесь расставлять узловые точки таким образом, чтобы путь, построенный на их основе, был как можно шире. В этом случае NPC будет без проблем огибать углы и непринужденно стрейфиться назад и вперед, поэтому, чем шире путь, тем естественнее будут передвигаться NPC.

По мере установления узловых точек на карте, время, необходимое для их "утверждения" (rebuild) также будет возрастать. Для того, чтобы избежать перестройки сразу всех путей используйте кнопку "Build changed paths" в Build меню. При этом будут перестроены пути только между теми узловыми точками, которые были добавлены, передвинуты или удалены. Тем не менее, перед сохранением уровня и перед его запуском, желательно производить полный ребилд путей.

Отладка путей

Во время перестройки (rebuild) путей, может появиться окно с сообщением об ошибках в навигационной сети. Щелкните мышкой на сообщении об ошибке для того, чтобы перейти к "бракованной" узловой точке.

После того, как Вы расставили все пути, и они были "подтверждены", воспользуйтесь командой 'Review Paths' в меню инструментов. При этом будет произведена проверка по следующим параметрам:

  • все узловые точки с bMustBeReachable равным true (например, FlagBase) находятся в пределах досягаемости из любой точки навигационной сети
  • все муверы имеют соответствующие узловые точки (кроме тех случаев, когда переменная bNoAIRelevance для мувера установлена равной true)
  • проверяет, нужно ли преобразовывать узловую точку в JumpDest
  • ни одно значение переменной ExtraCost у узловой точки не должно быть меньше нуля

Если бот выглядит растерянным или делает непонятные вещи, проследите за ним при помощи консольной команды ViewBot, а затем воспользуйтесь командой ShowAI, для отображения его "мыслей", а также узловой точки, к которой он пытается переместиться. Каждый раз при вводе команды ViewBot, вид будет перемещаться к другому боту на уровне. В Вашем распоряжении также команда ViewFlag, для перехода к боту, несущему флаг. Если Вы хотите запомнить определенное место в навигационной сети, то воспользуйтесь RememberSpot командой. Затем, при помощи команды ShowDebug, Вы можете отслеживать постоянно обновляющийся путь, идущий от местоположения текущего бота к отмеченному ранее месту.

В дополнение ко всему, существует еще одна очень удобная команда для отслеживания проблем с навигационной сетью: SoakBots. После ввода этой команды в консоль, в любое время, когда бот столкнется с некоторыми проблемами, игра установится на паузу и камера переместится к этому боту. При этом, также, будет отображена информация о текущем состоянии бота (включая ошибку). Не смотря на то, что при помощи всех этих команд, будет выявлено большинство проблем, обычное слежение за ботами все еще остается не менее важным аспектом при отладке путей.

PlayerStart (подкласс NavigationPoint)

Каждый PlayerStart имеет опцию TeamNumber, которая показывает, игроки какой команды могут респавниться в этой точке. У актеров TriggeredPlayerStart может быть переключено состояние переменной bEnabled по событию извне. Также, при респавне игрока в точке PlayerStart возбуждается событие (если оно было предварительно указано).

UnrealScriptedSequence (подкласс Keypoint -> AIScript -> ScriptedSequence)

UnrealScriptedSequence является подклассом ScriptedSequence, который используется для всех скриптовых поведений (обычно это применяют для указания точек защиты вокруг баз). В свойствах этого актера Вы можете найти несколько, относящихся к "защитным" функциям настроек:

  • bDontChangeScripts: бот вернется к выполнению текущего защитного сценария после того, как он был потревожен, вместо того, что бы перейти к другим возможным сценариям
  • Priority: используется для расстановки приоритетов возможных сценариев поведения
  • EnemyAcquisitionScriptTag: тэг сценария, который будет использовать бот, в случае если он откажется от текущего в результате появления цели-врага
  • EnemyAcquisitionScriptProbability: вероятность использования ботом сценария по принятию врага в качестве цели
  • bSniping: бот будет снайперить, используя этот сценарий в защитных целях как точку обороны
  • SnipingVolumeTag: территория, в которой следует искать снайперские (дальние) цели (используйте, только если это необходимо)
  • WeaponPreference: оружие, использование которого будут предпочитать боты в этом сценарии
  • bRoamingScript: боты не будут снова использовать этот сценарий, а просто продолжат движение

По умолчанию, боты перемещаются к местоположению UnrealScriptedSequence, и будут смотреть в направлении, указанном этим актером (в соответствии со значением Rotation). В большинстве случаев, этого достаточно и никаких дополнительных изменений дефолтных свойств не потребуется (кроме указаний сценарию напрямую ассоциироваться с игровыми целями, таких как FlagBase).

Не смотря на это, у "защитных" точек могут быть определены различные виды действий для ботов, они могут быть соединены в одну цепочку, как любой другой сценарий. Обратите внимание, что время между переходами от одного типа поведения к другому может быть настроено при помощи переменной PauseTime в качестве второго действия (если используется дефолтные действия)
UnrealScriptedSequences, которые не имеют ассоциации с игровыми целями (GameObjective) являются точками "свободного" сценария. Боты с freelance приказом или во время Deathmatch игры, будет бродить между этими точками, если им больше нечем будет заняться. Это отлично работает, если на карте установлено несколько таких точек - но, учтите, что лучше вообще не иметь такие точки на карте, если их количество меньше 5.

Двери

Узловая точка Door должна быть установлена в связке с мувером, который играет роль двери (в зависимости от положения, она разрешает, либо блокирует переход между двумя зонами уровня). Точки Door должны быть установлены в центре зоны мувера (обычно, прямо в центре статического меша двери, но на достаточно низком расстоянии, чтобы касаться земли). Также, при необходимости, нужно устанавливать некоторые важные опции в свойствах Door актера:

  • DoorTag - имя мувера, с которым ассоциирована Door точка
  • DoorTrigger - если дверь открывается при помощи датчика, то здесь необходимо указать имя этого датчика
  • bInitiallyClosed - разрешает ли исходное состояние двери передвижение (false) или запрещает его (true)
  • bBlockedWhenClosed - если мувер двери был закрыт, то не остается никакой возможности его открыть (по умолчанию равно false)

У муверов есть одно очень полезное свойство: bAutoDoor. Если значение этой переменной установлено равным true, то для этого мувера будет автоматически сгенерирована Door точка. Это будет выполняться для большинства дверей.

CTF

При строительстве путей для CTF карт, дизайнер должен установить один xRedFlagBase актер и один xBlueFlagBase актер. Для CTF баз существует одна очень важная опция, которую всегда нужно указывать:

  • DefenseScriptTags: это список всех UnrealScriptedSequence точек, которые будут использоваться ботами для защиты флага. При обороне, боты будут выбирать одну из этих точек.

Double Domination

Для этого типа игры, дизайнер уровня должен установить по одному актеру xDomPointA и xDomPointB. Наподобие CTF баз, каждая точка доминации должна иметь установленные DefenseScriptTags для указания сценариев UnrealScriptedSequence, которые будут использованы при обороне этих точек.

Bombing Run

При постройке BR карт, необходимо установить в центр уровня актер xBombSpawn (в этой точке мяч будет появляться), а также два актера xBombDelivery для каждой из команд. С целью указания оборонительных точек используется все тот же список DefenseScriptTags, в котором указывается соответствующие UnrealScriptedSequence. У актера xBombDelivery есть еще несколько очень полезных свойств. Для каждой команды должно быть указано свое значение Team. Свойство TouchDownDifficulty предназначено для указания ботам, стоит ли пытаться "забить" мяч, или запрыгнуть с ним в "ворота" (чем больше значение, тем больше вероятность того, что они будут пытаться "забить" мяч).

Для указания ботам закидывать мяч в "ворота" с дальней дистанции, необходимо дополнительно установить актеров класса ShootSpot. Используйте BlueShootSpot для указания точек броска по синим "воротам" для ботов красной команды, и наоборот, RedShootSpot, для синих ботов, пытающихся забить в "ворота" красной команды. Таких точек может быть указано несколько для одних ворот.

AssaultPath (подкласс NavigationPoint)

Актеры AssaultPath используются для указания альтернативных путей при попытке группы ботов атаковать объект (например, CTF базу). Ниже приведен список наиболее важных параметров, которые необходимо устанавливать:

  • ObjectiveTag - здесь укажите имя (tag) объекта, который является пунктом назначения для этого пути
  • Priority - 0 или 1, чем выше значение, тем больше вероятность того, что из всех путей, боты изберут именно этот
  • bNoReturn - установите это равное true, если Вы не хотите, что бы боты использовали этот путь для возврата из вражеской базы
  • bReturnOnly - установите для этого параметра значение true в случае, если Вы хотите, чтобы этот путь использовался только для отступления
  • bNoGrouping - обычно, объект атакуется группой сразу из двух-трех ботов. По этой причине, если это свойство не установлено, одинокий бот будет ждать сбора команды рядом с этой точкой. В случае, если точка расположена на открытом пространстве, для этой переменной необходимо указать значение true, т.к. в данном случае, "повисший" на время бот будет выглядеть глупо

Во время атаки вражеской базы, группа ботов выбирает случайным образом (вообще, это зависит от приоритетов) один из AssaultPath и перемещается к этой точке, перед тем, как атаковать базу. По этой причине, AssaultPath должны быть указаны для всех возможных подступов к вражеской базе. Например, красная база имеет три входа, и для каждого их них указано по AssaultPath. Атакующая группа ботов из синей команды выберет один из возможных путей с AssaultPath (на основе их приоритетов, игнорируя, при этом, все точки с bReturnOnly равными true), затем попытается проникнуть на вражескую базу, переместившись, сначала, к выбранной AssaultPath точке, а затем и к самой базе. Как только один из ботов схватит красный флаг, он покинет вражескую базу, опять же, выбрав для этого один из возможных AssaultPath путей, ведущих к красной базе (выбор происходит на основе их приоритетов, игнорируя все точки с bNoReturn установленным в положение true). Бот с флагом перемещается к выбранной точке, затем к своей базе.

Очень важно использовать параметр bNoReturn для "отключения" неподходящих путей отступления (например, путей, при которых боту необходимо было прыгать вниз для попадания на вражескую базу, или путей, требующих использования транслокатора).

Продвинутое построение AssaultPath путей

Для большинства создателей карт нет никакой необходимости использовать более тонкую настройку AssaultPath актеров, поэтому этот раздел предназначен, прежде всего, для продвинутых пользователей. Эти параметры почти нигде не применялись на стандартных UT2003 картах, и их использование может повлечь за собой проблемы, в случае их некорректной настройки.

  • Position - определяет относительное положение данного актера в цепочке всех AssaultPath точек, имеющих одинаковые PathTag и ObjectiveTag
  • PathTag[4] - укажите здесь названия от одной до четырех возможных AssaultPath цепочек, в которых принимает участие данная AssaultPath точка
  • bEnabled - переключается при передаче актеру AssaultPath, какого-либо события. Если bEnabled равно false, то эта точка не будет использоваться

Для атаки группой ботов вражеской базы, сперва, происходит выбор одной из наиболее близко расположенных 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 обладает следующими свойствами:

  • bOnlyTranslocator - такой JumpDest может быть достигнут только при помощи транслокатора (например, по причине того, что Pawn не пролазит через решетку)
  • bNeverImpactJump - для достижения этого JumpDest никогда не следует использовать Impact Jump (прыжок при помощи стрельбы из ImpactHammer)
  • bNoLowGrav - этот JumpDest недостижим (не должен использоваться) при низкой гравитации
  • TranslocZOffset - используйте это для изменения точки прицела транслокатора в случае, если боты испытывают с этим некоторые проблемы

Для просмотра и отладки установленных на уровне 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.

Категория: > Unreal Editor 2.0 | Добавил: AuDI (2012-Апр-13)
Просмотров: 563 | Рейтинг: 0.0/0
А также:
[2012-Апр-13][> Unreal Editor 2.0]
Unreal Tournament 2003 AI for Level Designers (0)
[2012-Апр-13][> Unreal Editor 2.0]
Основы UnrealED (0)
[2012-Апр-13][> Unreal Editor 2.0]
Создание анимационных прицелов для UT (0)
[2012-Апр-13][> Unreal Editor 2.0]
Использование формата ASE ASCII 3D Studio в Unreal2 и UT2003 (0)
Всего комментариев: 0
avatar