Blueprints: Как сделать..?

Если вы практически не знакомы с Blueprints Visual Scripting в Unreal Engine 4, эти инструкции предоставят всю необходимую информацию, освещающую ключевые моменты работы по Blueprint’ам, включая создание Blueprint’ов, добавление и связываниt узлов, создание переменных и т.д. Поняв ключевые аспекты работы с Blueprint’ами, вы сможете продолжить изучать гайды, ориентированные на геймплей, которые находятся в Gameplay Guide и иллюстрируют элементы, родственные геймплею, например,  спаунинг/уничтожение актеров, респаунинг, использование таймеров и многое другое.

Как связать Blueprints напрямую

На этой странице вы найдете информацию о том, как можно наладить прямую связь между двумя Blueprint’ами, чтоб  передавать между ними информацию.

Для этого примера мы позволим игроку пройти сквозь площадку и активировать эффект частиц.

Здесь мы будем использовать шаблон Blueprint Third Person с включенным Starter Content.

  1. В Content Browser откройте папку Content/StarterContent/Shapes.
  2. Правый клик на  Shape_Cube, затем раскрываем  Asset Actions и выбираем  Create Blueprint Using This…

    Кликаем Ok в качестве подтверждения в боксе, который появляется для создания Blueprint.
  3. Внутри  Shape_Cube Blueprint, выберете  Static Mesh в окне Components в верхней левой части экрана.
  4. В панели Details изменим Collision Presets на  OverlapOnlyPawn.

    Так вы подтвердите, что только Pawns (пешки), а также еще и Characters (персонажи) могут пройти сквозь платформу.
  5. В окне MyBlueprint кликните кнопку  Add Variable, и назовите переменную TargetBlueprint.

    Здесь должен быть другой Blueprint, с которым нужно наладить прямую связь.
  6. В панели Details для переменной установите значение Variable Type — Blueprint_Effect_Fire и сделайте его  редактируемым (поставьте галочку напротив Editable).

    Здесь мы определили Blueprint, с которым связаться, и сделали переменную доступной для публичного редактирования (можно редактировать за пределами Blueprint).
  7. Выберете Static Mesh в окне  My Blueprint, затем в панели Details добавьте событие On Component Begin Overlap.

    Это действие добавит узел и откроет Event Graph, где мы можем предоставить скрипт, который появится при вводе куба.
  8. Перетащите Target Blueprint, и Get P Fire, Get Fire Audio, а затем соедините так, как показано, с узлом  Activate.

    Здесь мы получаем доступ к системе частиц и аудио-компоненту внутри нашего Target Blueprint и активируем их.
  9. В Content Browser разверните  Blueprints и перетащите  Blueprint Shape_Cube  в уровень.
  10. В Content Browser разверните Content/StarterContent/Blueprints, а затем  откройте  Blueprint Blueprint_Effect_Fire.
  11. В окне Components выберете  P_Fire, затем в панели  Details уберите галочку с Auto Activate.

    Мы не хотим, чтоб этот эффект активировался в авто режиме, так как хотим, чтоб он активировался при входе на площадку в вашем уровне.
  12. Перетащите  Blueprint Blueprint_Effect_Fire в уровень.
  13. Выберете  Blueprint Shape_Cube, затем в панели Details, используя выпадающий список, выберете Blueprint Blueprint_Effect_Fire.

    Здесь мы уточняем наш экземпляр Blueprint’а Blueprint_Effect_Fire в уровне, с которым мы хотим связаться. Если мы поместим несколько экземпляров Blueprint’а Blueprint_Effect_Fire в уровень, каждый из них будет отображаться внутри выпадающего меню, позволяя нам указать, какой именно вариант – это Target Blueprint, с которым нужно связаться.
    Если мы кликнем на иконку «пипетка»,  это позволит нам выбрать вариант Target Bluperint, внутри уровня вместо того, чтоб использовать выпадающее меню. Помните, что вы можете  только выбирать Blueprint’ы, чтоб нацелится, основываясь на типе переменной, который вы определили.
  14. Кликните кнопочку Play в редакторе и протестируйте, как ваш персонаж пробежит через площадку.
    Вы увидите, как персонаж войдет на площадку, в результате чего активируется огневой эффект внутри уровня. Используя эту методику, вы также можете передавать значения переменных, вызывать функции или события, или все то, что присуще Blueprint.

Event Dispatchers (диспетчеры событий)

Когда мы вызываем  Event Dispatcher, любой  Blueprint, который выполняет и имеет привязку через Events к Диспетчеру событий, также выполняется при вызванном Event Dispatcher. Другими словами, когда бы мы не вызывали Диспетчер событий, любые события, которые привязаны к нему, также вызываются, позволяя выполнить множество Событий сразу и из одной точки.

Эта страница покажет вам, как установить Event Dispatcher и привязать  к нему событие. В этом примере мы позволим игроку нажать клавишу, что задействует эффект горящего огня, заспаунинного внутри куста.

