Unreal Tournament AI and Gameplay for Level Designers
Last Updated: 11/30/99
Аудитория: Level designers, programmers.
Экспортирование карт из Unreal в Unreal Tournament
Содержимое уровней из Unreal автоматически заменяется на подобное из Unreal Tournament, если Вы запустите DM карту используя любой тип игры в Unreal Tournament. Тем не менее, мы рекомендуем вручную заменить предметы (inventory), используемые в Вашем уровне на эквивалентные в Unreal Tournament и выпустить обновленную версию Вашего уровня. В противном случае, будут загружены обе версии содержимого (inventory и т.д.): из Unreal и из Unreal Tournament, что вызовет дополнительный своппинг (swapping) на клиентских машинах при наличии небольшого объема памяти.
Навигационные сети (Navigation Network)
Создание навигационной сети (Navigation Network)
Боты из Unreal Tournament используют систему специальных указателей для движения по уровню. Использование этих указателей позволяет Unreal Tournament снизить нагрузку на CPU при вычислении искусственного интеллекта, а также предоставляет дизайнерам уровней максимально возможный контроль над навигационной частью AI.
Создание навигационной сети (Navigation Network) подразумевают под собой расстановку ряда актеров (actors) являющихся подклассом класса NavigationPoint. В этот подкласс также входят актеры PlayerStart и Teleporter. Некоторые навигационные указатели (NavigationPoint), такие как InventorySpot и WarpZoneMarker автоматически добавляются при "расстановке" путей (описано ниже). Также есть ряд навигационных указателей применимых только для сингл уровней (single level), подобных из Unreal, но бессмысленных в Unreal Tournament: AlarmPoint, ButtonMarker, PatrolPoint, QueenDest, SpawnPoint, Transporter и TriggerMarker.
Как только с геометрией уровня закончено, дизайнеру следует приступить к созданию навигационных сетей (Navigation Network) используя так называемые дорожные узлы (PathNodes). Устанавливать PathNodes предпочтительно на перекрестках и поворотах (т.е. в ключевых местах). Также PathNodes должны находится в прямой видимости друг от друга на расстоянии, не превышающем максимальную ширину (она равна 2*CollisionRadius) существа, для которого они расставляются. В общем случае расстояние между соседними PathNodes не должно превышать 700 юнитов. Так как PlayerStarts и Inventory тоже являются частью навигационной сети (Navigation Network), дизайнеру не следует устанавливать PathNodes в непосредственной близости к ним. На лестницах и наклонных плоскостях, PathNodes необходимо устанавливать на расстоянии максимум 350 юнитов друг от друга. Старайтесь использовать минимально возможное количество PathNodes для полного покрытия уровня.
Версия 402 Unreal Tournament имеет встроенный PathNode генератор, работа которого заключается в автоматической расстановке путей. Но следует помнить, что в его обязанности не входит установка таких навигационных указателей (NavigationPoints) как playerstarts, liftcenters и т.д. Если Вы хотите воспользоваться услугами генератора, откройте Ваш уровень, затем в меню View выберете Log. В окне введите 'Paths Build' (без кавычек). Для типичного уровня это займет примерно 5-10 минут.
Для передвижения по карте, боты сперва найдут ближайший навигационный указатель (NavigationPoint), затем начнут свое движение внутри навигационной сети, передвигаясь таким образом от одного указателя к другому. Очень важно помнить, что все навигационные указатели (NavigationPoint) должны находиться в пределах досягаемости (т.е. в наличии не должно быть никаких препятствия для их достижения) из любого возможного местоположения. Если бот не может найти нормальной "дороги", не может найти путь к ближайшему указателю в навигационной сети, не может при помощи указателей достичь определенного назначения или же вообще путь обрывается, то это приведет к тому, что бот просто будет "прогуливаться" в месте своего появления.
Последним шагом создания навигационной сети (Navigation Network) является "утверждение" путей (Paths Define). Это можно сделать, набрав в консоли "Paths Define" (без кавычек) или же нажав соответствующую кнопку в меню едитора. Дизайнер может исследовать построенную навигационную сеть (Navigation Network) в любом окне 3D View, поставив галочку напротив Show Paths в меню View необходимого Вам окна (щелкните правой кнопкой мыши на заголовке окна, выберете раздел View, здесь щелкните левой кнопкой напротив Show Paths). Навигационные указатели, связанные между собой будут иметь либо синий, либо красный цвет. Боты будут пользоваться и теми и другими путями, но все же "синие" дороги более предпочтительны - они показывают пути, наиболее "чистые" от всякого рода препятствий и затруднений. Каждый раз при изменении геометрии уровня или передвижении/установке навигационного указателя (включая оружие, аптечки и т.д.), "утверждение" путей (Paths Define) должно быть произведено заново.
Ниже описаны некоторые общие проблемы построения навигационной сети (Navigation Network), причина которых, в основном, кроется за попыткой едитора оптимизировать пути. Во-первых, убедитесь, что PathNodes на Вашем уровне расположены на расстоянии хотя бы 50 юнитов. Если два PathNodes установлены слишком близко друг к другу, бот может "растеряться" и застрять. Лог в едиторе в этом случае выдаст предупреждение. Такого рода проблемы возникают также при установке навигационных указателей рядом с оружием, аптечками и т.д. Как было сказано выше, не устанавливайте PathNodes на близких к ним расстояниях.
В некоторых ситуациях боты застревают на краю уступа, где они просто бегут на одном месте. Это появляется из-за так называемой проблемы порога. Боты не будут спрыгивать вниз, если угол падения (угол между краем уступа и местом их назначения) больше 45 градусов. Это исправляется путем уменьшения угла наклона (переместите соседний PathNode) или добавлением промежуточных указателей.
Также, у ботов возникают проблемы если навигационный указатель установлен слишком высоко над землей. Убедитесь, что он установлен на высоте, не превышающей 1.5 CollisionHeight бота. При автоматической генерации обычно проблем не возникает, но в некоторых ситуациях (сильно крутой подъем, например), дизайнеру придется вручную подправлять Z компоненту навигационных указателей для адекватного поведения ботов.
PathNodes, используемые ботами для подводного плавания должны быть в воде. Установка указателей над поверхностью воды приведет к тому, что бот будет барахтаться на одном и том же месте, безуспешно пытаясь обучиться азам левитации для достижения указанного PathNode.
WarpZones должны быть как минимум 70 юнитов в глубину для их успешной обработки AI.
Добавление поддержки лифтов
В едиторе существуют два специальных NavigationPoint класса помогающие ботам "понимать" лифты: LiftCenters и LiftExits. Дайте лифту уникальное имя (Tag). Поместите LiftCenter непосредственно на мувер (Mover) лифта, и в его свойствах (LiftCenter Properties) в поле LiftTag впишите имя (Tag) Вашего лифта. У каждого выхода из лифта добавьте LiftExit на достаточном расстоянии, чтобы бот не был озадачен близким расположением LiftCenter и LiftExit. Затем в свойствах каждого из LiftExit в поле LiftTag также следует указать имя (Tag) соответствующего лифта.
InitialState лифтов по умолчанию равен BumpOpenTimed. Не используйте это значение InitialState для лифтов! В таком случае боты будут интерпретировать лифты как двери. Поэтому для большинства лифтов вместо BumpOpenTimed используйте StandOpenTimed. Боты также прекрасно понимают лифты с датчиками (TriggerOpenTimed, TriggerToggle и т.д.). В большинстве случаев, ботам не понадобиться никакая дополнительная помощь при использовании лифтов с датчиками. Но в некоторых сложных ситуациях (например, с использованием диспетчера задержки для управления лифтом), ботам понадобиться "совет". В таких случаях, стоит указать в поле LiftTrigger свойств LiftCenter имя (Tag) датчика который отвечает за управление лифтом.
Стоит упомянуть два других интересных атрибута LiftCenter. Эти значения следует менять только в случае крайней необходимости. MaxZDiffAdd - значение по умолчанию равно 0. Указывает максимально возможное расстояние (по высоте) между ботом и LiftCenter при котором бот считает, что LiftCenter в пределах досягаемости. Очень полезно в ситуациях, когда Вы хотите, чтобы бот подождал лифт внизу пока он не спуститься. Другое свойство MaxDist2D - указывает максимально возможное расстояние между ботом и LiftCenter. Значение по умолчанию равно 400 юнитов.
Свойства навигационных указателей
Единственное свойство навигационных указателей (NavigationPoint) которое представляет интерес это bOneWayPath. Если это свойство установлено в положение true, то путь будет с односторонним движением, направление которого указывает сам навигационный указатель (NavigationPoint). В свойствах NavigationPoint установите атрибут bDirectional равным true для настройки направления движения.
Навигационные указатели специального назначения
В едиторе существует несколько видов навигационных указателей специального назначения, выполняющих разные роли: например чтобы боты пользовались транслокаторами (translocators) или сапожками (jumpboots):
Тем не менее, в силу своих скромных умственных способностей, боты будут полагать, что положение любого LiftExit, имеющего такой же LiftTag как и у TranslocDest может быть достигнуто без особых усилий с его стороны. Если Вы хотите чтобы бот воспользовался транслокатором для того чтобы добраться из TranslocDest в один из LiftExits, замените LiftExits на TranslocStart.
Если атрибут bEnabled телепортера равен false, то он не будет производить телепортации, но при этом он может быть использован в качестве телепортера-приемника. Атрибут bEnabled меняет свое значение при подключении датчика к телепортеру. Также, если Вы установите значение bChangesYaw в положение true, то прибывшие в телепортер-приемник боты/игроки поменяют свой Yaw (отклонение от направления движения) на Yaw телепортера. При установленном же свойстве bChangesVelocity равном true, вновь прибывшие будут обладать такой же скоростью (velocity), с какой они попали непосредственно в сам телепортер-отправитель.
Тестирование и дебуггинг навигационной сети
После расстановки путей и их "утверждения" (defining), дизайнер должен потестировать и отследить возможные ошибки, посмотрев как боты ведут себя на уровне. Лучшим способом для этого является игра в качестве стороннего наблюдателя (spectator), причем сначала необходимо посмотреть поведение одного бота, а затем добавив еще нескольких. Воспользуйтесь кнопкой стрельбы для переключения между различными ботами. Таким образом, Вы сможете отследить наиболее проблемные области. Если текущий бот ведет себя "странно", воспользуйтесь консолью: введите verbose и консоль отобразит что он "думает". После этого не забудьте заглянуть в файл лога - так Вы сможете найти некоторые не обнаруженные с первого раза проблемы или пролить свет на их природу.
Если бот не понимает как добраться до определенного места назначения, воспользуйтесь командами консоли rememberspot и showpath для поиска пробелов в навигационной сети. При использовании команды rememberspot, запоминается текущее положение. Затем воспользуйтесь командой showpath - при этом Вам покажут наилучший навигационный указатель на пути к сохраненному местоположению. Если же никакой указатель не появится, значит его просто нет, и, следовательно, нет и нормального пути для достижения интересующего Вас местоположения.
Типы игр в Unreal Tournament
Командный тип игр в Unreal Tournament требует наличия в уровне специально предназначенных актеров.
Domination
Для игры типа Domination необходимо установить актеры ControlPoint. ControlPoint также является представителем класса навигационных указателей (NavigationPoint), расставлять их необходимо в стратегически обоснованных местах на уровне. Также их не следует устанавливать близко к другим навигационным указателям (впрочем, это касается всех указателей) и вдобавок они должны быть расположены на земле (а не на возвышении) - в противном случае боты придут в замешательство.
В свойствах ControlPoint Вы можете найти несколько полезных настроек. Например, в ситуации, когда одна из команд захватывает ControlPoint (когда один из игроков какой либо команды дотрагивается до него) может быть возбуждено событие, имеющее отношение к команде, член которой и произвел захват ControlPoint. Это событие указывается в полях RedEvent, BlueEvent, GoldEvent и GreenEvent. Свойство bSelfDisplayed отвечает за визуальное отображение непосредственно самого меша ControlPoint (вид меша меняется в зависимости от того, какая из команд контролирует его). Короче говоря, это свойство указывает, отображать ли меш или нет. В поле PointName впишите имя ControlPoint - это имя будет отображаться в интерфейсе рядом со значком соответствующего ControlPoint. Свойству ControlSound можно назначить звук, который будет звучать при захвате (любой командой) ControlPoint.
Capture the Flag
Игра в захват флага требует наличия FlagBase актеров, являющихся также представителями класса навигационных указателей (NavigationPoint) - они показывают исходное местоположение флага каждой из CTF команд. Всего может быть только две CTF команды и у каждой может быть только по одной FlagBase. Свойство Team показывает, какой из CTF команд принадлежит данный FlagBase: 0 = красной, 1 = синей. TakenSound отвечает за звук при захвате флага.
AlternatePaths используют для указания ботам различных возможных маршрутов к базе оппонента. При этом в свойстве Team этого навигационного указателя следует вписать значение, соответствующее той команде, к базе которой прокладывется этот путь (0 = красная, 1 = синяя). Свойство SelectionWeight влияет на то, какой путь будет предпочитать больше бот при попытке проникнуть на вражескую базу. Механизм работы этих указателей следующий: бот сперва кратчайшим путем внутри навигационной сети продвигается к выбранному им AlternatePath указателю, затем из этой точки он кратчайшим путем попытается достигнуть вражеской FlagBase. Если Вы установили AlternatePath указатель таким образом, что кратчайший путь к нему будет включать в себя проход через базу оппонента - то не сомневайтесь - бот без колебаний сделает это (что не есть хорошо!). В таких случаях необходимо отрегулировать положение указателя для получения желанного результата. AlternatePath с атрибутом bReturnOnly равным true будут использоваться ботами этой же команды для возврата на базу с захваченным флагом.
Assault
Актер FortStandard используется только в этом типе игры для определения стратегических целей (objectives) - например, взорвать компрессор на корабле. Таких указателей может быть несколько на одном уровне. Свойство bFinalFort используется для указания последней цели (для этого установите это значение в положение true). Если "последний" FortStandard уничтожен, уровень заканчивается, даже если другие FortStandard все еще действуют. Атрибут DefensePriority указывает на порядок, в каком необходимо защищать все FortStandard. Если FortStandard имеет наибольшее значение DefensePriority (по отношению к другим), то боты будут защищать его в первую очередь. В качестве подсказки ботам кратчайшего пути до необходимого FortStandard, используется свойство NearestPathNodeTag - введите в это поле имя (Tag) ближайшего к нему PathNode - и бот "сообразит" к какому навигационному указателю ему необходимо переместиться, чтобы как можно быстрее достичь нужного FortStandard. Не обязательный параметр FallBackFort показывает ботам, к какому FortStandard необходимо переместиться, в случае если текущий уничтожен - для этого впишите сюда имя (Tag) следующего FortStandard. Свойство bTriggerOnly указывает на то, как активируется FortStandard: с помощью датчика (true) или стрельбой из оружия (false).
bSelfDisplayed означает, отображается ли визуально FortStandard в игре или нет (имеется в виду его меш). Обычно эта опция выключена, т.к. для визуализации объекта FortStandard используется непосредственно геометрия уровня. Свойство bFlashing указывает, нужно ли FortStandard отображать вспышку, когда он поражен. Когда боты уничтожают какой-либо FortStandard, вы можете сказать им чтобы они информировали об этом других - для этого воспользуйтесь атрибутом bSayDestroyed (установите это значение равным false в случае если FortStandard является стратегически важной точкой, а не объектом). Если в поле DestroyedMessage вписать строку, то она будет отображаться в HUD каждого игрока, когда данный FortStandard уничтожен. Массив DamageEvent[] используется для хранения событий (Events) которые будут возбуждаться по мере получения указанного в массиве DamageEventThreshold[] количества повреждения (например, когда стреляешь в энергетический кристалл на AS-Mazon, то постепенно включаются SmokeGenerator).
ChargeDist и bForceRadius являются атрибутами, относящимися к AI (Искусственному Интеллекту) - они показывают, насколько агрессивно будут действовать боты при защите данного FortStandard, если они "чувствуют" что у них нет подходящей поддержки.
В одном из FortStandards Вы должны обязательно вписать значение в поле DefenseTime - это значение указывает время, за которое необходимо завоевать базу. Также, в Вашем распоряжении есть свойство EndCamTag - используется для определения камеры, видом из которой Вы сможете насладиться при удачном исходе игры (для нападающей команды).
TeamCannon можно установить в Assault карте в помощь защитникам. MinigunCannon - другой вид "механической" поддержки - представляет из себя пулеметную турель в отличии от плазменной TeamCannon.
Также, каждый Assault уровень должен иметь AssaultInfo актер. Место расположения его на карте не имеет никакого значения. В его свойствах найдите 2 массива: ObjDesc[] содержит в себе текст, описывающий цели миссии, а массив ObjShots[] - как Вы можете догадаться, содержит скрины, соответствующие тексту. В поле NumObjShots укажите количество использованных ячеек массива ObjDesc[] либо ObjShots[].
Навигационный указатель AssaultRandomizer используется для того, чтобы заставить атакующих ботов отклоняться от своих обычных путей на другие (отмеченные этим актером) случайным образом. Устанавливать его следует на пути (например, на кратчайшем) к базе, но при этом убедитесь, что этот путь не пересекается с другими. В свойстве ToggledCost укажите "ценность" этой дороги. Если прикрепить к этому актеру датчик, то он будет включать/отключать данный путь из всей навигационной сети. Никогда не используйте отрицательных значений для свойства ToggledCost.
Информация об уровне (Level Info)
Level Info (Вы можете найти его в Level Properties меню View или, нажав F6) имеет несколько полей для описания уровня, включающие в себя Наименование уровня (Title), имя автора (Author) и Предпочтительное количество игроков (IdealPlayerCount).
Сделайте импорт скрина Вашего уровня и укажите его в атрибуте ScreenShot. Этот скрин должен быть размером 256*256 пикселей, иметь 256 цветов и быть в формате .PCX или .BMP. Для импортирования скрина, нажмите в Текстурном Браузере (TextureBrowser) Import (в UnrealEd2.0 - Import находится в меню File браузера). В появившемся окне укажите путь к Вашему скрину, затем нажмите OK. Появиться новое окно: поле Name - здесь впишите screenshot, в поле Package введите MyLevel. Уберите галочку напротив Generate MipMaps и нажмите кнопку OK. По прошествию некоторого времени, пак (Package) MyLevel должен появиться в Текстурном Браузере (Texture Browser), внутри его Вы и найдете Ваш скрин. Теперь вернитесь к окну Level Properties и в поле ScreenShot выберете только что импортированную картинку (если она была отмечена в Текстурном Браузере, просто нажмите в поле ScreenShot кнопку Use). Затем перестройте и сохраните Ваш уровень (спасибо Steve Keene за пояснение).
Теперь когда Вы запустите Unreal Tournament и выберете Вашу карту (в Practice Session), то увидите Ваш скрин в окошке справа - прямо как у всех карт, установленных с оригинальным Unreal Tournament.
Свойства RecommendedEnemies, RecommendedTeammates и LevelEnterText не используются.
Также LevelInfo является одновременно и ZoneInfo по умолчанию для зон, которые не имеют своего собственного ZoneInfo. Подробнее смотрите главу Информация о зоне (ZoneInfo) ниже.
Датчик (Trigger)
Датчик используется для возбуждения событий. Когда датчик активирован, он передает событие другим актерам уровня. Любой актер, имя (Tag) которого совпадает с именем события (Event) датчика, будет при этом активирован.
Свойство TriggerType датчика используется для определения того, что может являться причиной активации датчика. Ниже перечислены все возможные значения этого свойства:
Атрибут ReTriggerDelay используется для указания минимального количества времени, по прошествии которого датчик может быть активирован снова. Когда свойство bTriggerOnceOnly установлено в значение true, датчик будет одноразовым - после активации выйдет из строя (Made in China :).
Для датчиков существует несколько различных состояний. Необходимое Вам состояние Вы можете указать в поле свойства InitialState (раздел Object свойств датчика). При использовании датчика для другого датчика (привязка), первый, при активации будет менять значение bInitiallyActive второго, т.е. по сути, включать/отключать его - зависит от InitialState датчика (см. ниже). Если атрибут bInitiallyActive изначально установлен в положение false, то датчик при старте уровня будет находиться в отключенном состоянии. Все возможные значения InitialState датчика описаны ниже:
RepeatTriggerTime указывает время повтора события, возбуждаемого датчиком, в случае, если активировавший его актер все еще находится в радиусе действия датчика.
Специальные типы датчиков
TimedTrigger датчик не требует активации кем-то. В отличии от обычных, этот тип датчиков самостоятельно активируется по прошествии фиксированного интервала времени после старта уровня. Время определяется свойством DelaySeconds. Если bRepeating атрибут установлен в положение true, то датчик будет реактивироваться через указанный (в поле DelaySeconds) промежуток времени.
TeamTrigger может быть активирован только игроками, которые не принадлежат команде, указанной в поле Team этого датчика.
Датчики (Triggers)
Представители класса Triggers, не включая актеров подкласса Trigger, являются по сути своей не возбудителями события, а наоборот приемниками возбуждаемых датчиками (Trigger) событий.
SpecialEvent имеет несколько возможных состояний. Необходимое Вам состояние можно указать в поле InitialState (раздел Object свойств SpecialEvent):
Если в поле Message было введено какое-либо сообщение, то он будет отображаться в HUD игрока, возбудившего событие. Если же при этом установить bBroadcast равным true, то сообщение это будет отображаться у всех игроков, кроме вызвавшего активацию - но зато не в HUD, а прямо по центру экрана!!! Это имеет силу при любых значениях InitialState.
Не рассматривались: TriggerLight, DistanceViewTrigger, Kicker, Dispatcher, Counter.
В этой главе описываются все свойства ZoneInfo имеющие отношение непосредственно к геймплею (gameplay). За более детальной информацией касательно правильной разбивке уровня на зоны, обратитесь к документу "Зоны в Unreal" (автор Tim Sweeney). Каждая зона обычно (но не обязательно) должна содержать ZoneInfo актер, который "описывает" эту зону. Если внутри зоны отсутствует ZoneInfo, то его подменяет LevelInfo предоставляя всю необходимую информацию (используется по умолчанию).
В едиторе существует несколько классов ZoneInfo, включающие в себя такие как WaterZones (Зона с водой), LavaZones (Зона с лавой) и SlimeZones (Зона с кислотой). При установке любого ZoneInfo Вам не обязательно нужно настраивать ее, т.к. ZoneInfo изначально имеет необходимые настройки по умолчанию. Вообще можно любую зону наполнить водой, всего лишь установив в свойстве bWaterZone значение true, но, в таком случае, эта зона не будет обладать всеми характеристиками WaterZones, например EntrySound и ExitSound.
Несколько свойств ZoneInfo влияют на физическую модель поведения игрока. Сюда входят: ZoneGravity (в основном относиться к Z компоненте), ZoneGroundFriction (используется для ходьбы), ZoneFluidFriction (используется для плавания в WaterZone), ZoneVelocity (постоянная скорость, добавляемая к скорости актеров), ZoneTerminalVelocity (задает максимально возможную конечную скорость при падении) и bWaterZone (если true, то зона заполнена водой). Если в зоне установлено какое-либо значение ZoneVelocity, то bMoveProjectiles в данном случае будет показывать, прибавлять ли эту скорость к пулям, снарядам и пр., а также к эффектам.
Для зоны с атрибутом bWaterZone равным true можно также указать и EntrySound, ExitSound, EntryActor (например, эффект всплеска) и ExitActor.
Зоны могут быть настроены таким образом, что они будут наносить повреждения актерам, находящимся в них. Для этого bPainZone необходимо установить в положение true, а значение DamagePerSec при этом будет указывать, насколько его здоровье будет "линять" каждую секунду, пока он находиться в пределах этой зоны. Можно также воспользоваться свойством DamageType. Атрибут bDestructive отвечает за останки игроков - используйте это, если Вы хотите чтобы после смерти актера, в зоне не было раскидано то, что от него осталось. В отличии от bDestructive, свойство bNoInventory относится к инвентарю мертвеца - если true, то оружие не останется висеть в зоне после смерти актера. Вообще, реальная величина повреждений, наносимая актерам, зависит не только от значения DamagePerSec, но и от того, насколько глубоко актер успел "погрузиться" внутрь зоны. Если в поле DamageType указано Special (SpecialDamage), то свойство DamageString можно использовать для "надгробной" надписи.
Зона с bKillZone установленным в положение true мгновенно убьет любое живое существо (pawn), осмелившееся "посетить" эту территорию. В противоположность bKillZone, при bNeutralZone равном true, зона никакого ущерба не наносит.
При попадании игрока в зону (любого типа), происходит возбуждение события, описанного в поле ZonePlayerEvent.
Имя зоны (ZoneName - находится в разделе LocationStrings свойств ZoneInfo) используется непосредственно в игре при описании текущего положения друзей по команде в Вашем (HUD) или при отдаче им приказов. Большие зоны могут быть разбиты на "районы" при помощи LocationID актеров и, при этом каждый из них может иметь свое уникальное имя (поле LocationName). Свойство CollisionRadius (указывается в юнитах) определяет территорию, используемую данным "районом" и, соответственно, насколько далеко распространяется название этого "района" по отношению к имени, указанном в поле ZoneName, текущей зоны.
ZoneTag зоны используется для описания события (Event), в случае если она активируется с помощью датчика. При активации датчиком зоны типа WarpZone, она будет менять свои конечные места назначения в соответствии с очередью, указанной в массиве Destinations. Другие виды зон при активации будут просто переключать значение bPainZone.
Свойства ViewFog и ViewFlash (они находятся в разделе ZoneLight) позволяет дизайнеру настраивать основной цвет и яркость экрана при нахождении игрока в пределах этой зоны (например, когда Вы находитесь в воде, все выглядит бледнее и в голубоватых тонах). ViewFog используется для настройки цвета экрана. Он представляет собой вектор, компонентами которого являются RGB значения в интервале от 0 до 1.
В то время как ViewFog в следствие изменения цвета, заодно увеличивает и яркость, ViewFlash предотвращает перенасыщение яркости экрана. ViewFlash также является вектором, но только значения его лежат в интервале от -1 до 0. (например: -0.5, -0.5, -0.5). Обычно, значение всех компонент вектора ViewFlash равны усредненной величине значений, указанных в ViewFog. В этом случае яркость экрана не будет "прыгать", а цвет определяемый вектором ViewFog сохраниться.
Специальные типы зон
Когда игрок входит в зону TeleporterZone, он будет перемещен в соответствующий телепортер (определяется атрибутом TeleporterTag в свойствах TeleporterZone).
Не рассматривались: PressureZone, VacuumZone, WarpZone.
Влияние уровней сложности (Difficulty) на AI ботов
В Unreal Tournament различают 8 уровней сложности. Уровни от 0 до 3 предназначены для новичков, т.к. боты при таком уровне сложности двигаются медленнее, чем игроки и их оружие наносят меньшие повреждения. Боты уровня от 4 до 7 двигаются наравне с игроками. То же самое касается и их оружия.
"Низкоуровневые" боты разворачиваются медленно, а также, для наведения на цель им необходимо больше времени. Также у них слабо развито зрение. Боты высшего ранга имеют "набитый" глаз и обладают отличными качествами лидера. Также можно отметить продвинутые навыки стрейфа и умение отстреливаться при движении к определенной цели (objective). Неопытные же боты стрейфятся медленнее. При ударе боты с высоким AI меньше поддаются дезориентации и имеют тенденцию практически мгновенно открывать огонь (тем не менее, не быстрее, чем это может сделать игрок)
Продвинутые боты также обучены специальным техникам, таким как Shock Rifle Combo, HeadShot из снайперской винтовки и прыжок при помощи Impact Hammer.
Консольные команды полезные для отладки уровня
Команды необходимо вводить в консоли
Автор
Steven Polge
Epic MegaGames, Inc.
http://www.epicgames.com
Перевод сделан 32_Pistoleta