Базовый вид от первого лица уже есть в Roblox: установите Player.CameraMode в LockFirstPerson. Не пишите свою камеру каждый кадр, пока вам не нужны отдача, покачивание или особая позиция оружия.
У Roblox есть готовая камера, которая уже понимает мышь, тач, геймпад и респавн. Свой CameraType Scriptable берёт всю эту работу на себя. Для первого прототипа лучше оставить CameraType Custom, включить LockFirstPerson и добавить только UI-прицел.
CameraMode LockFirstPerson не даёт колёсику отодвинуть камеру.
На компьютере MouseBehavior LockCenter удерживает ввод в центре.
ScreenGui рисует маленький прицел, который не закрывает цель.
Выбираем между готовой и своей камерой
В StarterPlayer можно задать CameraMode через Properties, но в учебном проекте полезно увидеть ту же настройку в коде. Поместите LocalScript в StarterPlayerScripts. Прицел лежит в ScreenGui и состоит из двух тонких Frame. В текстовом поле и меню на время возвращайте курсор.
| Уровень | Решение | Когда брать |
|---|---|---|
| Базовый | CameraMode LockFirstPerson | Первый прототип |
| С прицелом | ScreenGui + Custom camera | Шутер без отдачи |
| С отдачей | Scriptable + RunService | Оружие и анимации |
| Киносцена | Scriptable + CFrame | Игрок не управляет обзором |
После этого шага у каждой части есть одна роль. Интерфейс собирает действие, логика меняет состояние, а вывод показывает признак успеха. Это проще отлаживать, чем один большой обработчик.

Готовая камера берёт основную работу. Scriptable не нужен до особых эффектов
Включаем LockFirstPerson и добавляем прицел
Не выключайте курсор навсегда. Функция setGameplayMouse принимает флаг, поэтому её можно вызвать с false при открытии меню. На тач-устройствах курсора нет, поэтому код проверяет MouseEnabled.
local Players = game:GetService("Players")
local UserInputService = game:GetService("UserInputService")
local player = Players.LocalPlayer
player.CameraMode = Enum.CameraMode.LockFirstPerson
local function setGameplayMouse(enabled)
if UserInputService.MouseEnabled then
UserInputService.MouseIconEnabled = not enabled
UserInputService.MouseBehavior = enabled
and Enum.MouseBehavior.LockCenter
or Enum.MouseBehavior.Default
end
end
setGameplayMouse(true)
-- Вызовите setGameplayMouse(false),
-- когда откроете меню или поле ввода.Камера заперта от первого лица до смены CameraMode. На компьютере курсор скрыт и центрирован. На телефоне код не ищет несуществующую мышь. Меню может вернуть Default и видимый курсор.

Начните с меньшего. Сравнение показывает, какой вариант легче поддерживать и проверять.
Как вести себя с мышью и курсором
Не запускайте цикл RenderStepped, если в нём нет изменяющейся камеры. LockFirstPerson сам обновляет обзор. Каждая лишняя функция в кадровом цикле работает 60 раз в секунду и усложняет диагностику. Добавляйте RenderStepped только вместе с конкретным эффектом и отключайте connection, когда он не нужен.
| Состояние | CameraMode | Курсор |
|---|---|---|
| Игра | LockFirstPerson | Скрыт, LockCenter |
| Меню | LockFirstPerson | Видим, Default |
| Карта | Classic | Видим |
| Тач | LockFirstPerson | Мышь не меняется |
Сохраняйте в одном месте то, что может измениться. Если одно и то же значение скопировано в три функции, после первой правки они начнут расходиться. Один объект состояния и одна функция отрисовки снимают эту проблему.
Практика: тестируем обзор и интерфейс
Вид от первого лица нужно проверять не только в пустой комнате. Подойдите к стене, прыгните, сядьте в VehicleSeat, возьмите Tool и откройте TextBox. Камера не должна проходить сквозь геометрию, курсор должен возвращаться для ввода, а руки Tool не должны закрывать весь экран.
- Запустите Play и попробуйте отодвинуть камеру колесом.
- Повернитесь на 360 градусов и пройдите вплотную к стене.
- Откройте меню и верните видимый курсор.
- Закройте меню и проверьте LockCenter.
- Повторите сценарий в эмуляции телефона.
- Возьмите Tool и оцените, не закрывает ли он прицел.
Камеру нельзя отодвинуть от головы. Мышь в игре управляет обзором, а в меню курсором. Тач и геймпад сохраняют штатное управление. Прицел остаётся в центре на разных соотношениях сторон.

Не ограничивайтесь пустой комнатой. Пройдите все четыре сценария перед публикацией проекта.
Доводим вид от первого лица до комфорта
Первое лицо сильно увеличивает скорость визуального движения. Не добавляйте сильную качку и размытие до теста базового обзора. Для чувствительных игроков дайте настройку FieldOfView и отключение качки. Прицел должен оставаться маленьким и контрастным, но не закрывать центр экрана.
CameraMode и UserInputService нужны на клиенте.
Переключайте MouseIconEnabled и MouseBehavior вместе с UI.
Не обновляйте камеру каждый кадр без необходимости.
На таче и геймпаде другие режимы ввода.
Что получится в итоге

В итоге игрок видит мир от первого лица, управляет обзором мышью и ориентируется по компактному прицелу.
Какой CameraMode включает первое лицо?
Enum.CameraMode.LockFirstPerson на объекте локального Player.
Нужен ли CameraType Scriptable?
Нет для базового режима. Он нужен для полностью своей камеры.
Как вернуть курсор в меню?
Включить MouseIconEnabled и установить MouseBehavior Default.
Как понять, что проект готов?
Он повторяет целевой сценарий несколько раз подряд, понятно реагирует на ошибочный ввод и не теряет состояние при обычных действиях.
Можно ли копировать код целиком?
Можно как стартовую точку, но сначала замените значения из примера, затем запустите проект по шагам. Если вы не можете объяснить одну строку, её лучше разобрать до следующего шага.
События ввода и Luau можно закрепить в курсе Lua. Если нужно закрепить камеру до начала, свяжите её со стартовым меню.
Дальше добавьте оружие через Tool и переключение управления через ScreenGui. В Кодике удобно сначала разобрать события и функции, а затем перенести механику в Studio.