Мы будем использовать шаблон Blueprint Third Person с включенным Starter Content.

  1. В  Content Browser, разверните  Content/ThirdPersonBP/Blueprints и откройте  Blueprint ThirdPersonCharacter.
  2. Под окном  My Blueprint кликните кнопку  Add Event Dispatcher и введите название  StartFire.
  3. Выполните правый клик в окне графа и добавьте F Key Event (ключевое событие F).
  4. Перетащите  StartFire Event Dispatcher в граф и выберете Call.
  5. Соедините F Key Event с Call StartFire Event Dispatcher.

    Когда будет нажата клавиша F, любой  Blueprints, который с помощью событийной привязки (Event bound) связан с этим  Event Dispatcher будет выполнен.
  6. Скомпилируйте (Compile) и сохраните, а потом закройте Blueprint.
  7. В Content Browser разверните  Content/StarterContent/Props и перетащите SM_Bush в уровень.
  8. В  главном тулбаре (Main Toolbar) кликните кнопку  Blueprints, а затем выберете Open Level Blueprint.
  9. Выполните правый клик внутри графа и выберете узел Create a Reference to SM_Bush. Здесь мы ссылаемся на SM_Bush внутри нашего уровня.

    Не видите узла упомянутого выше? Выберете SM_Bush внутри вашего уровня, затем попробуйте снова.
  10. Правый клик внутри графа, а потом добавьте Event Begin Play и узел Get Player Character.
  11. Перетащите узел  Get Player Character, найдите и добавьте узел   Cast To ThirdPersonCharacter.

    Так мы получим доступ к  событиям, функциям, переменным и свойствам внутри Blueprint ThirdPersonCharacter.
  12. Переместите пин As Third Person Character, найдите и используйте узел Assign Start Fire.

    Это создаст два новых узла: Bind Event и Custom Event. Когда бы  Event Dispatcher не был вызван внутри вашего  Character Blueprint, в связи с тем, что мы привязали это событие и все, что с ним связано, будет исполнено. Любой Blueprint, который имеет событийную привязку к  Event Dispatcher, также будет выполнен.
  13. Перетащите  Custom Event, добавьте узел  Spawn Actor from Class  (класс, установленный для реализации Blueprint_Effect_Fire).
  14. Перетащите SM_Bush на  Get Actor Transform и используйте как Spawn Transform для узла  Spawn Actor.

Ваши узлы соединены, и граф должен выглядеть, как показанный выше.
Кликаем  Compile, закрываем Level Blueprint, а затем кликаем Play, чтоб проиграть результат  в редакторе.

Когда мы кликнем клавишу F, эффект пламени возникнет внутри куста

Использование интерфейсов

В этой инструкции мы установим Blueprint Interface, который приводит к выполнению разных скриптов в множестве Blueprint’ов при его вызове.

