UEngine.Ru

Добрый день!
Настроил движение персонажа (Character) через инпуты, все вроде по науке, движение в пространстве через Add Movement Input, реакция на мышку через Add Controller Yaw Input и Pitch Input. Character ходит, с помощью мышки может оглядеться.
Хочу при нажатии на Enter подвесить игрока в точку N и повернуть так, чтобы он смотрел в точку M.
При нажатии на кнопку ставлю Set Actor Location, устанавливаю Set Movement Mode в Flying — Character перемещается в нужную точку, но я не понимаю как повернуть камеру (она закреплена на чарактере и Use Pawn Control Rotation стоит true).
Что я только не пытался повернуть — не поворачивается, ни камера, ни капсула.
Как направить взгляд в точку? Ну или хотя бы просто повернуть взгляд в нужном направлении?
П.С. Т.е.мне не нужно вычислять поворот — что и куда — у меня ни одна функция по заданию ротатора не работает, я не могу задать поворот ни камере, ничему. Что и как повернуть?
Как повернуть игрока в нужную сторону ue4

авг 25, 2016 | 6 комментариев
Заметки о ньюансах разработки в UnrealEngine4
Эта запись — блокнот для записи небольших заметок о некоторых неочевидных особенностях, всплывающих при разработке игр на Unreal Engine 4.
Все эти особенности приходится гуглить, а потом о них быстро забываешь, поэтому будет полезно хранить для себя и человечества эту информацию.
Речь будет идти в основном о «программировании мышкой» посредством BluePrint’ов.
Как сделать чтобы персонаж (Character) превращался в ragdoll и падал на землю?
1. Для этого нужно, чтобы у Skeletal Mesh’а, используемого в Character’е был привязан Physical Asset. Проверить, привязан ли он, можно открыв Skeletal Mesh в редакторе (дважды кликнув по нему в Content Browser), и посмотрев на параметр Physical Asset.
2. Важно, чтобы Physical Asset был «полноценным», то есть чтобы все части в нём были представлены отдельными элементами, а не одним большим монолитом на всё тело. Чтобы проверить, так ли это, нужно открыть в Content Browser нужное Physical Body и в редакторе сверху нажать кнопку Simulate, которая запускает симуляцию физики и показывает что будет с телом в этой ситуации. Если всё правильно — тело должно повалиться на пол как ragdoll, а не одним куском.
2.1. Если тело (Physical Asset) у вас сделано неправильно, одним куском (что, например, именно так у входящего в стандартный набор персонажа Mannequin), нужно сгенерировать новое тело на базе скелета. Нажимаем на Skeletal Mesh правой кнопкой (в Content Browser) и выбираем Create -> Physical Asset. После чего нужно открыть Skeletal Mesh и в настройках указать в качестве физического тела свежесозданное тело.
2.2. После создания и привязки физического тела нужно открыть его, и опять, нажав Simulate, убедиться в том, что всё работает как следует.
3. Для переведения тела персонажа в режим Ragdoll нужно назначить ему соответсвующий тип столкновений. В коде который у вас отвечает за смерть, нужно вызвать Mesh->setCollisionPreset(«Ragdoll») (Здесь и далее имею ввиду именно Blueprint).
4. И чтобы заставить тело подчиниться гравитации, нужно включить симуляцию физики: Mesh->setSimulatePhysics(true), после этого тело упадёт и начнёт беспорядочно валяться по полу.

Как сделать чтобы тело повалялось и успокоилось?
5. Чтобы тело не валялось слишком долго, крутя своими частями и завязываясь в узлы, его хотелось бы успокоить. Если просто отключить обработку физики — тело снова выпрямится и будет стоять так как ему положено по анимации. Чтобы решить эту проблему, можно создать компонент PoseableMesh. Он, по сути, является аналогом Skeletal Mesh, которого можно поставить в некую «позу» и в ней и оставить. В нашем случае эта поза должна соответствовать положению Skeletal Mesh. Создадим функцию, назвав её, например, FreezeMesh, и нарисуем в ней такую конструкцию:

