Ad
Log in to vote
0

How can I have a seat that that rotates on button held?

Asked by 23 days ago

I'm having a hard time figuring out how to rotate a Seat part on an axis while being seated when I hold a button. For example: When i press "A" I want the part to rotate to the left until I stop pressing "A". How would I best go about doing this in the most simple way?

0
Have a loop that rotates the seat whenever a variable is true. Detect when a player presses and releases "A" and turn the variable on and off. JustinWe12 723 — 23d

1 answer

Log in to vote
0
Answered by 22 days ago

You can use UserInputService for this.

To rotate the Seat, you can multiply its CFrame with CFrame.Angles().

-- make sure this is a local script inside StarterGui or StarterPlayerScripts
local UserInputService = game:GetService("UserInputService")

local seat = workspace.Seat -- i assume there's a Seat named "Seat" in workspace
local rotateSpeed = 5 -- you can change this to how fast you want to rotate

local rotateSeat = coroutine.create(function() -- this can be used to pause or play the rotation loop
    while true do
        local seatCFrame = seat:GetPivot() -- similar to seat.CFrame
        local rotateCFrame = CFrame.Angles(0, math.rad(rotateSpeed), 0) -- this will rotate sideways (if speed is negative, clockwise; if speed is positive, counter-clockwise)

        seat:PivotTo(seatCFrame * rotateCFrame) -- similar to `seat.CFrame *= rotateCFrame`

        task.wait()
    end
end)

local function onPress(input, gameProcessedEvent)
    if not gameProcessedEvent then -- if player is not typing, etc.
        if input.KeyCode == Enum.KeyCode.A then -- if player pressed A
            rotateSpeed = math.abs(rotateSpeed) -- makes the spinner go counter-clockwise (positive)
            coroutine.resume(rotateSeat)
        elseif input.KeyCode == Enum.KeyCode.D then -- if player pressed D
            rotateSpeed = 0 - math.abs(rotateSpeed) -- makes the spinner go clockwise (negative)
            coroutine.resume(rotateSeat)
        end
    end
end

local function pressEnded(input, gameProcessedEvent)
    if not gameProcessedEvent then -- if player is not typing, etc.
        if (input.KeyCode == Enum.KeyCode.A) or (input.KeyCode == Enum.KeyCode.D) then
            coroutine.close(rotateSeat) -- ends the thread
            rotateSeat = coroutine.create(function() -- makes the thread again to replay
                while true do
                    local seatCFrame = seat:GetPivot() -- similar to seat.CFrame
                    local rotateCFrame = CFrame.Angles(0, math.rad(rotateSpeed), 0) -- this will rotate sideways (if speed is negative, clockwise; if speed is positive, counter-clockwise)

                    seat:PivotTo(seatCFrame * rotateCFrame) -- similar to `seat.CFrame *= rotateCFrame`

                    task.wait()
                end
            end)
        end
    end
end

UserInputService.InputBegan:Connect(onPress) -- when a player press a button
UserInputService.InputChanged:Connect(onPress)
UserInputService.InputEnded:Connect(pressEnded)

To create mobile buttons for mobile support, use ContextActionService.

Ad

Answer this question