Разработка игрLua / Luau

Как сделать вид от первого лица в Roblox Studio: камера и курсор

Включаем вид от первого лица в Roblox Studio через CameraMode, управляем курсором, добавляем прицел, тесируем мышь, тач и геймпад.

Кодик

Автор

5 мин чтения

Базовый вид от первого лица уже есть в Roblox: установите Player.CameraMode в LockFirstPerson. Не пишите свою камеру каждый кадр, пока вам не нужны отдача, покачивание или особая позиция оружия.

У Roblox есть готовая камера, которая уже понимает мышь, тач, геймпад и респавн. Свой CameraType Scriptable берёт всю эту работу на себя. Для первого прототипа лучше оставить CameraType Custom, включить LockFirstPerson и добавить только UI-прицел.

1Блокируем

CameraMode LockFirstPerson не даёт колёсику отодвинуть камеру.

2Центрируем

На компьютере MouseBehavior LockCenter удерживает ввод в центре.

3Показываем

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 не должны закрывать весь экран.

Проверка своими руками
  1. Запустите Play и попробуйте отодвинуть камеру колесом.
  2. Повернитесь на 360 градусов и пройдите вплотную к стене.
  3. Откройте меню и верните видимый курсор.
  4. Закройте меню и проверьте LockCenter.
  5. Повторите сценарий в эмуляции телефона.
  6. Возьмите Tool и оцените, не закрывает ли он прицел.
Готово, если выполняются все пункты

Камеру нельзя отодвинуть от головы. Мышь в игре управляет обзором, а в меню курсором. Тач и геймпад сохраняют штатное управление. Прицел остаётся в центре на разных соотношениях сторон.

Тест камеры
Не ограничивайтесь пустой комнатой. Пройдите все четыре сценария перед публикацией проекта.

Доводим вид от первого лица до комфорта

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

Script вместо LocalScript

CameraMode и UserInputService нужны на клиенте.

Курсор скрыт в меню

Переключайте MouseIconEnabled и MouseBehavior вместе с UI.

Лишний RenderStepped

Не обновляйте камеру каждый кадр без необходимости.

Тест только мышью

На таче и геймпаде другие режимы ввода.

Сверьтесь с первичным источником. Поведение используемых функций и ограничения примера проверяйте по документацией Roblox по CameraMode. Документация особенно важна, когда меняются версии, политика платформы или формат ответа API.

Что получится в итоге

Готовый результат проекта: Как сделать вид от первого лица в Roblox Studio: камера и курсор
В итоге игрок видит мир от первого лица, управляет обзором мышью и ориентируется по компактному прицелу.

Короткие ответы
Какой CameraMode включает первое лицо?

Enum.CameraMode.LockFirstPerson на объекте локального Player.

Нужен ли CameraType Scriptable?

Нет для базового режима. Он нужен для полностью своей камеры.

Как вернуть курсор в меню?

Включить MouseIconEnabled и установить MouseBehavior Default.

Как понять, что проект готов?

Он повторяет целевой сценарий несколько раз подряд, понятно реагирует на ошибочный ввод и не теряет состояние при обычных действиях.

Можно ли копировать код целиком?

Можно как стартовую точку, но сначала замените значения из примера, затем запустите проект по шагам. Если вы не можете объяснить одну строку, её лучше разобрать до следующего шага.

Добавьте к камере игровое действие

События ввода и Luau можно закрепить в курсе Lua. Если нужно закрепить камеру до начала, свяжите её со стартовым меню.

Дальше добавьте оружие через Tool и переключение управления через ScreenGui. В Кодике удобно сначала разобрать события и функции, а затем перенести механику в Studio.