В связи практически с полным отсутствием уроков и доков по данному вопросу, решил поделиться тем до чего дошёл сам.
Видео уроки на нашем сайте и в ютюбе давно устарели либо вообще как показала практика не совсем верны.
Все ниже изложенное актуально для версии 4.11
Сделал урок в текстово-графическом виде так как считаю видео менее информативным и удобным.
С помощью приведённых ниже методов вы сможете передавать переменные из одного BP в другой. А также вызывать функции в другом блюпринте.
Рассматриваемые способы коммуникации это: прямое общение блюпринтов(Direct Blueprint Communications), интерфейсы блюпринтов(Blueprint Interface).
1. Вызов функции и передача переменной из одного блюпринта в другой.Самый на мой взгляд простой и удобный способ.
1.1Используем функцию Get All Actors Of Class, указываем в ней целевой блюпринт (у меня BP2) и вуаля - вызываем функцию ChangeZ из другого блюпринта. Напрямую передать или задать переменную таким способом у меня не получилось, но ведь ни кто не мешает передать данные как аргумент функции.(в функции ChangeZ аргумент Position).
Следует обратить внимание на то что данный способ обращается сразу ко всем объектам имеющий данный блюпринт. Если необходимо обратится лишь к одному экземпляру используем данный способ. Указываем в индексе номер нужного нам объекта.1.2Это несколько иной способ который именуется разработчиками как Direct Blueprint Communications. Мы всё также вызываем функцию из второго блюпринта и целью(target) в ней указываем переменную тип у которой указан типом целевого блюпринта.
Т.е. нужно создать в нашем блюпринте BP 1 переменную и указать ей тип второго блюпринта BP 2 и эту переменную мы и цепляем к target.
Не забываем сделать её Public(открыть напротив переменной глаз).
Но это к сожалению ещё не всё что нужно сделать. Переменную нужного типа мы создали, но она просто унаследовала тип и не получила ссылку на конкретный экземпляр класса. Чтобы это реализовать переходим в основное окно редактора, выбираем наш блюпринт в котором создали переменную и в закладке Details - Defoult видим нашу переменную. Нажимаем пипетку справа и указываем на сцене нужный нам объект со вторым, целевым блюпринтом. Можно просто воспользоваться выпадающим списком.
Этим способом можно напрямую задавать значение переменной в целевом блюпринте.
Здесь мы задаём переменную Var Text dj втором блюпринте и в нём же вызываем функцию печати с аргументом.
Использование интерфейсов для таких простых задач наверное избыточно, по этому я решил не использовать их.
2. Общение между виджетом UMG и блипринтом(двухстороннее). Цитата:
Частный вариант способа описанного выше для виджетов.
Если нужно отправить получить данные виджету в том же блюпринте где он создаётся гораздо удобнее использовать такой способ, работает и в левел блюпринте и в своих тоже.
т.е. вытягиваем связь из create widget и получаем доступ к любым переменным и функциям виджета.
Более замороченный вариант(но тоже имет право на жизнь).
Тут немного менее удобно.
Сначала рассмотрим обращение со стороны виджета.
Полностью работает вариант 1.1 изложенный выше.
В моём виджете есть Slider по изменению которого вызывается событие. Тут мы тоже вызываем функцию и передаём ей значение переменной.
Вариант 1.2 заставить работать мне не удалось так как я не смог указать конкретный экземпляр блюпринта(то что мы делали с пипеткой и списком в основном окне редактора). Связано это с тем что виджет не находится на сцене и соответственно в панели World Outliner поэтому нельзя прямым способом указать на конкретный экземпляр бп.
Я обратил внимание на "двухстороннее" так как отправить переменную или вызвать функцию виджета из блюпринта предложенными выше способами не получилось ни как. И обратная связь от блюпринта к виджету реализована с помощью интерфейсов(Blueprint Interface).
Соответственно нужно создать блюпринт интерфейса с входными и выходными переменными(могут быть только одни).
И указать его в Class settings виджета и блюпринта.
Далее получаем все виджеты использующие интересующий нас интерфейс. Нужно его указать в Get All Widgets with interface. У меня интерфейс называется Bp Com.
Обратите внимание что нужно использовать внешний вариант вызова интерфейса, он помечен конвертиком.
Использовать Get All Widgets Of Class не получилось т.к. найденные виджеты не удалось указать как target при вызове функции.
И завершающим этапом нужно обработать вызов интерфейса, это очень просто!
Для этого просто кликните в бп UMG на функцию вашего интерфейса.
Тело этой функции и будет выполнятся при Interface Call. У меня это просто печать строки.
Вот пожалуй и всё.
Проект качаем кому интересно здесь -
https://cloud.mail.ru/public/KXay/8KpVmeuUd Чего то я там начудил при попытках уменьшить размер, так что после запуска открываем карту direct_bp_communication ручками(дабл клик :))
Очень бы хотелось реализовать те варианты которые у меня не получились или просто прояснить с ними ситуацию.
Get All Widgets Of Class - не получается использовать найденные виджеты как target, хотя этот же способ отлично работает с блюпринтами типа actor. Из за чего приходится прибегать к использованию интерфейсов.
P.S. Не пинайте сильно изучаю UE4 около 2х месяцев да и то только в свободное от работы время.
_________________
Project SKITПоследний раз редактировалось
icms 22 май 2016, 13:37, всего редактировалось 5 раз(а).