Мы будем использовать шаблон  Blueprint First Person с включенным  Starter Content.

  1. В папке  Content/StarterContent/Props выполняем правый клик по  SM_GlassWindow и выбираем  Create Destructible Mesh.

    Мы собираемся превратить  Static Mesh (не редактируемая сетка) в Destructible Mesh, которая будет разрушена, когда мы будем стрелять.
  2. Откройте  Destructible Mesh, затем кликните  Fracture Mesh и сохранитесь, после чего закройте окно Destructible Mesh Editor.
  3. Правый клик на ассет  SM_GlassWindow_DM и в  Asset Actions, выберете Create Blueprint Using This….

    Это действие приведет к тому, что вам нужно будет ввести имя и местоположение Blueprint (мы использовали SM_GlassWindow_DM).
  4. Правый клик внутри  Content Browser, после чего  в  Blueprints выбираем  Blueprint Interface.

    Теперь вас попросят вновь ввести имя и место хранения вашего Blueprint интерфейса  (мы использовали DM_Interface).
  5. Внутри интерфейса Blueprint назовите существующую функцию IsDestructible? И добавьте  Inputs, показанные ниже, кликнув New.

    Выше мы создали три входных значения  (Inputs), которые мы можем использовать, чтоб передавать переменные между Blueprint’ами, которые реализуют этот  Blueprint интерфейс. Мы создали две Float-переменные, одна из которых называется    Damage и будет использоваться для передачи некого ущерба объекту, по которому мы бьём, и другая – это Strength, и она передает силовой импульс, который применяется к объекту. И наконец, мы добавили вектор (Vector) под названием  HitLoc, чтоб удержать локацию для удара по объекту, и чтоб мы могли по нему передать нашу информацию.
  6. Компилируем, сохраняем, а затем закрываем интерфейс Blueprint.
  7. В  Content Browser открываем   Blueprint SM_GlassWindow_DM, кликаем на опцию  Class Settings, которая находится в тулбаре.
  8. В панели  Details кликаем кнопку  Add под  Interfaces и добавляем  DM_Interface.

    Это действие реализует  Blueprint-интерфейс в этом Blueprint, позволяя нам получить доступ к функциям, которые ему принадлежат.
  9. Правый клик внутри графа и в поиске ищем ? и выбираем событие  Event Is Destructible?
  10. Зажимаем  Control и перетаскиваем в компонент Destructible из окна  MyBlueprint и создаем скрипт, приведенный ниже.

    Здесь, вне компонента  Destructible мы использовали  Apply Damage и соединили такие требуемые условия, как ущерб, сила, локация и направление, необходимые, чтоб разбить стеклянное окно. Информация о действительном ущербе, силе и месте передастся через  Blueprint Interface к. Blueprint из другого  Blueprint, который мы сейчас создадим.
  11. Компилируем, сохраняем, а затем закрываем Blueprint.
  12. В  Content Browser идем в Content/StarterContent/Blueprints, и открываем  Blueprint Blueprint_CeilingLight.

    Используя  Blueprint Interface, мы проделаем иное действие при выключении света.
  13. Добавьте DM_Interface через  Class Settings, а затем перетащите в компонент   PointLight1 и создайте скрипт, как ниже.

    Здесь, когда  Event Is Destructible? вызван, мы сначала сделаем свет зеленым. Вызываем второй раз, и делаем интенсивность свечения  (intensity) равной   0 (вырубаем свет). Заметим, что мы не использовали информацию о Damage, Strength или HitLoc, которая содержится в интерфейсе, так как все это не релевантно этому  Blueprint. Используя Blueprint Interface, мы можем создать общую функцию, которая вызовется во всех блюпринтах, которые используют этот интерфейс, а затем определит какой скрипт нужно запустить в определенном Blueprint.
  14. Скомпилируйте, сохраните, а потом закройте Blueprint.
  15. Внутри  Content Browser идем в  Content/FirstPersonBP/Blueprints и открываем   Blueprint FirstPersonProjectile.

    Этот Blueprint содержит скрипт для снаряда, который заспаунен в игре, когда игроки стреляют из своих орудий.
  16. Добавьте DM_Interface через Class Settings, затем выполните в графе правый клик и добавьте узел IsDestructible?(Message).

    Так мы исполним функцию IsDestructible?, и все Blueprint’ы, которые реализуют этот интерфейс и функцию,  также исполнятся. Если вы не видите узел, то уберите галочку с опции  Context Sensitive в правом верхнем углу контекстного меню.
  17. Перетащите пин  False, который относится к ветке (Branch) и  присоединяет узел IsDestructible?, и соедините пины Other и HitLocation.

    Выше мы добавили скрипт, который проверяет, моделирует ли объект, по которому мы бьем, необходимые физические характеристики. Если он не симулирует характеристики, мы вызываем нашу функцию IsDestructible? в нашем Blueprint-интерфейсе и применяем 1000 ущерб  и  100 силы к цели.
  18. Скомпилируем и сохраним, а затем закроем наш Blueprint.
  19. Перетащите  Blueprints SM_GlassWindow_DM и  Blueprint_CeilingLight в уровень, затем кликните Play, чтоб проиграть результат  в Редакторе. Если вы выстрелите в стекло, то оно покроется трещинами, а потом разлетится на куски.

    Если мы выстрелим в светильник первый раз, то его свет станет такого цвета, какой мы указали  в шаге 13.

    Если мы выстрелим в светильник второй раз, то он выключится. (также прописано в шаге 13).

    Это один пример использования Blueprint Interface для передачи переменных между Blueprint и вызова функций, запускающих разные скрипты в Blueprint, которые реализуют один и  тот же интерфейс.

Использование библиотеки макросов

В этом примере мы создадим библиотеку макросов, состоящую из двух макросов, один из которых используется, чтоб добавить переменную  «Health» , а другой, чтоб установить определенный размер актера (Actor).

