Для передвижения персонажа в указанную точку с использованием его Movement Component существует метод SimpleMoveToLocation. Он работает отлично, но есть одна проблема: как определить момент, когда передвижение завершилось? По умолчанию такая логика отсутствует, а предложения из интернета, вроде проверки дистанции до точки на каждом тике, выглядят, как минимум, как костыль.
Посмотрев, что происходит внутри метода SimpleMoveToLocation, я обнаружил несколько интересных вещей:
1) Этот метод добавляет компонент UPathFollowingComponent, который отвечает за перемещение персонажа по NavMesh.
2) Компонент имеет делегаты, которые срабатывают по окончании движения.
3) Большинство методов и делегатов этого компонента не работают с Blueprint (блупринтами).
Именно третий пункт мешает нам реализовать оповещение для блупринтов.
Давайте взглянем на метод UPathFollowingComponent::OnPathFinished
Предлагаю сделать наследника от UPathFollowingComponent и переопределить метод OnPathFinished, вызвав там собственный делегат после выполнения родительской логики.
Теперь добавляем этот компонент на Controller. Также либо подписываемся на делегат, либо вызываем его как Ивент компонента.
При вызове SimpleMoveToLocation метод сразу найдет UPathFollowingComponent, который мы добавили, выполнит всё необходимое и оповестит нас о завершении передвижения.