Цитата:
Я создал интерфейс с функциями 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, то запустится тот самый обработчик.