Полезное

Мы Вконтакте

Discord канал

#
12
След.
Модератор: icms
Аватара пользователя
Пользователь
Сообщения: 78
Если я правильно понял. Я создал интерфейс с функциями Active Interface, в нем у меня функция DropItem с инпутом на Actor. В своем виджете худа я создал EventConstruct (он делает CastToMyCharacter на переменную MyCharacter), а так же создал событие, при нажатии кнопки DropButton, на DropAction. В Blueprint Probs я вызвал ActiveInterface, где есть функция DropAction, и следовательно в нее записало событие при нажатии кнопки DropButton. И теперь в любом брупринте, когда мне надо вызвать ивент DropAction, я вызываю ActiveInterface через Blueprint Probs, и затем я могу уже вызывать Event DropAction.

Правда я еще не совсем допер что делают те или иные функции :) Вроде в общее представление есть, но что в точности происходит не совсем ))

Про наследование классов и т.п. я знаю в общих чертах, когда-то пытался изучать С++ :)

Тяжеловато конечно, вроде логику понимаю, но не хватает точных знаний, что делает каждая функция, и с английским не дружу )) но пытаюсь подружиться )
Аватара пользователя
Пользователь
Сообщения: 40
Цитата:
Я создал интерфейс с функциями Active Interface, в нем у меня функция DropItem с инпутом на Actor

Верно.

Цитата:
В своем виджете худа я создал EventConstruct (он делает CastToMyCharacter на переменную MyCharacter), а так же создал событие, при нажатии кнопки DropButton, на DropAction

В виджете вы создали обработчик события EventConstruct, который вызывается при создании вашего виджета в процессе игры. Судя по вашему описанию вы воспользовались наследованием, а именно взяли некоторого предка Character и зная, что передавали MyCharacter, "кастанули" одно в другое. Вы можете "кастануть" родителя в наследника, при условии, что передавали в функцию именно наследника.

Объясню суть механизма. Допустим у вас есть Блупринт Engine от которого вы создали еще два блупринта JetEngine и IonEngine.
Теперь вы берете некоторый блупринт SpaceShip и хотите в нем вызвать функцию "GetPower" для вашего двигателя. Проблема в том, что разные двигатели работают по разному и вы не знаете какой из них будет у игрока в момент игры.
Можно создать две функции "GetIonPower" и "GetJetPower" каждая из которых получает в инпуты свой блупринт двигателя.
Но если у вас есть какой-то общий код для двух двигателей, то вы можете в дальнейшем забыть в какой-то из функций его поменять.
А если у вас появится еще 10 видов двигателей, то прийдется создавать еще 10 функций и опять копировать и поддерживать общий код?

Тогда мы идем другим путем. Мы передаем в "GetPower" не конкретный двигатель, а их общего предка "Engine". А теперь в самой функции мы можем вызвать CastToJetEngine и если он прошел успешно (что означает, что на инпут подавался JetEngine), то выполнить функцию для реактивного двигателя, а если нет, то вызвать CastToIonEngine и так далее, пока не получим конкретный экземпляр. А после всего выполнить общий для всех двигателей код.

Таким образом вы передаете ссылку на предка, а в процессе выполнения определяете конкретного переданного потомка. Этот механизм используется повсеместно. Например GetGameMode возвращает ссылку на общего всех гейм-модов предка, хотя вы знаете, что указывали в настройках MyGameMode. Вам просто нужно кастануть полученную ссылку на свой MyGameMode и пользоваться определенными вами функциями.

Однако если вы передали в функцию именно Engine, то никогда не сможете получить из него другой двигатель. Тяжело подобрать аналогию из реального мира. Допустим у вас есть окошко в библиотеке, куда пролезает только книга. Приходит курьер, который доставляет книги авторам этих книг. Вы проталкиваете книгу Азимова, он получает ее через окошко (потому что "книга Азимова" это наследник "книги" и может пролезть в окошко) и доставляет автору. А тут вы проталкиваете книгу без автора. Это тоже книга, она пролезает в окошко, но курьер не понимает куда ее нести, потому что нет автора, это книга родитель, а не наследник.
Можно было бы сделать окошки под каждого автора и там поставить своего курьера, но вы понимаете, что это куда затратнее, особенно если требуется добавить окошко под нового автора.

Цитата:
В Blueprint Probs я вызвал ActiveInterface

В Blueprint Props вы указали, что ваш блупринт реализует интерфейс ActiveInterface. Теперь после компиляции блупринта у вас появлятся функции интерфейса, которые можно реализовать.
Как я говорил, если у функции нет возвращаемого результата, то это по сути событие (Кто-то вызывает функцию, но его не интересует результат. Это как письмо из налоговой. Вам отправили, а дошло оно или нет им пофигу, т.е. вас о чем-то уведомили, для вас это событие).
Теперь можно описать обработчик события DropAction. После того как кто-то попытается на вашем блупринте вызвать событие DropAction интерфейса ActiveInterface, то запустится тот самый обработчик.
Аватара пользователя
Пользователь
Сообщения: 78
спасибо за развернутый ответ! половину понял, половину нет. Но это я уже запарился просто :) надо отдохнуть и все дойдет :)


Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

UEngine.ru © 2017
Все права защищены. При копировании материалов с сайта, ссылка на первоисточник обязательна.
Яндекс.Метрика
Главная страница