Для этого примера мы используем Blueprint Third Person Project с включенным Starter Content.

  1. Правый клик на пустой области в Content Browser, затем в контекстном меню в Blueprints выбираем Blueprint Macro Library.
  2. В окне Pick Parent Class, которое появится, выбираем ваш Parent Class (Родительский класс)  (для этого примера выбираем Actor).
  3. Введите название вашей Библиотеки макросов, затем выполните двойной клик, чтоб открыть библиотеку.

    Это действие отобразит интерфейс Blueprint Macro.
  4. В окне MyBluprint в верхнем правом секторе переименуем дефолтный макрос в ScaleUp, нажав  F2 на нем.
  5. В панели  Details для макроса ScaleUp добавьте Inputs и Outputs, как показано ниже.

    Выше мы создали два входа, один из которых называется In и установлен  для типа Exec, а другой называется   InActor и  установлен  для типа Actor. Добавленный выход называется Out и он установлен для типа Exec. Мы будем использовать их для определения  актера, которого хотим затронуть этим макросом.
  6. В графе для макроса  ScaleUp, воссоздайте сеть узлов, показанную ниже.

    Выше, когда макро вызывается,он захватит любого представленного  Actor, как InActor и захватит текущий масштаб, который он умножит на 1.25 прежде чем установить, как новый масштаб  3D для Target (которая Actor, определенный как  InActor.) теперь мы можем использовать этот макро с любым Actor и повлиять на их масштаб, используя этот макро.
  7. Добавьте еще один макрос из окна MyBlueprint под названием AddHealth.
  8. В панели  Details для  AddHealth, добавьте  Inputs и Outputs, как показано ниже.

    Выше мы работали со значением value, которая называется GetHealth и которую мы добавим перед тем, как перетянем ее к выходному узлу SetHealth.
  9. В графе для макроса AddHealth, воссоздав сеть узлов, показанную ниже.

    Выше мы добавили 50 к любому значению переменной  float, которая передается, как переменная  GetHealth, перед тем как вывести переменную-результат к SetHealth.
  10. Сохраните и закройте Blueprint библиотеку макросов.
  11. Внутри папки  Content/ThirdPersonBP/Blueprints откройте  Blueprint ThirdPersonCharacter.
  12. В окне MyBlueprint добавьте переменную Float, которая будет представлять Health (мы оставили значение по умолчанию, равное 0).
  13. В событийном графе (Event Graph) воссоздайте сеть узлов, как показано ниже.

    Выше мы вызываем макрос AddHealth при каждом нажатии Q, в результате чего забирается переменная Health  (представляет собой скрипт макроса увеличения  этой переменной), которая  изменяется с помощью выходного пина SetHealth перед тем, как появится на экране. Затем, мы используем E, чтоб проверить  параметр Health больше 100 или нет и только потом  добавить макрос ScaleUp, вызванный на Actor Self, который представляет собой ThirdPersonCharacter.
  14. Компилируем и проигрываем результат в редакторе.

Чтоб лучше видеть текст, который печатается на экране, рекомендуется смотреть видео, представленное выше в полноэкранном формате.

В видео выше мы включили скрипт Blueprint из шага 13, так что мы можем видеть его в действии.  Когда мы нажимаем E в попытке вызвать макрос   ScaleUp, мы сначала проверяем значение  переменной Health, которое по умолчанию мы установили 0. Когда мы затем нажимаем Q, чтоб вызвать макрос   AddHealth, чтоб увеличить переменную   Health, каждый раз, когда мы нажимаем около   50. После нескольких нажатий, мы пробуем макрос ScaleUp опять, мы видим, что все получилось, потому что наше здоровье (Health)  теперь перевалило за 100.

Эти макросы можно вызвать из любого другого Blueprints, которые предоставляют инпуты для  Health, а Target Actor предоставляется.

Создание функций (Functions)

Функции – это узлы графа, принадлежащие определенному Blueprint, которые могут быть исполнены или вызваны из другого графа с помощью  Blueprint. Функции имеют единичную точку выхода, созданную узлом с названием Function, содержащим  главный выводной пин. Когда функция вызывается из другого графа,   главный выходной пин активируется, приводя в действие связанную с ним  сеть.

Шаги ниже покажут, как создать функцию, которая напечатает текст на экране, когда вы нажмете кнопку.

  1. Внутри Content Browser, кликните кнопку New, затем выберете Blueprint Class.
  2. В окне Pick Parent Class, выберете Actor.
  3. Назовите ваш Blueprint, затем дважды кликните на него, чтоб открыть в Blueprint Editor.
  4. Правый клик в графе, затем  найдите и добавьте событие Event Begin Play.

    Этот узел будет исполнен, когда вы запустите игру, вместе с любым скриптом, который за ним следует.
  5. Правый клик в графе, потом находим и добавляем узел Get Player Controller.

    Это действие приведет к захвату назначенного в данный момент контроллера игрока и позволит нам включить ввод для этого Blueprint.
  6. Правый клик в графе, после чего находим и добавляем узел Enable Input.

    Это тот узел, который позволит доставить ввод для этого Blueprint.
  7. Соедините узлы, как показано ниже.

    При запущенной игре, мы захватим контроллер игрока и включим входное значение из него внутри этого Blueprint.
  8. В окне  MyBlueprint кликаем кнопочку Add New Function.
  9. Выбираем новую функцию в окне My Blueprint и нажимаем F2, чтоб переименовать ее.

    Дайте функции имя типа «Print Text».
  10. В графе функции стаскиваем  пин Print Text, после чего находим и добавляем узел Print String.
  11. В боксе In String вы можете изменить текст, на тот, который хотите, чтоб отражался в игре.
  12. Кликните таб Event Graph, чтоб вернуться в Event Graph.
  13. Правый клик в графе, затем находим и добавляем Key Event F.
  14. Стаскиваем пин Pressed, а затем ищем и добавляем вашу функцию Print Text.

    Нажатие F вызовет функцию Print Text, которая нужна, чтоб напечатать текст на экране, используя Print String. Если вы не видите вашу функцию, попытайтесь кликнуть кнопку Compile в тулбаре, а потом поищите ее снова.
  15. Ваша сеть должна походить на представленную ниже.
  16. Кликаем кнопку Compile и закрываем Blueprint.
  17. Перетаскиваем Blueprint в уровень, а потом кликаем кнопку Play, чтоб проиграть созданное в редакторе.
  18. Нажмите F, в результате чего вызовется наша функция и напечатает текст на экране.

