Что это: Компонент подходит для FPS/TPS-прототипов, где нужна физическая реакция и предсказуемое управление без сложной зависимости от внешних систем.
Как использовать: см. разделы ниже.
PlayerController3DPhysics — контроллер персонажа для 3D через Rigidbody: движение, бег, прыжок, mouse-look и базовая работа с курсором.
Компонент подходит для FPS/TPS-прототипов, где нужна физическая реакция и предсказуемое управление без сложной зависимости от внешних систем.
- Перемещает игрока по осям
Horizontal/Vertical. - Поддерживает бег (
LeftShift) и прыжок (Jump). - Проверяет землю через
CheckSphere. - Управляет обзором:
pitchограниченно вращаетcameraPivot;yawможет вращать:- только персонажа,
- только
cameraPivot, - и персонажа, и
cameraPivot.
- Поддерживает режимы направления движения:
- от поворота персонажа,
- от yaw камеры,
- по мировым осям (стратегический/RTS стиль).
- Есть смещение угла движения (
_movementYawOffset) для тонкой настройки направлений WASD. - Может блокировать курсор на старте.
- Pause Look When Cursor Visible (по умолчанию включено): при видимом курсоре (
Cursor.visible == true) не обрабатывает ввод мыши и не вращает камеру. Удобно для паузы/меню без связи сCursorLockController. - Если на том же объекте активен
CursorLockController, встроенные_lockCursorOnStartи_toggleCursorOnEscapeавтоматически не используются, чтобы не было двойного управления курсором. - Опционально Use Game Settings Mouse Sensitivity (по умолчанию вкл.): чувствительность из
GameSettings.MouseSensitivityс обновлением по событиюGameSettings.OnSettingsChanged(модуль Neo.Settings, сервисGameSettingsComponentв сцене). Иначе используется только поле Mouse Sensitivity в инспекторе. - Можно назначить External Cursor Lock Controller: тогда контроллер игрока будет уважать
CursorLockController, который находится не на игроке, а, например, на странице меню/паузы или на общем UI-root. - Внешний
CursorLockControllerможет работать как в automatic-, так и в manual-сценариях. Рекомендуемый дефолтный режим для него — AutomaticAndManual. - В
CursorLockControllerможно опционально включить отдельныйCursor Access Key(напримерZ) для быстрого показа курсора в hold- или toggle-режиме, если игроку нужен временный доступ к UI без открытия отдельного меню. По умолчанию этот режим выключен.
- Создайте объект
Player:CapsuleColliderRigidbody(Freeze Rotationпо X/Y/Z можно оставить выключенным, скрипт сам фиксирует вращение)
- Добавьте
PlayerController3DPhysics. - В поле
_cameraPivotукажите камеру (или pivot камеры как дочерний объект игрока). - Создайте дочерний
GroundCheckу ног игрока и назначьте в_groundCheck. - Настройте
_groundMaskна слои земли. - Убедитесь, что в Input Manager есть оси:
HorizontalVerticalMouse XMouse YJump
_inputBackend— выбор системы ввода:AutoPreferNew(по умолчанию): New Input System, если пакет доступен; иначе fallback на Legacy;NewInputSystem;LegacyInputManager.
_movementReference— режим базиса движения._movementYawOffset— сдвиг направления движения (в градусах)._walkSpeed,_runSpeed— базовые скорости._movementEnabled— стартовое состояние обработки движения и буфера прыжка (в инспекторе; в рантайме —SetMovementEnabled)._canJump— стартовое «можно прыгать» (в инспекторе; в рантайме —SetJumpEnabled). Пока движение выключено (SetMovementEnabled(false)), прыжок по вводу не буферизуется._groundAcceleration,_airAcceleration— отзывчивость на земле/в воздухе._jumpImpulse— сила прыжка._coyoteTime,_jumpBufferTime— устойчивый прыжок в динамике._extraGravityMultiplier— ускоренное падение._lookYawMode— как применять горизонтальный поворот._minPitch,_maxPitch— лимиты вертикального взгляда._lockCursorOnStart— блокировка курсора при запуске._toggleCursorOnEscape— локальный toggle по Escape. Используйте его, только если нетCursorLockControllerна том же объекте._externalCursorLockController— внешнийCursorLockController. Нужен, если курсором управляет не сам игрок, а отдельный UI-объект.
Состояние (только чтение)
IsGrounded— на земле ли персонаж.IsRunning— активен ли спринт по вводу.MovementEnabled— обрабатывается ли движение и буфер прыжка.JumpEnabled— разрешён ли прыжок (ввод и импульс).LookEnabled— включён ли поворот камеры (см. также паузу и курсор).
Методы
SetMovementEnabled(bool)— включает/выключает ходьбу, бег и накопление прыжка по вводу. Приfalseобнуляет ввод, спринт и буфер прыжка. Удобно из UI/паузы.SetJumpEnabled(bool)— включает/выключает прыжок; при выключении сбрасывает буфер прыжка.SetLookEnabled(bool)— включает/выключает обзор; при включении и активномPause Look When Cursor Visibleможет заблокировать курсор.SetCursorLocked(bool)— lock/unlock курсора.Teleport(Vector3)— телепорт с очисткой линейной и угловой скоростиRigidbody.
Паттерн меню / паузы
- Открытие:
SetMovementEnabled(false)иSetLookEnabled(false)(илиPausePage+CursorLockController+timeScale). - Закрытие:
SetMovementEnabled(true)иSetLookEnabled(true)(если игра не на паузе).
Если курсором управляет PausePage (Control Cursor), после снятия паузы по умолчанию восстанавливаются Cursor.lockState и Cursor.visible как до паузы; для классического FPS после меню паузы включите у PausePage After Pause Cursor = ForceLockedHidden (см. PausePage).
Отдельно можно отключить только прыжок (например, вода, кат-сцена): SetJumpEnabled(false) без отключения ходьбы.
События OnMoveStart / OnMoveStop — при начале и окончании движения. Если Ground Check не назначен, в Awake выводится однократное предупреждение.
Если меню/пауза живут отдельным объектом страницы, удобная схема такая:
- На игроке:
Pause Look When Cursor Visible = true_toggleCursorOnEscape = false, если курсором будет управлять UI-страница- при использовании внешней страницы назначьте её
CursorLockControllerв поле External Cursor Lock Controller
- На объекте страницы:
CursorLockController(удобно Preset = UI_Page_ShowCursorWhileActive)- либо вручную:
Apply On Enable = true,Lock On Enable = false,Apply On Disable = true,Lock On Disable = true
- В события открытия/закрытия страницы добавьте:
- открыть страницу →
PlayerController3DPhysics.SetLookEnabled(false) - закрыть страницу →
PlayerController3DPhysics.SetLookEnabled(true)
- открыть страницу →
Так страница берёт мышь под UI, а игрок возвращает обзор при закрытии страницы. Если внешний CursorLockController назначен в поле игрока, локальный Escape-toggle у игрока не будет конфликтовать с этим UI-источником управления.
Если у вас несколько UI-страниц или временных механик, которые хотят забирать курсор, используйте отдельные CursorLockController и отпускайте временное владение через ReleaseControl(). Подробная схема описана в CursorLockController.md.
- Добавьте плоскость (
Plane) как землю. - Поместите игрока выше земли (
Y > 1). - Запустите Play:
WASD— движениеShift— бегSpace— прыжок- мышь — обзор
- курсор должен скрыться/залочиться, если включен
_lockCursorOnStart.
В этой версии нет жесткой compile-time зависимости от
Unity.InputSystem: если пакет отсутствует, контроллер автоматически использует Legacy Input Manager и пишет предупреждение в лог один раз.