Top.Mail.Ru
Ответы

Помощь в Roblox studio

В общем дело такое, пытаюсь сделать главное меню, но оно работает через раз, заходишь 1 раз, всё в порядке, перезаходишь и случается такое:
Нормальный:

Поломанный:

Второе попадается редко, но всё же мозолит.
Сам скрипт:

Сюда ещё добавил зафиксировать движение чтобы игрок не смог игру пройти не глядя, но сразу скажу, убрав это ситуация не меняется

По дате
По рейтингу
Аватар пользователя
Знаток
6мес

Проблема в том, что ваш скрипт полагается на WaitForChild для поиска Humanoid. WaitForChild ожидает появления объекта, но если Humanoid уже существует, когда скрипт запускается, то WaitForChild может работать некорректно. Это приводит к непредсказуемому поведению, особенно при повторных запусках игры. Кроме того, PlayButton:Destroy() может вызывать проблемы, если кнопка уже уничтожена.

Вот исправленный и улучшенный скрипт:

1234567891011121314151617181920212223242526272829303132333435363738
 local camera = workspace.CurrentCamera 
local UserInputService = game:GetService("UserInputService") 
local Players = game:GetService("Players") 
local player = Players.LocalPlayer 
local character = player.Character or player.CharacterAdded:Wait() -- Улучшенное получение Character 
local humanoid = character:WaitForChild("Humanoid") -- Ожидание Humanoid внутри Character 
 
local cameraMenuFrame = workspace.CameraMenuFrame 
 
camera.CameraType = Enum.CameraType.Scriptable 
camera.CFrame = cameraMenuFrame.CFrame 
 
humanoid.WalkSpeed = 0 
humanoid.JumpPower = 0 
 
local PlayButton = script.Parent 
 
PlayButton.MouseButton1Click:Connect(function() 
    camera.CameraType = Enum.CameraType.Custom 
    humanoid.WalkSpeed = 8 
    humanoid.JumpPower = 50 
    PlayButton:Destroy() -- Уничтожение кнопки после нажатия 
end) 
 
-- Улучшение работы со скриптом, когда игрок присоединяется позже 
Players.PlayerAdded:Connect(function(plr) 
    plr.CharacterAdded:Connect(function(char) 
        local h = char:WaitForChild("Humanoid") 
        h.WalkSpeed = 0 
        h.JumpPower = 0 
    end) 
end) 
 
UserInputService.InputBegan:Connect(function(input, gameProcessedEvent) 
    if input.KeyCode == Enum.KeyCode.C then 
        --тут код для скрытия курсора 
    end 
end) 

Объяснения изменений:

player.Character or player.CharacterAdded:Wait(): Этот фрагмент кода надёжно получает Character. Если Character уже существует, он используется; в противном случае скрипт ожидает появления Character.

humanoid = character:WaitForChild("Humanoid"): WaitForChild теперь используется внутри character, что гарантирует, что Humanoid будет найден внутри корректно полученного Character.

PlayButton:Destroy(): Уничтожение кнопки теперь происходит после изменения параметров humanoid.

Players.PlayerAdded: Этот обработчик событий гарантирует, что ограничения скорости и прыжка будут применяться, даже если игрок присоединяется после запуска скрипта.

Рекомендации:

Проверьте наличие объекта CameraMenuFrame в Workspace: Убедитесь, что он существует и правильно назван.
Расположение скрипта: убедитесь, что скрипт находится внутри кнопки «PLAY».
Дебаг: Используйте print() операторы, чтобы проверить значения переменных на разных этапах выполнения скрипта. Это поможет определить, где именно возникает проблема.
Этот исправленный скрипт должен работать стабильнее. Если проблемы сохраняются, проверьте остальные части вашего проекта на наличие ошибок. Возможно, есть конфликт с другими скриптами. Если проблема сохранится, предоставьте больше информации о вашем проекте.