В этом примере функция только печатает текст на экране, когда вы нажимаете клавишу, но вы можете добавить функции, которая будет исполняться нажатием определенной клавиши, больше скрипта. Например, ваша функция может быть использована, чтоб наложить заклятие по нажатию клавиши. Кроме того, если ущерб наносится другому актеру, он может содержаться в функции, оставив ваш Event Graph свободным от всякого скрипта.

Создание макросов

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

Для этого примера мы используем Blueprint Third Person Project с включенным  Starter Content.

  1. Внутри папки Content/ThirdPersonBP/Blueprints открываем Blueprint ThirdPersonCharacter.
  2. В окне My Blueprint кликаем кнопку Add Macro.
  3. Создастся новый макрос.Выберете его и нажмите F2, чтоб переименовать его в EnergyCheck.
  4. С выделенным макросом в панели Details, кликните кнопки New, чтоб создать 1 Input и 2 Output’а.

    Таким образом создадутся узлы Input/Output на  узле макроса, который будет использован для передачи данных из/в макроc.
  5. Для Input в текстовом поле вводим имя BeginCheck и изменяем тип на Exec (исполняемый пин).
  6. Для Output’ов, меняем их типы на Exec и называем один HasEnergy, а другой — NoEnergy.

    Для Input мы будем использовать Exec-пин под названием BeginCheck для того, чтоб начать макрос. Мы создадим скрипт, который будет проверять, достаточно ли у игрока энергии для прыжка (и если да, то мы соединимся с пином HasEnergy). Если энергии недостаточно, то мы присоединимся к пину NoEnergy. Когда мы реализуем этот макрос, то HasEnergy будет отброшен в команду Jump, а пин NoEnergy останется не у дел.
  7. Внутри окна My Blueprint кликните кнопку Add Variable.
  8. Назовите эту переменную Energy, измените ее тип на Float, а затем кликните  Compile в тулбаре и сделайте ее значение равным 100.

    Теперь у нас две переменные для энергии игрока, которые инициализированы к 100.
  9. В графе рядом с Inputs, удержите клавишу B и проделайте левый клик, чтоб создать узел Branch.
  10. Удерживая Ctrl, перетащите Energy из окна My Blueprint в граф и соедините с узлом   > , а затем и с Branch.

    Здесь мы используем Branch, чтоб определить, если энергия  > 0, и если так,  то True исполняется; если нет, то исполняется False.
  11. Удерживая Alt, перетащите переменную Energy, чтоб добавить узел  Set.
  12. Ctrl-перетаскиваем в Energy опять и соединяем с узлом  — , устанавливаем значение  10 и втыкаем в узел Set.

    С помощью этого скрипта мы говорим, что если Energy > 0, то нужно вычесть 10 из текущего значения Energy.
  13. Правый клик в графе и добавляем узел Print String, а затем соединяем Energy и пин In String.

    Добавится узел Conversion, который будет конвертировать значение в поток, который будет печататься на экране, отображая значение.
  14. Уберите пин False, принадлежащий Branch, добавьте  Print String и ведите текст Out of Energy! (Не хватает энергии!) в поле.
  15. Соедините оба узла  Print String с пинами HasEnergy и NoEnergy.

    Макрос теперь настроен для проверки переменной Energy и выдается, если нужно по уровню энергии определить может игрок прыгать или нет. Теперь нам нужно осуществить  макрос после нажатия клавиши «Jump», перед тем как выполнится команда прыгать.
  16. На EventGraph, уберите пин Pressed с узла  InputAction Jump и найдите EnergyCheck.

    Вы должны увидеть созданный макрос в Utilities и имеет иконку макроса напротив названия.
  17. После добавления макроса, скрипт Jump будет выглядеть, как показанный ниже.
  18. Кликаем кнопки Compile и Save, а затем закрываем Blueprint.
  19. Кликаем кнопку Play в Main Toolbar, чтоб проиграть результат  в Редакторе.

Когда мы нажимаем «пробел», чтоб прыгнуть в верхнем  левом углу экрана значение переменной Energy напечатается на экране. Если уровень энергии будет равен   0, вы больше не сможете прыгать.

Это базовый пример использования макроса для исполнения скрипта и его консолидации в единичный узел, улучшая ридабилити нашего Event Graph и скрипта главного персонажа. Кроме того вы можете  использовать этот макрос для других целей – скажем, для установки других условий уменьшения энергии игрока. Вы можете задействовать этот макрос для проверки того имеет ли игрок достаточно энергии для атаки  после нажатии клавиши, отвечающей за атаку, а затем извлекать атаку из exec-пина  HasEnergy.

Установка и получение отсылок к Actor