6. Эту функцию можно будет вызывать когда вам надоело, что тело валяется и дрыгается на земле, скажем через пару секунд. Для этого нужно создать Custom Event в Event Graph’е, и вызывать из него команду Delay(2), то есть, приостановить выполнение на 2 секунды, а из неё уже вызывать FreezeMesh.

Как сделать, чтобы после смерти персонаж перестал подчиняться Controller’у?
Если при смерти у вашего персонажа просто проигрывается анимация смерти, а не включается ragdoll, то персонаж будет продолжать подчиняться Controller’у, например, враг будет даже мёртвым продолжать ползти за героем. Чтобы этого не случилось, достаточно в момент смерти отключить управление персонажа контроллеров. В функции, которая у вас обрабатывает смерть персонажа, достаточно вызвать getAiController->UnPosess.
Внимание! После вызова UnPosess контроллер отстыкуется от pawn’а, и обратиться к нему через getAiController будет уже невозможно!(чтобы осознать это, потребовалось несколько дней отладки)

Сделать чтобы мяч, пинаемый персонажем не крутился задом наперёд
Если вас персонаж создан на базе Character, а мяч (или что-то ещё круглой формы, например голова врага) на основе Actor, в котором вы в качестве корневого элемента используете SphereCollision, то когда ваш персонаж пинает мяч, он может крутиться задом наперёд, не так как будто он катится а так, как будто он «кручёный» и летит над землёй вращаясь в противоположную сторону.
Чтобы решить эту проблему, нужно:
1) Найти внутри вашего персонажа, в дереве компонентов, компонент CharacterMovement
2) в нём найти параметр Push Factor Point ZOffset и установить его = 0
Как сделать простейший объект-пулю
Время от времени возникает потребность создать объект, движущийся как пуля и умеющий обрабатывать столкновение с препятствиями.
Это может быть обычная пуля, ракета, вращающийся кирпич, горящий череп или птица, не принципиально.
Основные важные моменты этого создания:
1) Нужно создать новый Blueprint, наследованный от Actor, назвать его, скажем Bullet.
2) Внутри Bullet, в дереве компонентов, где изначально есть только корневой объект сцены, нужно добавить компоненты: Projectile Movement (чтобы двигался как пуля), Static/Skeletal Mesh (в зависимости от того, статическая у вас модель или скелетная) назовём его body, и Sphere/Capsule/Cube Collision (выбирайте более подходящий) для обработки столкновений, назовём её collider.
3) Настройка body (Static/Skeletal Mesh):
3.1) Сделать базовые настройки — выбрать модель, материал, если нужно — анимацию, выбрать масштаб.
3.2) Повернуть модель носом в сторону оси X, так проще будет позиционировать «пулю» при выстреле, и лететь она будет не боком а передом.
3.3) Все настройки столкновений (Collision) нужно отключить, данная модель вообще не должна ни сталкиваться ни overlap’ить с другими объектами. Эту работу будет делать collider.
3.4) Не включать симуляцию физики, так как тогда Projectile Movement не сможет управлять движением вашей пули.
4) Настройка Projectile Movement
4.1) Найти настройку Velocity (скорость), которая задаётся координатами по X, Y, Z, и указать скорость в поле X, например, 1000. Потом подберёте более подходящую.
4.2) Указать гравитацию, либо вообще отключить её (сделать равной нулю) в настройке gravity
5) Настройка collider
5.1) Первым делом коллайдер нужно сделать корневым элементом дерева компонентов. Для этого в дереве компонентов нужно мышкой перетащить collider поверх корневого элемента — тогда остальные элементы станут находиться внутри него.
5.2) В настройках Collision поставить галки Hit simulation Generation и Overlap simulation Generation, чтобы у вас обрабатывались события от пересечения и столкновения.
5.3) В настройках Collision выбрать правильный тип, например WorldDynamic, или настроить столкновения и пересечения с разными объектами вручную.
6) Обработка столкновений и пересечений:
В EventGraph добавить узлы OnBeginOverlap и OnHit, к ним подключить узлы обработчиков, самое простое — просто PrintString(«Пересечение»), после чего DestroyActor (уничтожить пулю).
7) Выстрел:
В акторе, который отвечает за выстрел (например, персонаж, или некое оружие), в обработчике, который занимается выстрелами данной пулей, достаточно вызвать SpawnActorFromClass, указав ваш класс bullet, и правильно задав положение пули в пространстве и её поворот (направление полёта).
Поворот персонажа, управляемого ИИ в сторону врага
1) Для плавного поворота, особенно, когда есть именно враг, можно использовать Controller->setFocus(targetActor)
2) Для поворота на указанную точку (когда врага нет, а надо просто посмотреть куда-то, можно использовать Controller->setFocalPoint(targetPointVector). Плавность поворота при этом не гарантируется.
6 комментариев
- Ответить Иван | Август 4th, 2020 Не получается сделать плавное вращение через setFocus, в чем может быть проблема?
- Ответить mihanentalpo | Август 4th, 2020 Вот например: http://www.dreambotstudios.com/ue4-make-ai-rotate-smoothly-avoid-snapping/
- Ответить Иван | Август 4th, 2020 Не получается, все равно рывком поворачивается.
проверяю так: у меня в btree стоит задержка, а потом setFocus на pawn игрока, когда он за спиной ai находится - Ответить Иван | Август 4th, 2020 В идеале я ищу что то типа setControlRotation что бы можно было вручную к нужной точке поворачивать через rinterp, но setControlRotation не работает
- Ответить Иван | Август 5th, 2020 Нашел, что надо убрать галку в aicontroller SetControlRotationFromPawnOrientation, тогда setControlRotation работает, но не учитывает pitch? а это проблема. Верх/вниз тоже надо смотреть
- Ответить mihanentalpo | Сентябрь 6th, 2020 С pitch проблема, когда мне нужно было сделать «самодельную» управляемую ракету (как в Half-life, которая летит в направлении точки где лазерный луч падает на поверхность), чтобы она поворачивала с нужной мне скоростью, а не резко и не так как это делает setFocus, пришлось писать свой алгоритм.
1) Определяем вектор направления ракеты
2) Определяем вектор «нужного» направления, куда ракета должна повернуть (в сторону лазера)
3) Находим угол между векторами. Предполагается, что скорость поворота изменяется в градусах в секунду. Поэтому надо определять на какую долю угла нужно повернуть.
4) Делаем оба вектора единичными, проводим между их концами новый вектор, делим его на угол и умножаем на угловую скорость. То что получилось добавляем к вектору скорости ракеты, а после этого вектор скорости ракеты домножаем на некую величину чтобы его длина стала такой же как была до изменения (тогда получится что ракета именно поворачивает, а не ускоряется в направлении цели). В случае когда надо сделать плавный поворот по pitch без изменения скорости (у ракеты тело было настроено всегда поворачивать в направлении скорости), достаточно просто определить угол межу целью и реальным направлением, и добавить к реальному углу небольшой угол равный скорости * dt, где dt — это длина тика (не помню как в UE переменная называется)
Навигация в Unreal Engine
Инверсия кнопок мыши для текущего проекта настраивается включением чек-боксов в Edit → Editor Preferences → Level Editor → Viewports →Invert Middle Mouse Pan (для инверсии перемещения со средней кнопкой мыши).
Примечание. Сохранение настроек происходит для каждого проекта. По заверениям разработчиков, сейчас ведётся работа над возможностью сохранять настройки в единый файл конфигурации, неизменный для версий и машин, где запускается движок.
Закладки для быстрой навигации
В любом месте сцены мы можем поставить координатную закладку, чтобы быстро к нему вернуться. Сделать это можно из меню перспективного вьюпорта (три полоски в углу) — Bookmarks — выбрав нужную закладку по порядковому номеру из списка Set Bookmarks. Кроме этого для установки закладки можно использовать сочетание Ctrl+(0-9). Для быстрого перехода к закладке нажимаем цифру (0-9), выбранную при постановке закладки. Закладки можно перезаписывать, переместившись к одной, нажать другое сочетание с номером.Очистить закладки можно из того же меню, выбрав пункт Clear Bookmark (для одной закладки), либо Clear All Bookmarks (для всех закладок). Чтобы скомпоновать (упорядочить) закладки, которые были добавлены с пропуском порядковых номеров, нужно активировать из того же меню функцию — Compact Bookmarks.
Скриншоты вьюпорта
Чтобы сделать скриншот текущего вида камеры: заходим в меню вьюпорта (полоски слева экрана) — нажимаем High Resolution Screenshot. При необходимости, в диалоговом окне можно выбрать коэффициент масштабирования скриншота (первое числовое поле).Назначение собственных горячих клавиш для навигации в Unreal Engine
Чтобы назначить хоткей на любое действие: главное меню — Edit — Editor Preferences — Keyboard Shortcuts — в поисковой строке вбиваем нужную команду — и в поле ввода нажимаем выбранную клавишу (или сочетание клавиш). Назначим команду для Maximize Viewport, повесив её на клавишу тильда (`) — русская ё на клавиатуре. Теперь при нажатии этой клавиши выбранный вьюпорт будет сворачиваться или разворачиваться на всю область просмотра. Настройка глобальная и будет работать для всех проектов Unreal Engine.Чтобы перенести свои сочетания клавиш между разными версиями движка, нужно экспортировать их из текущей версии (кнопка Export в окне настроек хоткеев) и добавить в новую версию через кнопку Import того же окна. Формат сохранённого файла .ini.
Кроме этого файл конфигурации горячих клавиш можно найти по этому пути: «C:UsersИмяУчётнойЗаписиAppDataLocalUnrealEngineВерсияДвижкаSavedConfigWindowsEditorEditorKeyBindings.ini». Этот файл можно использовать для бэкапов, либо для переноса между машинами.
Игровой режим в Unreal Engine 5
Для того, чтобы протестировать сцену мы активируем игровой режим. Это кнопка Play на верней панели инструментов, либо сочетание клавиш Alt+P. По умолчанию игровой режим открывается прямо во вьюпорте. Это поведение можно изменить, например, для того, чтобы тестовый режим запускался в новом окне. Для этого, перед активацией игрового режима, нужно нажать на выпадающий список опций (три вертикальных точки в ряду значков запуска-остановки игры). В этом меню выбираем опцию New Editor Window (PIE). Теперь игровой режим будет запускаться в новом окне. Настроить формат окна можно из меню Edit — Editor Preferences — Level Editor — Play. В разделе Game Viewport Settings можно настроить вид и положение нового окна при запуске игрового режима.Быстрое изменение положения источника света в Unreal Engine
Чтобы осветить объект с нужной стороны, оценив его таким образом, необязательно всякий раз переключаться в актор направленного света. Достаточно нажать Ctrl+L, и удерживая их, мышкой менять положение вектора освещения. Это работает в любой точке карты.Трансформации и привязки в Unreal Engine 5
Уровни Unreal Engine — это полноценные автономные миры. В игре может быть несколько уровней (или один глобальный). Переход между уровнями может быть как явным, с полосой загрузки (прелоадером), так и неявным — с подгрузкой нового уровня, пока игрок выполняет некое действие (перемещается на лифте, например). Для большей оптимизации, разумеется лучше иметь несколько уровней.
В Unreal Engine уровни (карты) наполняются независимо друг от друга. Это своеобразная театральная сцена, на которой «играют» актёры (акторы) — каждый на своей сцене. Как играет на нём, в конечном счёте, сам игрок. Уровни имеют расширение .umap. Логика здесь похожа на хранение ассетов, о которых говорили в предыдущем уроке. Только хранятся они в контейнере другого типа. Также в предыдущих уроках нашего курса мы условились называть уровни с префиксом MAP_ внутри браузера контента (как раз от слова «карта») — для удобной навигации по ним.

Опорная точка (Pivot) — точка трансформации
Для удобства трансформаций мы можем изменить положение опорной точки (Pivot) объекта. Можно также называть её точкой поворота. Способ интерактивного перемещения опорной точки — с зажатой СКМ на центре манипулятора Гизмо. Если мы захотим двигать Pivot строго по осям, зажимаем Alt+СКМ на любой из стрелок манипулятора. При единичном клике с зажатыми Alt+СКМ Pivot будет перемещаться к месту клика.
Функции неинтерактивного воздействия собраны в контекстном меню для выбранного актора по ПКМ → Pivot:
Set As Pivot Offset — Pivot вернется в исходное положение, если сбросить выделение актора. Чтобы сделать изменение постоянным, используем эту функцию
Reset Pivot Offset — даже при использовании предыдущей функции, истинная позиция опорной точки будет храниться внутри объекта. Чтобы вернуться к ней, используем текущую функцию
Set Pivot Offset Here — переместить опорную точку в место, куда пришёлся клик ПКМ
Set Pivot Offset Here (Snapped) — то же, что и предыдущая функция, но будет привязывать Pivot к ближайшей точке координатной сетки
Center On Selection — в текущей версии (5.1) не работает для единично выбранного объекта, но работает для множества объектов — устанавливает опорную точку по центру общего выделения.
Для постоянного изменения опорной точки у ассета (и всех его акторов на сцене), нужно активировать режим моделирования Modeling Mode → активировать функцию Pivot → задать нужно положение, например, по центру.
Значение сетки в Unreal Engine и Snapping
Для удобного размещения акторов на уровне, в Unreal Engine предусмотрена система привязок. Привязаться можно к сетке, к вершинам объекта или его поверхности. Все они находятся в верхней панели настроек вьюпорта (значки в правом верхнем углу вьюпорта).
Привязка к поверхности — Surface Snapping (значок поверхности с тремя направленными вовне стрелками). Внутри можно включить саму опцию привязки, поворот относительно поверхности (Rotate To Surface Normal), а также задать смещение от поверхности (Surface Offset). Нажатая клавиша End — располагает актор точно на ближайшей поверхности.
Привязка к сетке включена по умолчанию. В верхней панели настроек вьюпорта — это значок сетки. При изменении числового значения будет меняться шаг и визуальное отображение сетки. Также изменить размер сетки можно с помощью клавиш «квадратные скобки». Видимость сетки включается/отключается в настройках отображения вьюпорта — Show — Grid. При вращении также можно выставить шаг — либо в градусах, либо в сегментарном делении круга.
Привязка при масштабировании (Scale) имеет более расширенную логику. В настройках можно изменить шаг приращения. А также выставить опцию Preserve Non-Uniform Scale (сохранение зависимостей) при интерактивном масштабировании — хорошо заметно при масштабировании куба с непропорциональными сторонами. Также эта опция позволяет сохранять неоднородные величины сторон при масштабировании (с большим количеством знаков после запятой).
V —при удерживании в режиме перемещения включает привязку к вершинам. Таким образом можно точно располагать объекты относительно друг друга по принципу «Pivot к вершине». Часто используется, например, при построении стен или модульных конструкций. Будет работать эта привязка и для смещения Pivot к нужной вершине (с зажатой Alt+СКМ) — иногда полезно сначала приблизить гизмо к нужной точке, затем задать Alt+V и только потом зажимать СКМ и двигать гизмо.
Прочие опции привязки, доступные по ПКМ → Snapping
Взглянем ещё раз в эту завораживающую чёрную пустоту и вновь вспомним, что система координат у нас декартова. Это нам поможет в понимании дальнейшей логики привязок.

Snap Origin to Grid (Ctrl+END) — перемещает объект (точнее его Pivot) к ближайшей точке сетки — в декартову координату. Хорошо видно при большем шаге сетки, например, в 100 см. Если выбрано несколько акторов, то при использовании этой функции к точке сетки будет привязываться последний выбранный актор. Прочие акторы сместятся точно так же, относительно ведущего (последуют за ним).
Snap Origin to Grid Per Actor — точно такая же логика, как и в предыдущей функции, но будет учитывать каждый актор уникально при множественном выборе.
Align Origin to Grid — делает то же самое, что и первая функция — выравнивает объект его пивотом по ближайшей координате сетки, но делает это с подворотом до совпадения локальных осей объекта с мировыми
Snap to 2D Layer — привязка объекта к 2D-слою. Такие слои используются в платформерах, где действие происходит для зрителя сбоку
Snap to Floor (END) — привязка поверхности меша к поверхности другого меша (часто выступающего в роли пола).
Для наглядного эксперимента можем включить отображение контейнеров (границ) объектов в меню вьюпорта → Show → Advanced → Bounds
Align to Floor — выравнивание поверхностей по полу с подворотом до совпадения с осями пола. Если актор повёрнут, то при использовании этой функции он будет сначала перемещаться (до тех пор, пока синий контейнер не коснётся поверхности), затем актор будет поворачиваться. Именно поэтому при таком выравнивании будет оставаться зазор между полом
Snap Pivot to Floor (Alt+END) — привязка не по типу поверность-поверхность, а по типу pivot-поверхность
Align Pivot to Floor — то же, что и выше, но с изменением ориентации опорной точки и, как следствие, поверхности. В отличии от выравнивания поверхностей в функции Align to Floor, здесь происходит сначала привязка Pivot к поверхности, а затем уже ориентация. Поэтому в данном случае прилегание будет абсолютным. Разумеется, это справедливо для мешей с Pivot на нижней поверхности. Если опорная точка находится в центре и нет возможности изменить её положение, то нужно использовать выравнивание по поверхностям
Snap Bottom Center Bounds to Floor (Shift+END) — привязка центральной точкой нижней поверхности внешнего контейнера меша (синего)
Align Bottom Center Bounds to Floor — то же, что и предыдущая функция, но с поворотом объекта. Работает по той же логике, что и функция Align to Floor и может оставлять зазоры на сложно-ориентированных объектах (см. видео)
Команды из меню ПКМ — Transform
Delta Transform — ручной ввод разницы трансформации перемещения
Mirror X/Y/Z — отражение объекта по осямLock Actor Movement — блокировка объекта для трансформаций. Объект заблокированный таким образом можно выделить, но нельзя воздействовать на него инструментами трансформации. На данный момент это единственный доступный способ блокировки объектов в Unreal Engine 5.1. Хотя потребность в более удобных блокировках (в том числе и для выбора) всё ещё актуальна.
- Ответить mihanentalpo | Сентябрь 6th, 2020 С pitch проблема, когда мне нужно было сделать «самодельную» управляемую ракету (как в Half-life, которая летит в направлении точки где лазерный луч падает на поверхность), чтобы она поворачивала с нужной мне скоростью, а не резко и не так как это делает setFocus, пришлось писать свой алгоритм.
- Ответить Иван | Август 4th, 2020 Не получается, все равно рывком поворачивается.
- Ответить mihanentalpo | Август 4th, 2020 Вот например: http://www.dreambotstudios.com/ue4-make-ai-rotate-smoothly-avoid-snapping/