|
| |||
|
| |||
| |
Здравствуйте. Вы находитесь на сайте Unreal Level. Данный ресурс посвящен редакторам карт игр серии Unreal, UT и Gears of War. Основная цель сайта , помочь всем желающим освоить любой из редакторов вышеперечисленных серий. Наибольшим приоритетом на этом сайте, обладает редактор UnrealED for Unreal Engine 3 и редактор движка Unreal Engine 3.5, входящий в комплект разработки UDK, поскольку это наиболее актуальная на сегодняшний день технология. |
|
Characters Technical Guide
автор: FACH | 25 Декабря 2010 | Просмотров: 5805
Автор: Джефф Уилсон Перевод: LS Оригинал: Characters Technical Guide
Введение
Персонажи в Unreal составлены из двух частей: Пешки (Pawn) и Контролера (Controller). Пешка это физическое представление игрока или не играбельного персонажа (NPC) в игровом мире. Для Пешки нет разницы, быть контролируемым игроком или же искусственным интеллектом. Пешки содержат Mesh, коллизию и физику (Phat), дающую возможность им обрабатывать всю функциональность, связанную с физическим взаимодействием между персонажем и игровым миром. Они также содержат функции получения урона от других игроков или окружения, проигрывания звуков, проигрывания анимации и проведения любых инвентарных манипуляций, таких как хранение и/или стрельбы из оружия (хотя технически, процесс стрельбы начинается из класса контролера).
Каждая пешка может иметь только один контролер в любой момент времени. Контролер, как и предполагает его название, отвечает за сообщение пешки, что делать и как себя вести. По существу, это мозг павна. Контролеры бывают разных видов, таких как PlayerController и AIController, но их основная цель – это принять сигнал от пользовательского ввода или иного фактора в игровом мире, осуществить вызываемый процесс и действовать соответственно. Обычно результат приводит к команде или серии команд для пешки.
При нормальных обстоятельствах, GameInfo класс создает контролеры для всех вошедших в матч игроков, а затем при начале матча создает и присваивает для каждого контролера пешку. Полный процесс создания игрока изображен ниже.
Конечно, этот вариант может быть не всегда. Ваша игра может состоять из мира, населенного НПС, которые размещаются в игровом мире вручную, а не создаются динамически. Эти НПС, вероятно, будут подклассом базового Pawn класса, который будет создавать свой собственный.
Контролеры
Контролер – это нефизический объект, который прикреплен к Пешке, чтобы контролировать его действия. Он использует полученную информацию от игрока или окружающей среды и использует ее, чтобы заставить Пешку вести себя соответствующим образом. Контролер отвечает за перемещение, будь оно вызвано в ответ на использование игроком соответствующих клавиш или же обход путей сгенерированный системой навигации ИИ, а также за выполнение действий, основанных на различных событиях. Пешка перемещается в игре, потому что контролер заставляет ее перемещаться. Контролеры получают много уведомлений о событиях происходящих рядом с Пешками, которых они контролируют (например, пешка увидит или услышит противника). Контролеры используют эти события для осуществления надлежащего поведения для Пешки в ответ на соответствующие события.
Два основных подкласса Контролера – это PlayerController и AIController. При создании нового персонажа Вы будете применять один из этих классов или их подклассов, в зависимости от того, какой тип персонажа Вы создаете.
Контролеры, особенно AIController, также широко используют состояния, которые позволяют контролеру переопределять функции в пределах того же класса и осуществлять выполнение различных действий в зависимости от текущего состояния контролера. Состояния также обеспечивают возможность использовать скрытый код и скрытые функции, такие как функции перемещения персонажей под контролем ИИ, используя навигационную систему.
Controller класс
Базовый контролер класс содержит общие функции и события, которые относятся к контролированию Пешки в целом и неважно кем контролируется игроком или ИИ.
Pawns and Possession
Possess[InPawn][bVehicleTransition] – связывает определенную Пешку с Контролером и уведомляет, вызвав ее PossessedBy() функцию. UnPossess – разрывает связь между Пешкой и контролером и уведомляет, что она больше не контролируется данным контролером, вызвав функцию UnPossessedBy().
Инвентарь
Эти функции связанны с Pickup, оружием и другими инвентарно-специфическими функциональностями.
RatePickup[PickupHolder][PickupClass] – это обратный вызов из PickupFactory для вычисления необходимости поднятия данного пикапа. HandlePickup[InventoryItem] – вызывается каждый раз, когда Пешка пробегает по новому пикапу. Эта функция является пустой, переписав ее, Вы можете реализовать дополнительные функции для обработки поднимаемых предметов. FireWeaponAt[InActor] – функция заставляет подконтрольную Пешку выстрелить из текущего активного оружия в указанный актер. StopFire – функция заставляет подконтрольную Пешку прекратить стрельбу из текущего активного оружия. SwitchToBestWeapon[bForceNewWeapon] – определяет какое оружие из инвентаря подконтрольной пешки является наилучшим и активирует это оружие. ClientSetWeapon[WeaponClass] – заставляет подконтрольную пешку перейти к указанному оружию, при условии, что оружие этого типа присутствует в инвентаре пешки.
Смотрите «WeaponTechnicalGuide» для получения дополнительной информации об оружии.
Перемещение и навигация
Эти функции связаны с латентным перемещением позиции Пешки по всему игровому миру. Значение команд:
MoveTo[NewDestination][ViewFocus][DestinationOffset][bShouldWalk] – заставляет Пешку перемещаться на указанное место или сместиться на опционально указанное расстояние, держа при этом во внимании указанный актер. Данная функция использует сеть путей для помощи Пешки в навигации. MoveToDirectNonPathPos[NewDestination][ViewFocus][DestinationOffset][bShouldWalk] – данная функция идентична функции MoveTo() за исключением того, что она должна использоваться только при движении к конечной месту назначения. MoveToward[NewTarget][ViewFocus][DestinationOffset][bUseStrafing][bShouldWalk] – заставляет Пешку перемещаться к данному актеру, указанному в качестве NewTarget. Данная функция использует сеть путей для помощи Пешке в перемещении к цели. FindPathTo[aPoint][MaxPathLength][bReturnPatrial] – данная функция просчитывает кротчайший путь в системе навигации для достижения места назначения и возвращает следующий узел в этом пути. FindPathToward[anActor][bWeightDetours][MaxPathLength][bReturnPatrial] - данная функция просчитывает кротчайший путь в системе навигации для достижения указанной цели и возвращает следующий узел в этом пути. FindPathTowardNearest[GoalClass][bWeightDetours][MaxPathLength][bReturnPatrial] – данная функция просчитывает путь к ближайшему узлу системы путей и возвращает следующий узел в этом пути. FindPathToIntercept[Pawn][InRouteGoal][bWeightDetours][MaxPathLength][bReturnpartial]– данная функция просчитывает путь для перехвата указанной Пешки, которая движется по игровому миру и возвращает следующий узел в этом пути. PointReachable[aPoint] – возвращает достигла ли Пешка указанного места при перемещении. Данная функция может затрачивать большое количество ресурсов системы и поэтому ее следует избегать в пользу ActorReachable(), если это возможно. ActorReachable[anActor] – возвращает достигла ли Пешка указанного актера при перемещении. Эта функция потенциально более оптимизирована, чем PointReachable(), но она также может затрачивать большое количество ресурсов системы и должна использоваться разумно. FindRendomeDest – данная функция возвращает случайный узел в навигационной системе. Она может быть полезна для создания состояния, в котором персонаж будет бродить по игровому миру.
Смотрите «AIOverview» для получения дополнительной информации по искусственному интеллекту и навигации.
Камера / Прицеливание
Функции в этом разделе связаны с обзором и наведением на цель Контролера и его Пешки.
GetPlayerViewPoint[out_Location][out_Rotation] – возвращает точку обзора подконтрольной Пешки. Для игрока это точка обзора камеры. Для ИИ точка обзора «из глаз» Пешки. В данной базовой реализации это просто местоположение и угол поворота самого контролера. GetActorEyesPoint[out_Location][out_rotation] – возвращает точку обзора контролера или пешки, если такая существует. IsAimingAt[Target][Epsilon] – возвращает целится ли контролер в указанный актер, с учетом небольшого отклонения. Целиться имеется в виду имена наведение на актер, нежели просто направление камеры в его сторону.
Player Controller
PlayerController и его подклассы реализуют функциональность для получения входных данных от игрока (человека) и обработки их для выполнения действий, которые Вы видите в игре. По большей части это означает, что PlayerController выполняет действия, такие как перемещение Пешки, управление камерой и переключение или стрельба из оружия, основанные на нажатии игроком определенных кнопок. Ниже приведены некоторые из основных функций из PlayerController классов с описанием каждого.
Общие
Эти функции носят общий характер и не принадлежат к определенной категории.
Playertick[DeltaTime] – основная функция обновления для игрока. Она выполняется каждый цикл. ConsoleCommand[Command] – выполняет команду, введенную игроком в консоли.
Пользовательский ввод / Перемещения
Эти функции относятся к вводу и перемещениям игрока.
InitInputSystem – данная функция инициирует систему ввода путем создания нового экземпляра класса PlayerInput от PlayerController. PlayerMove[DeltaTime] - данная функция определяет значения ускорения и угла поворота для текущего перемещения, затем вызывает либо функцию ProcessMove() (для одиночной игры или при вызове сервером), либо ReplicateMove() (для сетевых клиентов). Обычно она пуста в базовом классе PlayerController, но переопределена в определенных состояниях, которые включают в себя движение, такие как PlayerWalking. Эта функция также вызывается из функции PlayerTick() каждый цикл. ProcessMove[DeltaTime][NewAccel][DoubleClickMove][DeltaRot] – осуществляет текущее перемещение на клиенте. Эта функция переопределяется внутри некоторых состояний, требующих специальных возможностей для движения. ReplicateMove[DeltaTime][NewAccel][DoubleClickMove][deltaRot] – эта функция начинает процесс перемещения. Она сохраняет текущее перемещение в список PendingMove, а затем вызывает функции ProcessMove() и SeverMove() (выполняется на сервере). ServerMove[TimeStamp][inAccel][ClientLoc][MoveFlags][ClientRol][View] – данная функция выполняется только на сервере и выполняет текущее перемещение, вызывая MoveAutonomous(). Она также определяет, необходимо ли обновление, основываясь на достаточности времени с момента прошлого обновления или если есть ошибки между позициями клиента и сервера. MoveAutonomous[DeltaTime][MoveFlags][newAccel][DeltaRot] – данная функция вызывает ProcessMove() и обновляет любые автономные просчеты физики, которые необходимо выполнить. ClientUpdatePosition – данная функция обновляет позицию игрока на клиенте, чтобы было соответствие позиции с сервером. Она вызывается из функции PlayerTick(), но только после того, как функции ServerMove() будет определена. UpdateRotation[DeltaTime] – данная функция обновляет угол поворота контролера и подконтрольной пешки, основываясь на принимаемых от игрока данных. ProcessViewRotation[DeltaTime][out_ViewRotation][DeltaRot] – обрабатывает процессы вращения камеры игроком и выводит результаты вращения. Вызывается функцией UpdateRotation().
AI Controller
AIController и его подклассы реализуют функциональность для наблюдения за окружающей Пешку средой и принятия интеллектуальных решений, основанных на этой информации. Ниже объяснены главные функции из AIController класса.
Принятие решений
Когда имеешь дело с ИИ-контролером, процесс принятия решений очень важен. Без какой-либо обработки информации и принятия решений, что делать и как себя вести на основе этой информации, Ваши NPC персонажи будут не более чем статуями. Очевидно, что разговор о том, как создать хороший ИИ выходит далеко за рамки данной статьи, но все, же Вы должны знать, как и где можно добавить свой ИИ код в структуру класса AIController. Функции ниже являются основной движущей силой механизма принятия решений.
Примечание: данные функции реализованы в классе UDKBot, а не базовым AIController. Чтобы использовать их в своем классе Вам будет необходимо сделать его дочерним от UDKBot или UTBot классов.
ExecuteWhatToDoNext – данная функция является главной отправной точкой для процесса принятия решения и должна содержать основу логики принятия решений. Эта функция запускается на выполнение в течение физического момента времени, но не должна содержать ничего, что может изменить состояние физики. WhatToDoNext – приводит к вызовут функции ExecuteWhatToDoNext() в следующий момент времени. Данная функция вызывается не из кода состояния в пользу использования функции LatentWhatToDoNext. LatentWhatToDoNext – изолирует вызов WhatToDoNext() и ждет момент-задержку, вызванную выполнение процесса принятия решений. Данная функция вызывается из кода состояния, так что состояние остается в ожидании следующего цикла принятия решений.
Pawn
Pawn класс – это базовый класс для всех игроков, персонажей, существ и других типов существ в Unreal. Как уже упоминалось ранее, он отвечает за физическое взаимодействие между игроком или ИИ и игровым миром. При создании пользовательского Pawn класса первое, что Вы должны знать это функциональность, которая уже существует, чтобы можно было принять соответствующее решение о том, как переписать существующую функциональность в целях изменения поведения новых персонажей. Чтобы помочь Вам в этом, ниже приведены наиболее важные функции из базового класса с описанием.
Controllers and Possession
Эти функции взаимодействия Пешки и Контролера.
PossessedBy[controller][bVehicleTransition] – данная функция устанавливает контролер, в качестве нового контролера пешки и выполняет другие необходимые действия или инициации. Вызывается из Controller класса при передаче контролеру управление пешкой. Unpossessed – разрывает связь контролера и пешки и сбрасывает другие соответствующие свойства. Вызывается из Controller класса при смерти Пешки, окончании раунда или если контролер больше не требуется для контролирования пешки, т.е. если контролеру необходимо управление другой пешкой. SpawnDefaultController – данная функция порождает экземпляр Controller класса для Пешки если она не имеет текущего контролера и передает ему управление. Вызывается функцией PostBeginPlay() для обеспечения размещения Пешек на уровне или передачи под управление контролера, если он был порожден во время игры. DetatchFromController[bDestroyController] – данная функция разрывает связь между Пешкой и контролером и если необходимо уничтожает экземпляр класса контролера. Она вызывается когда Пешка умирает, сбрасывается, удаляется или если Пешка назначается на другой контролер.
Инвентарь и Оружие
Большинство инвентарных функций обрабатывается InventoryManagerом Пешки, который порождается PostBeginPlay() событием. Пешка, тем не менее, обрабатывает некоторую функциональность и передает команды в InventoryManager путем использования нескольких инвентарно-определенных функций. Данный класс также содержит несколько функций относящихся к оружию и стрельбе. Данные функции перечислены ниже:
AddDefaultInventory – добавляет предметы инвентаря, перечисленные в массиве предметов по умолчанию, в инвентарь Пешки. Эта функция вызывается из функции AddDefaultInventory() GameInfo класса. CreateInventory[InventoryClass][bDoNotActivate] – создает экземпляр указанного класса инвентаря, добавляет его в инвентарь Пешки и возвращает новый предмет инвентаря. Эта функция просто передает вызов на InventoryManager для выполнения фактической работы. FindInventoryType[InventoryClass][bAllowSubclass] – возвращает предмет инвентаря запрашиваемого класса, если он существует в инвентаре Пешки. TossInventory[InventoryItem][forceVelocity] – заставляет Пешку выбросить указанный предмет с регулируемой скоростью, удаляя его и инвентаря. ThrowActiveWeapon – заставляет Пешку выбросить текущее активное оружие, удаляя его из инвентаря. Она просто передает команду в функцию TossInventory() для выполнения работы. SetActiveWeapon[newWeapon] – устанавливает указанное оружие в качестве активного оружия. Данная функция просто передает команду в InventoryManager для выполнения работы. PlayWeaponSwitch[oldWeapon][newWeapon] – используется для проигрывания анимации Пешки для перехода от старого к новому оружию. Вызывается из функции Changeweapon() InventoryManager’а. StartFire[fireModeNum] – заставляет Пешку начать стрельбу из активного оружия, используя указанный режим стрельбы. Данная функция передает команды в InventoryManager. StopFire[fireModeNum] - заставляет Пешку прекратить стрельбу из активного оружия. Данная функция передает команды в InventoryManager WeaponFired[weapon][bViaReplication] - используется для передачи команды создания всех эффектов, связанных со стрельбой. Вызывает функцию PlayFireEffect класса оружия. WeaponStoppedFire[weapon][b|ViaReplication] - используется для передачи команды уничтожения всех эффектов, связанных со стрельбой. Вызывает функцию StopFireEffect класса оружия.
Получение повреждений
Pawn класс содержит функциональные возможности для лечения, а также получения урона от оружия и других обстоятельств. Функции, связанные с ущербом и здоровьем перечислены ниже.
TakeDamage[damage][InstigatedBy][HitLocation][Momentum][DamageType][HitInfo][DamageCauser] – уменьшает здоровье Пешки на указанную величину. Damage – количество отнимаемого здоровья. InstigatedBy – контролер, наносящий данный урон. HitLocation – позиция, с которой ущерб должен быть применен. Momentum – импульс, приложенный к пешке при попадании в нее DamageType – класс, описывающий тип наносимого повреждения. HitInfo – информация об ущербе. DamageCauser – актер, ответственный за нанесенный ущерб. HealDamage[amount][healer][damageType] – увеличивает здоровье пешки на указанную величину, но не больше максимального здоровья пешки и только тогда, когда пешка не мертва или здоровье ниже уровня максимального здоровья. TakeFallingDamage – применяет ущерб пешке, основанный на скорости, с которой пешка падает и передает соответствующее количество урона в TakeDamage() функцию. CrushedBy[otherPawn] – применяет ущерб к пешке, если на нее приземляется другая пешка. Количество ущерба зависит от скорости падения приземляющейся пешки. Данная функция вызывается из функции BaseChange() Pawn класса и передает количество ущерба в функцию TakeDamage(). TakeRadiusDamageOnBones[InstigatedBy][BaseDamage][DamageRadius][DamageType][Momentum][hurtOrigin][bFulldamage][DamageCauser][bones] – данная функция применяет зависимый от радиуса поражения урон к списку конкретных костей скелетного меша пешки. NotifyTakeHit[InstigatedBy][HitLocation][Damage][DamageType][Momentum] – посылает уведомление во все функции, которые должны быть уведомлены, что пешка получила урон. Вызывает NotifyTakenHit() функцию Controller класса. TakeDrowningDamage – данная функция применяет ущерб в зависимости от того, как долго пешка под водой.
Анимации
Пешки используют скелетные меши в качестве основы визуальной составляющей. Хотя большую часть проигрывания анимации таких действий, как перемещение обрабатывает AnimTree, Pawn класс имеет некоторые ограниченные функциональные возможности для воспроизведения встроенных анимаций. Многие из них поставляются в виде вспомогательных функций, которые отправляют команды в компонент скелетного меша Павна. Эти функции описаны ниже.
Примечание: SkeletalMeshComponent Пешки, на которую ссылается переменная Mesh, содержит связанную с анимацией функциональность для проигрывания отдельных последовательностей (sequences) анимации. Но чтобы это использовать, нужно чтобы в AnimTree пешки присутствовал узел AnimNodeSequence. Иначе, Вы бы не использовали функции системы AnimTree, такие как смешивание анимации; но функция проигрывания только отдельной анимации присутствует, если нужно.
SetMorphWeight[MorphNodeName][MorphWeight] – устанавливает вес отклонения Morph узла AnimTree, связанного с Пешкой. SetSkelControlScale[SkelControlName][Scale] – устанавливает размер отклонения SkelControl узла AnimTree, связанного с Пешкой. PlayActorFaceFXAnim[AnimSet][GroupName][SeqName][SoundCueToPlay] – заставляет Пешку проигрывать указанную анимацию лица - FaceFX. StopActorFaceFXAnim - заставляет Пешку прекратить проигрывать указанную анимацию лица FaceFX. IsActorPlayingFaceFXAnim – возвращает логическое значение зависящее, воспроизводится ли Пешкой лицевая анимации в настоящее время.
Перспективы камеры / Прицеливание
Данные функции содержат функциональные возможности для контроля положения и направления камеры игрока, а также настройки текущего прицеливания для игрока или НПС.
CalcCamera[DeltaTime][out_CamLoc][out_CanRot][out_FOV] – просчитывает точку зрения камеры. Это основной просчет камеры для игрока. GetDefaultCameraMode[controller] – возвращает название режима камеры по умолчанию, которое должно использоваться для данной пешки. Обычно данная функция вызывается контролером при передачи ему управления пешкой. ProcessViewRotation[DeltaTime][out_ViewRotation][out_DeltaRot] – обрабатывает угол поворота обзора игрока и возвращает окончательный поворот в качестве параметра out_ViewRotation. Вызывается из UpdateRotation() функции PlayerController класса. SetViewRotation[NewRotation] – устанавливает вращение контролера, если таковой существует или самой Пешки, если не существует контролера. GetActorEyesViewPoint[out_Location][out_Rotation] – возвращает расположение и направление глаз Пешки или точки зрения игрока. Для «первого лица» совпадает с расположением и направлением камеры, Это также точка начала просчета трассирующей прямой для выстрела. GetBaseAimPotation – возвращает угол поворота при прицеливании, как параметр без каких либо корректировок. GetAdjustedAimRotation[Weapon][StartFireLoc] – позволяет применять любые корректировки к промежуточной точке базового вращения, такие как автоприцеливание. По умолчанию, данная функция просто передает команды функции GetAdjustedAimFor() Controller класса. Если контролер для пешки не существует, то возвращается базовое вращение.
Пример создания Игрока
Чтобы продемонстрировать добавление нового контролируемого игроком персонажа, мы используем стандартный мешь и три новых класса: Pawn, PlayerController и GameInfo. Цель этого примера – показать основы создания новых персонажей, контролируемых игроком. Если у Вас будут основные представления о реализации, то Вы без особых трудностей сможете использовать доступную или добавить свою собственную функциональность для реализации нового персонажа, который подойдет Вашей игре.
Новый Pawn класс
Для данного примера новый Pawn класс получит небольшое добавление функциональности. Мы решили добавить постоянную регенерацию здоровья. Внутри функции Tick() указанное количество здоровья будет добавляться текущей пешке через определенный промежуток времени. Для достижения данного эффекта мы добавили несколько переменных класса, а затем переписали функцию Tick().
class UDNPawn extends UTPawn;
var float ElapsedRegenTime; var float RegenAmount; var float RegenTime;
event Tick(float DeltaTime) { //просчитывание течение времени ElapsedRegenTime += DeltaTime;
//условие, проверяющее прошло ли указанное кол-во времени? if(ElapsedRegenTime >= RegenTime) { //добавляет павну здоровье и сбрасывает таймер HealDamage(RegenAmount, Controller, class'DamageType'); ElapsedRegenTime = 0.0f; } }
defaultproperties { //свойства восстановления здоровья по умолчанию RegenAmount=2 RegenTime=1 }
Новый Player Controller класс
Новый PlayerConteroller класс очень прост и расширяет UTPlayerConteroller класс. Он просто добавляет новую переменную класса, предназначенную для содержания класса персонажа для использования в качестве Пешки и затем устанавливает использует существующую функцию ServerSetCharacterClass().
class UDNPlayerController extends UTPlayerController;
var class CharacterClass;
simulated event PostBeginPlay() { super.PostBeginPlay();
SetupPlayerCharacter(); }
/** устанавливает инфо класс персонажа игрока и выполняет другие инициации */ function SetupPlayerCharacter() { //устанавливает персонажа в качестве текущего персонажа ServerSetCharacterClass(CharacterClass); }
defaultproperties { //указывает на UTFamilyInfo класс пользовательсеого персонажа CharacterClass=class'UDNExamples.UDNFamilyInfo_SpaceMarine' }
Класс GameInfo
Новый тип игры необходим в этом случае для того, чтобы указать, что используются новые Pawn и PlayerController классы. Вы, скорее всего, будете использовать пользовательский тип игры при создании Вашей игры на UDK, так что Вы можете потом просто добавить соответствующие свойства по умолчанию (default properties) в этот класс вместо того, чтобы создавать ещё один. Для этого примера новый тип игры просто устанавливает, чтобы свойства DefaultPawnClass и PlayerControllerClass указывали на наши недавно созданные классы.
class UDNGame extends UTDeathMatch;
defaultproperties { //указывает на Ваш пользовательский Pawn класс DefaultPawnClass=class'UDNExamples.UDNPawn'
//указывает на Ваш пользовательский PlayerController класс PlayerControllerClass=class'UDNExamples.UDNPlayerController' }
Пример NPC
Чтобы продемонстрировать простейшую ИИ-контролируемую Пешку, мы создадим новые Pawn и PlayerController классы. Pawn класс будет размещаемым в редакторе и будет обрабатывать настройки меша, анимации и физические свойства, а также установит класс, который будет его контролировать. Контролер будет заставлять NPС бродить по всему игровому миру, выбирая случайные направления всякий раз, как будет достигнут текущий пункт назначения.
NPC Pawn класс
Pawn класс достаточно прост. Он добавляет несколько свойств, но в действительности это просто дубликат существующих свойств для того, чтобы облегчить работу для дизайнеров. SkeletalMeshComponent используется для настройки всех визуальных свойств, таких как мешь, AnimTree, AminSet, PhysicsAssets и т.д. Некоторые значения по умолчанию для данного компонента устанавливаются в блоке defaultproperties. Класс также устанавливает контролер для контроля NPC. Функция PostBeginPlay() для установления существующей ControllerClass переменной в новую переменную NPCController. Наконец, функция SetCharacterClassFromInfo() переопределена и ничего не делает, так как она не будет необходима для реализации данного NPC.
class UDNPawn_NPC extends UTPawn placeable;
var(NPC) SkeletalMeshComponent NPCMesh; var(NPC) class NPCController;
simulated event PostBeginPlay() { if(NPCController != none) { //устанавливает существующий ControllerClass в качестве нашего нового NPCController класса ControllerClass = NPCController; }
Super.PostBeginPlay(); }
//переопределение функции simulated function SetCharacterClassFromInfo(class Info) { }
defaultproperties { //установка NPC меша по умолчанию Begin Object Class=SkeletalmeshComponent Name=NPCMesh0 SkeletalMesh=SkeletalMesh'CH_LIAM_Cathode.Mesh.SK_CH_LIAM_Cathode' PhysicsAsset=PhysicsAsset'CH_AnimCorrupt.Mesh.SK_CH_Corrupt_Male_Physics' AnimSets(0)=AnimSet'CH_AnimHuman.Anims.K_AnimHuman_BaseMale' AnimtreeTemplate=AnimTree'CH_AnimHuman_Tree.AT_CH_Human'{ End Object NPCMesh=NPCMesh0 Mesh=NPCMesh0 Components.Add(NPCMesh0)
//указывает на наш пользовательский AIController класс как на значение по умолчанию NPCController=class'Engine.AIController' }
NPC Controller класс
Наш контролер класс лишь осуществляет основы навигации. Функция ExecuteWhatToDoNext() является основной функцией принятия решений, она переопределена, чтобы отправлять контролер непрерывно в состояние перемещения. Это состояние просто проверяет, есть ли существующие назначения или Пешка достигла текущего, если необходимо устанавливает новое место назначения и затем сообщает контролеру двигаться к этому месту. Наконец функция LatentwhatToDoNext() предназначена, чтобы вызывать функцию ExecuteWhatToDoNext() через определенный промежуток времени снова и снова.
class UDNBot extends UTBot;
var Actor Destination;
protected event ExecuteWhatToDoNext() { //переход в состояние перемещения GotoState('Roaming'); }
state Roaming { Begin: //если перемещение только началось или достигнут пункт назначения //выбирает новый пункт назначения случайным образом if(Destination == none || Pawn.ReachedDestination(Destination)) { Destination = FindRandomDest(); }
//находит путь к следующему месту назначения и перемещает контролер MoveToward(FindPathToward(Destination), FindPathToward(Destination));
//запускает функцию ExecutewhatToDoNext() в цикл LatentWhatToDoNext(); }
defaultproperties { } #1 написал: kaq 27 Января 2011 20:21 | ICQ: Не Указано |
#2 написал: FACH 27 Января 2011 20:43 | ICQ: 562039160 |
#3 написал: kaq 28 Января 2011 07:34 | ICQ: Не Указано |
#4 написал: FACH 28 Января 2011 13:39 | ICQ: 562039160 |
#5 написал: kaq 28 Января 2011 13:51 | ICQ: Не Указано |
#6 написал: LS 28 Января 2011 15:46 | ICQ: Не Указано |
#7 написал: kaq 29 Января 2011 08:22 | ICQ: Не Указано |
#8 написал: LS 29 Января 2011 13:01 | ICQ: Не Указано |
#9 написал: kaq 29 Января 2011 13:16 | ICQ: Не Указано |
#10 написал: LS 29 Января 2011 13:35 | ICQ: Не Указано |
#11 написал: FACH 30 Января 2011 13:19 | ICQ: 562039160 |
#12 написал: LS 30 Января 2011 14:35 | ICQ: Не Указано |
#13 написал: FACH 30 Января 2011 15:27 | ICQ: 562039160 |
#14 написал: LS 30 Января 2011 20:16 | ICQ: Не Указано |
#15 написал: FACH 30 Января 2011 20:29 | ICQ: 562039160 |
#16 написал: LS 30 Января 2011 22:04 | ICQ: Не Указано |
#17 написал: FACH 30 Января 2011 22:25 | ICQ: 562039160 |
Информация
Посетители, находящиеся в группе Гости, не могут оставлять Комментарии в данной новости...
|
|
|
При копировании материалов, активная ссылка на UNREAL-LEVEL.RU обязательна! © 2008—2012, UNREAL-LEVEL.RU. Все права защищены. |