Установив базу для Actor, вы сможете получить доступ к его свойствам (Properties), переменным  (Variables),событиям (Events) и функциям  (Functions) (если применяются) во время геймплея через Blueprints или  C++ и применить их для нужд своего геймплея. Скажем, например, вы хотите, чтоб свет загорался, когда ваш герой входит в Trigger Box, то отсылки к «свету» и Trigger Box позволят вам сделать это, привязав  light Actor к  событию OnComponentBeginOverlap, который относится к Trigger Box (в случае которого вы могли бы включить свет).

Установка правильных ссылок на актера  (Actor) также важна для того, чтоб  актеры могли нормально взаимодействовать. Если же  вы ссылаетесь неправильно, что приведет  к неверному взаимодействию и удручающим результатам. Проделайте шаги, приведенные ниже, чтоб получить пример настройки и получения ссылки на актера.

В этом примере мы используем новый шаблон Blueprint Third Person с включенным Starter Content.

  1. Из меню  Modes, которое находится в Basic, перетащите Box Trigger в ваш уровень.

    Мы собираемся использовать это, чтоб спровоцировать движение в другом актере уровня.
  2. В панели  Details для  Box Trigger, выбираем опцию  Convert to Class Blueprint.

    Мы собираемся создать Blueprint из этого  Actor и присвоить ему переменную, которая будет содержать ссылку на Actor.
  3. Дайте вашему Blueprint имя, а потом выберете Create Blueprint (откроется Blueprint Editor).
  4. В Blueprint Editor раскрываем  My Blueprint и кликаем кнопку Add Variable.
  5. Кликаем на переменную. Затем в панели Details, кликаем кнопку   Variable Type, и выбираем   Actor в развернутом меню Object Reference.

    Здесь мы определяем, что ссылаемся мы на тип  Actor и это Object (объект) в нашем уровне.
  6. Назовите переменную TargetActor и поставьте галочку в чекбоксе Editable.

    Это указывает, что переменная установлена для Public, благодаря чему мы можем получить доступ и установить ее за пределами этого   Blueprint через панель Details в окне Main Editor. Это может быть полезно, если вам нужно  модифицировать переменную без необходимости идти в Blueprint для ее модификации.
  7. В тексте, который появится в качестве  подсказки (Tooltip), вы можете указать, что делает вариация, или для чего она предназначена.

    Здесь мы ввели текст «The Actor to Target».
  8. Кликаем кнопку  Compile в верхней левой области окна   Blueprint Editor.

    После завершения вы увидите зеленую галочку.
  9. Минимизируйте Blueprint и вернитесь к окну Main Editor. Затем выберете  Box Trigger Blueprint в вашем уровне.
  10. В панели  Details для окна, вы должны увидеть в Default переменную Target Actor и подсказку.
  11. Из Content Browser, в Content/StarterContent/Shapes добавьте три куба (Shape_Cubes) в уровень.

    Если вы используете ваш собственный проект, вы можете добавить любого актера (Actor), Static Mesh или Blueprint в уровень вместо наших кубов.
  12. Чтобы вы не добавили в уровень, в Details для каждого Actor, установите значение мобильности «Moveable».

    Это позволит нам передвигать их с помощью скрипта Blueprint.
  13. Кликаем на Blueprint Box Trigger  в уровне.
  14. В панели  Details, кликаем бокс  None  в Target Actor и ищем Shape (или имя добавленного актера).

    Когда мы кликаем None, отображаются все  актеры, которые сейчас существуют в уровне, но мы собираемся нацелиться на один из добавленных кубов.
  15. Кликаем на иконку «пипетка», которая находится радом с иконкой «лупа».

    Это позволит нам выбрать актера  из вашего уровня в качестве целевого актера (Target Actor), кликнув на него в обзорном окне.
  16. Перенесите иконку «пипетка» и расположите ее над одним из ваших кубов (или любом выбранном ассете) и кликните, чтоб получить Target Actor.
  17. Когда вы выберете актера, переменная Target Actor обновится внутри выбранного актера в панели Details.

    Теперь у нас есть установленная ссылка на актера, который станет нашим Target Actor.
  18. Откройте Blueprint Box Trigger, затем в окне MyBlueprint, кликните на иконку «глаз» и задействуйте Show Inherited Variables.

    Это позволит нам добавлять события для компонентов (Components), которые были унаследованы, когда мы впервые конвертировали  Trigger Box в Class Blueprint.
  19. Развернем Trigger Base, выполним правый клик на  CollisionComponent и выберем  Add Event, а затем Add OnComponentBeginOverlap.

    Это действие создаст новый Event-узел на  графе.
  20. Держим Control и перетаскиваем переменную TargetActor в граф.

    Это создаст узел Get, который  привнесет любое значение переменной в Actor, который находится в вашем уровне.
  21. Вытащите узел  TargetActor, найдите и добавьте узел  Add Actor Local Offset.

    Это поможет нам добавить к текущей  целевой трансформации (позволяет нам изменить текущее расположение).
  22. Соедините узлы, как показано на рисунке, и измените  значение Z на узле  Add Actor Local Offset на  500.0.

    Это действие захватит текущее расположение цели и передвинет ее на 500 по оси Z, в том случае если перекрывается пусковая площадка. В окне  Components кликаем  TriggerBox_Blueprint, чтоб выделить его. Если вы не видите окно  Components, вы можете включить его в меню опций Window.
  23. В панели Details для Trigger Box разворачиваем Rendering и убираем галочку с опции Actor Hidden In Game.

    Это действие сделает trigger box видимым в игре, чтоб вы могли видеть, где именно актер туда входит.
  24. В панели Details для Trigger Box после рендеринга снимите флажок Actor Hidden In Game
  25. Кликаем Compile и Save, затем закрываем Blueprint.
  26. В окне Main Editor кликаем иконку Play в редакторе.

