Для того чтобы реализовать движение камеры в Roblox и запретить игроку перемещаться, вам нужно внести некоторые изменения в ваш скрипт. Кажется, основная идея у вас уже есть, но мы добавим некоторые детали и устранения проблем.
Вот исправленный и улучшенный вариант вашего кода:
```lua
local cameraPart = workspace.CameraMoveable -- Твой part
local camera = game.Workspace.CurrentCamera
camera.CameraType = Enum.CameraType.Scriptable -- Устанавливаем камеру в скриптовый режим
-- Привязка событий ввода
local userInputService = game:GetService("UserInputService")
local speed = 0.5 -- скорость перемещения
-- Запретить движение игрока
local player = game.Players.LocalPlayer
local character = player.Character or player.CharacterAdded:Wait()
character:Move(Vector3.new(0,0,0)) -- Остановим движение персонажа
character:Move(Vector3.new(0,0,0), Enum.PlayerActions.Walk) -- Убедимся, что он не может двигаться
userInputService.InputBegan:Connect(function(input, gameProcessed)
if gameProcessed then return end -- if input is already processed by the game then don't do anything
if input.KeyCode == Enum.KeyCode.W then
cameraPart.CFrame = cameraPart.CFrame * CFrame.new(0, 0, -speed) -- Вперед
elseif input.KeyCode == Enum.KeyCode.S then
cameraPart.CFrame = cameraPart.CFrame * CFrame.new(0, 0, speed) -- Назад
elseif input.KeyCode == Enum.KeyCode.A then
cameraPart.CFrame = cameraPart.CFrame * CFrame.new(-speed, 0, 0) -- Влево
elseif input.KeyCode == Enum.KeyCode.D then
cameraPart.CFrame = cameraPart.CFrame * CFrame.new(speed, 0, 0) -- Вправо
elseif input.KeyCode == Enum.KeyCode.Space then
cameraPart.CFrame = cameraPart.CFrame * CFrame.new(0, speed, 0) -- Вверх
elseif input.KeyCode == Enum.KeyCode.LeftShift then
cameraPart.CFrame = cameraPart.CFrame * CFrame.new(0, -speed, 0) -- Вниз
end
end)
-- Обновляем положение камеры на каждом кадре
game:GetService("RunService").RenderStepped:Connect(function()
camera.CFrame = cameraPart.CFrame
end)
```
### Что здесь происходит:
1. **Запрет движения игрока**: Используя `character:Move(Vector3.new(0,0,0))`, вы предотвращаете движение персонажа. Дополнительно вы можете использовать `character:Move(Vector3.new(0,0,0), Enum.PlayerActions.Walk)` для большей надежности.
2. **Игнорирование событий ввода**: Проверка `if gameProcessed then return end` позволяет игнорировать события, которые уже были обработаны другими частями игры.
3. **Обновление положения камеры**: Каждый кадр положение камеры обновляется согласно положению переменной `cameraPart`.
Этот код должен работать так, как вы хотите — с возможностью перемещения камеры и запретом на перемещение персонажа игрока. Убедитесь, что у вас есть правильный `Part` в Workspace, который называется `CameraMoveable`, и что он не заанкорен.