- Главная
- Форум
- Вопросы
- Общие вопросы по Unreal Engine
- Чем отличаются Get Controller и Get Player Controller в Unreal Engine
Чем отличаются Get Controller и Get Player Controller в Unreal Engine
Чем отличаются Get Controller и Get Player Controller в Unreal Engine
RE: Чем отличаются Get Controller и Get Player Controller в Unreal Engine
В Unreal Engine выбор между узлами Get Controller и Get Player Controller зависит от того, кто выполняет логику и чей контроллер необходимо получить. Несмотря на схожие названия, эти узлы решают разные задачи и работают по-разному.
Get Controller — это функция класса Pawn (и, соответственно, Character). Она возвращает контроллер, который в данный момент управляет текущим Pawn. Такой контроллер имеет базовый тип Controller, поэтому это может быть как Player Controller, если персонажем управляет игрок, так и AI Controller, если им управляет искусственный интеллект. Если требуется получить доступ к функциям конкретного типа контроллера, после вызова обычно выполняют Cast к Player Controller или AI Controller.
Обычно Get Controller используется непосредственно внутри Blueprint персонажа. В этом случае функция автоматически работает с объектом Self и отвечает на простой вопрос: «Кто сейчас управляет этим персонажем?» Например, если после устранения необходимо остановить движение персонажа, совершенно не важно, управляет им игрок или искусственный интеллект — достаточно вызвать Get Controller, а затем выполнить остановку движения.
Get Player Controller, напротив, не связан ни с одним конкретным персонажем. Это глобальная функция из библиотеки Gameplay Statics, которая возвращает Player Controller игрока по его индексу. По умолчанию используется индекс 0, то есть первый локальный игрок. В отличие от Get Controller, этот узел никогда не вернёт AI Controller, даже если на уровне находятся десятки ботов.
Поскольку Get Player Controller не зависит от какого-либо Pawn, его можно использовать практически в любом Blueprint: в Level Blueprint, Widget Blueprint, различных Акторах, компонентах, Game Mode, Game Instance и других классах. По сути, этот узел отвечает на вопрос: «Дай мне контроллер игрока с указанным индексом».
Наиболее часто Get Player Controller применяется при работе с пользовательским интерфейсом. Через него открывают меню, отображают курсор мыши, изменяют режим ввода, управляют камерой, запускают вибрацию геймпада и выполняют другие действия, относящиеся именно к игроку, а не к персонажу.
Главное различие между этими двумя узлами заключается в том, что Get Controller возвращает контроллер конкретного Pawn, то есть, конкретного управляемого персонажа, тогда как Get Player Controller возвращает контроллер локального игрока независимо от того, каким персонажем он управляет.
Это особенно хорошо заметно при смене персонажа через механизм Possess. Предположим, игрок пересаживается из одного персонажа в другого. Сам объект Player Controller при этом не меняется — меняется только Pawn, которым он управляет. После переключения Get Player Controller (0) по-прежнему вернёт тот же самый Player Controller, тогда как Get Controller у старого персонажа может вернуть None, потому что им больше никто не управляет. У нового персонажа, наоборот, Get Controller уже будет ссылаться на этот Player Controller.
При работе с NPC также следует использовать Get Controller. После получения результата обычно выполняют Cast to AI Controller, чтобы получить доступ к функциям управления поведением бота. Благодаря этому один и тот же Blueprint персонажа может одинаково корректно работать как для игроков, так и для искусственного интеллекта.
В многопользовательских проектах различие становится ещё важнее. Get Controller возвращает контроллер, который владеет данным Pawn на текущей машине — сервере или клиенте. Get Player Controller, в свою очередь, работает только с локальным игроком. Индекс 0 всегда означает первого локального игрока на той машине, где выполняется код, поэтому использовать этот узел для поиска контроллеров других игроков по сети нельзя. Для этого обычно работают со ссылками на Player Controller, Player State или Pawn, которые уже известны игровой логике.
Также при использовании Get Controller рекомендуется всегда проверять результат через Is Valid. В некоторых ситуациях персонаж может временно не иметь контроллера. Например, если он ещё не был захвачен (Possess), уже освобождён (UnPossess), происходит смена персонажа или объект уничтожается. В таких случаях функция вернёт None, а попытка обратиться к его функциям приведёт к ошибке.
Подводя итог, можно запомнить простое правило. Если необходимо узнать, кто управляет конкретным персонажем, следует использовать Get Controller. Если же нужен контроллер игрока, независимо от того, каким персонажем он сейчас управляет, следует использовать Get Player Controller.
Также более подробно изучить класс Player Controller Вы можете в статье: Player Controller в Unreal Engine
===============
Зарегистрироваться в ЛК и скачать книгу по Blueprint: [Blueprint. Взгляд с высоты «птичьего полёта»]