When you enter the Trigger Box, your selected Actor should move up by 500 units. Each time you enter the Trigger Box, the box will move up by another 500 units. By establishing a reference, the variable knows which Actor to affect in the Trigger Box script. Try affecting a different Actor in the level using this script.

  • From the Main Editor window, inside the Level Viewport click the Box Trigger Blueprint.
  • In the Details panel for the Box Trigger, click the eye dropper icon next to Target Actor.
  • In the level viewport, click a different Actor than the one you used before.
  • Play in the editor again.

This time the new Actor selected should move up along the Z axis by 500 units each time you enter the Trigger Box. By using the Target Actor variable in our Box Trigger script, we are not locked into a specific Actor associated with the script and can modify it and change the Actor it affects without having to modify the Blueprint itself.

While this example illustrates how to move different objects around, instead of moving an object you could use this method to open doors when the player presses a button, turn on/off different lights, spawn items for the player to pick up or destroy or any number of other possibilities.

This is also one of multiple ways you can get reference to an Actor, for example if you wanted to get Reference to the Player Character which cannot be explicitly set via the Main Editor window, you would take a different approach (see the Related Links section below).

Создание Blueprint Classes (классов)

Создание классов помощью  Content Browser

Blueprints хранятся в модулях, и могут быть созданы через Content Browser, как и любой другой ассет.

  1. В Content Browser, кликните на
  2. Выберете  Blueprint в секции Create Basic Asset из появившегося меню. Дополнительные типы Blueprints могут быть созданы с помощью опции Blueprints в Create Advanced Asset.
  3. Выберете Parent Class (Родительский класс) для вашего Blueprint.

Создание правым кликом

Есть еще два метода, которые помогут вам создать Blueprint из Content Browser.

  1. Правый клик  в  Asset View (панель по правую руку) в Content Browser.
  2. Выберете Blueprint в секции Create Basic Asset из появившегося меню.
  3. Выберете  Parent Class для вашего Blueprint.
    Альтернатива:
  4. Правый клик на папку в Древе ассетов (Asset Tree) (панель по правую руку) в Content Browser.
  5. В меню, которое появится, двигаем мышь над Create Asset, а затем выбираем Blueprint.
  6. Выбираем Parent Class для вашего  Blueprint.

Расположение узлов

На этой странице вы научитесь располагать узлы на графе в Blueprints.

Drag-and-Drop (Перетаскивание)

Первый метод использует Drag-and-drop – процедуру, которая заключается в перетаскивании узлов из окна MyBlueprint в ваш граф. Например, ниже у нас несколько переменных, где мы перетаскиваем переменную внутрь и оставляем внутри графа, чтоб мы могли использовать ее в нашем графе.

Зажимаем левую кнопку мыши и перетаскиваем переменную в окно графа (Graph window) и встречаемся с двумя опциями: Get и Set. Если мы выберем,  Get создастся узел  Getter, который примет переменную или значение, в то время как  узел Setter позволит вам установить значение переменной. В зависимости от типа узла, могут быть случаи, когда будет доступна только опция Get.

На картинке выше узел, который находится на верхушке, — это Getter, в то время как нижний узел – это Setter. Getter, например, можно использовать, как условие для элементов вашей игры. С другой стороны Setter, используя предыдущий  пример, можно использовать для наращивания Player’s Health (здоровья игрока), так как вы говорите, что значение  переменной  Player Health должно устанавливаться посредством значения  этой опции.

Таким же образом  можно перетащить любые  созданные ранее в вашем графе Functions (Функции) или Macros (Макросы).

Также  существуют контекстные действия, которые становятся доступны, когда мы перетаскиваем в Event Dispatcher, как проиллюстрировано ниже.

Вы можете выбрать необходимое действие из контекстного меню, которое появляется, при перетаскивании в Event Dispatcher.

Поиск по контекстному меню

Как правило, располагая  узлы, вы используете Context Menu, которое можно вызвать, выполнив правый клик внутри графа Blueprint.

Воспользовавшись меню сверху, вы можете расширить любую категорию (или подкатегорию) и выбрать узел, который желаете добавить в граф.

