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?
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
.