Как реализовать движение камеры и запретить игроку перемещаться в Roblox?

У меня возникли трудности с написанием скрипта, использующего мои навыки и нейросеть. Я пытаюсь реализовать движение камеры, аналогичное тому, что используется в симуляторах жизни, но это не удается. Хотя движение блокируется, нажатие клавиш W, A, S и D не приводит к никаким изменениям, и part не заанкорен. Вот мой скрипт: <br/> <br/> local cameraPart = workspace.CameraMoveable -- Твой part <br/> local camera = game.Workspace.CurrentCamera <br/> camera.CameraType = Enum.CameraType.Scriptable -- Устанавливаем камеру в скриптовый режим <br/> <br/> -- Привязка событий ввода <br/> local userInputService = game:GetService("UserInputService") <br/> local speed = 0.5 -- скорость перемещения <br/> <br/> userInputService.InputBegan:Connect(function(input) <br/> if input.KeyCode == Enum.KeyCode.W then <br/> cameraPart.CFrame = cameraPart.CFrame * CFrame.new(0, 0, -speed) -- Вперед <br/> elseif input.KeyCode == Enum.KeyCode.S then <br/> cameraPart.CFrame = cameraPart.CFrame * CFrame.new(0, 0, speed) -- Назад <br/> elseif input.KeyCode == Enum.KeyCode.A then <br/> cameraPart.CFrame = cameraPart.CFrame * CFrame.new(-speed, 0, 0) -- Влево <br/> elseif input.KeyCode == Enum.KeyCode.D then <br/> cameraPart.CFrame = cameraPart.CFrame * CFrame.new(speed, 0, 0) -- Вправо <br/> elseif input.KeyCode == Enum.KeyCode.Space then <br/> cameraPart.CFrame = cameraPart.CFrame * CFrame.new(0, speed, 0) -- Вверх <br/> elseif input.KeyCode == Enum.KeyCode.LeftShift then <br/> cameraPart.CFrame = cameraPart.CFrame * CFrame.new(0, -speed, 0) -- Вниз <br/> end <br/> end) <br/> <br/> -- Обновляем положение камеры на GUI <br/> game:GetService("RunService").RenderStepped:Connect(function() <br/> camera.CFrame = cameraPart.CFrame <br/> end) <br/> <br/> Также у мен...
  • 21 сентября 2024 г. 19:13
Ответы на вопрос 1
Для того чтобы реализовать движение камеры в 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`, и что он не заанкорен.
Похожие вопросы