Также в правом верхнем углу окна есть опция  под названием Context Sensitive, которая активно по умолчанию, но может быть отключена, и она автоматически фильтрует опции, представленные в меню в текущем контексте.

Как вы можете видеть ниже, когда мы, выполнив правый клик,  ищем Animation с включенным  Context Sensitive, нам выдается отфильтрованный список.

Как бы то ни было, если вы отключите Context Sensitive, и будете искать в Animation теперь, вы увидите абсолютно все, что хоть как-то связано с анимацией.

Итак, правый клик в графе включает Context Menu,но вы также  можете оттащить существующий узел, чтоб опять же вызвать Context Menu.

Выше мы сослались на компонент  Character Movement и, перетаскивая с него пин, мы можем добавить узлы, которые имеют смысл в данном контексте и релевантны  узлу, который мы стаскиваем, как видно в примере ниже.

Выше мы можем указать значение максимальной скорости персонажа (Max Walk Speed), включив поиск по Set Max Walk, а затем выбрав   Set Max Walk Speed из меню.

Горячие клавиши

Вы также можете использовать горячие клавиши (Keyboard Shortcuts) для более продуктивной работы с узлами.

Складываем графы

На этой странице мы опишем несколько способов того, как схлопнуть ваши Blueprint графы до простого узла в функции (Function) или в  макросе (Macro), что поможет вам сделать крупные графы более компактными.

Схлопывание узлов

Самый простой метод схлопывания проиллюстрирован ниже, и он заключается в схлопывание узлов внутри графа. Прежде всего, он используется для лучшей организации и придания вашему событийному графу (Event Graph) более аккуратного вида.

  1. На  графе (Graph) вашего  Blueprint найдите узел, который хотите схлопнуть.

    Здесь показаны узлы, которые уменьшаю энергию игрока после прыжка.
  2. Выберете все узлы, которые хотите схлопнуть, выполнив клик левой клавишей и протащив курсор над узлами.

    Вы также можете использовать Control + Левый клик, чтоб добавить узел к выбранной области.
  3. Теперь выполните правый клик над любым узлом, который относится к выбранной области, и выберете Collapse Nodes.
  4. Узлы схлопнутся в единичный узел, под названием Collapsed Graph, которому в дальнейшем можно будет присвоить другое имя.
  5. Если вы проведете мышкой над узлом Collapsed Graph, вы увидите окно привью с сетью узлов.
  6. Двойной клик на Collapsed Graph откроет новый граф с выбранными узлами.
  7. Внутри  Collapsed Graph вы можете добавить пины в узлах Inputs или Outputs из панели Details. Execute (исполнение) добавляется по умолчанию при схлопывании, здесь мы добавили два исполняющих выводящих пина: OutOfEnergy и CanJump.

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

    И наш событийный граф (Event Graph) со сложенными и узлами будет выглядеть как-то так:
  8. Выполнив правый клик по узлу, который схлопнут, вы можете выбрать  Expand Node, если хотите вернуть узлы к первоначальному состоянию.

Схлопывание до функции

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

Ниже перечислены шаги, которые нужно проделать, чтоб схлопнуть ваши узлы до функции.

  1. Выделите узлы, которые хотите схлопнуть, исполните правый клик на узле и выберете Collapse to Function.
  2. Создастся новая функция  (Function), которую можно переименовать из окна   MyBlueprint, нажав   F2 в нем.

    При компилировании Blueprint выскочит сообщение-предупреждение. Здесь вы можете переименовать вашу функцию.
  3. Двойной клик на Function откроет новое окно графа.

    Также как и в случае Collapsed Graphs, вы можете кликать на узлы Inputs и Outputs  и посредством панели Details добавлять к ним пины.
  4. Вы можете вызвать функцию, используя ее имя или задать для вызова любое другое условие.

    Здесь мы вызываем функцию Remove Energy каждый раз, когда нажимаем F.
  5. Вы можете пустить схлопывание вспять, выполнив правый клик на Function и выбрав опцию Expand Node.

Схлопывание до макроса (Macro)

Вы также можете использовать схлопывание узлов до макросов (Macro). Этот способ позволяет вам взять несколько связанных узлов и слить их в один. Он прекрасно подходит для всего того, что вы делаете часто, типа сложных математических расчетов.

Чтоб схлопнуть узлы в макрос:

  1. Выделите узлы, которые хотите схлопнуть, выполните правый клик на узле и выберете Collapse to Macro.
  2. Создастся новый Macro-узел, и вы сможете переименовать его с помощью окна  MyBlueprint, нажав F2 в нем.
  3. Вы можете открыть макрос , дважды кликнув на нем.

    Здесь вы также сможете добавить пины  Input и  Output. Вот наш  Event-граф, который внедряет макрос с дополнительными пинами.
  4. Выполнив двойной клик на вашем макросе, вы сможете выбрать Expand Node, чтоб откатить назад схлопывание узлов.

Источник