Run it
Copy the script and paste it into your executor.
Players = :()
RunService = :()
UserInputService = :()
TweenService = :()
HttpService = :()
player = Players.LocalPlayer
camera = .CurrentCamera
playerModule = (player:():())
controls = playerModule:()
currentSpeed, currentSens, currentFOV = , ,
slideEnabled, isFreecamEnabled, collisionEnabled = , ,
is180Mode, isDpadMode, rotationLocked = , ,
slipPower, targetFPS, fpsCapEnabled = , ,
CAM_RADIUS =
isRecording, isPlaying = ,
playbackSpeed, isReverse = ,
isLooping =
playbackTime, totalDuration = ,
recordedPath = {}
recStartTime =
cameraCFrame = .()
yaw, pitch = ,
velocity = .(,,)
joystickTouch =
gamepadRotation = .zero
dpadMove = .zero
verticalMove =
dpadState = {Up=, Down=, Left=, Right=}
isRightMouseDown =
SAVES_FILE =
savedRecordings = {}
(cf)
x, y, z = cf.Position.X, cf.Position.Y, cf.Position.Z
rx, ry, rz = cf:()
{x, y, z, rx, ry, rz}
(data)
.(data[], data[], data[]) * .(data[], data[], data[])
()
writefile
dataToSave = {}
_, rec (savedRecordings)
cleanPath = {}
_, node (rec.path)
.(cleanPath, {t = node.t, cf = (node.cf)})
.(dataToSave, {name = rec.name, date = rec.date, dur = rec.dur, path = cleanPath})
(() (SAVES_FILE, HttpService:(dataToSave)) )
()
readfile isfile (SAVES_FILE)
success, result = (() HttpService:((SAVES_FILE)) )
success result
savedRecordings = {}
_, rec (result)
realPath = {}
_, node (rec.path)
.(realPath, {t = node.t, cf = (node.cf)})
.(savedRecordings, {name = rec.name, date = rec.date, dur = rec.dur, path = realPath})
screenGui = .()
screenGui.Name =
screenGui.ResetOnSpawn =
screenGui.IgnoreGuiInset =
screenGui.DisplayOrder =
screenGui.ZIndexBehavior = .ZIndexBehavior.Sibling
screenGui.Parent = player:()
()
mainFrame = .()
mainFrame.Name =
mainFrame.Size = .(, , , )
mainFrame.Position = .(, -, , -)
mainFrame.BackgroundColor3 = .(, , )
mainFrame.BackgroundTransparency =
mainFrame.Active =
mainFrame.Parent = screenGui
.(, mainFrame)
dragHandle = .()
dragHandle.Size = .(, , , )
dragHandle.BackgroundColor3 = .(, , )
dragHandle.Text =
dragHandle.TextColor3 = .(,,)
dragHandle.Font = .Font.GothamBold
dragHandle.TextSize =
dragHandle.Parent = mainFrame
.(, dragHandle)
scrollFrame = .()
scrollFrame.Size = .(, -, , -)
scrollFrame.Position = .(, , , )
scrollFrame.BackgroundTransparency =
scrollFrame.ScrollBarThickness =
scrollFrame.AutomaticCanvasSize = .AutomaticSize.Y
scrollFrame.CanvasSize = .(,,,)
scrollFrame.Active =
scrollFrame.Parent = mainFrame
uiList = .()
uiList.Parent = scrollFrame
uiList.Padding = .(, )
uiList.HorizontalAlignment = .HorizontalAlignment.Center
uiList.SortOrder = .SortOrder.LayoutOrder
(text, color, layoutOrder)
b = .()
b.Size = .(, , , )
b.BackgroundColor3 = color .(, , )
b.TextColor3 = .(,,)
b.Text = text
b.Font = .Font.GothamBold
b.TextSize =
b.LayoutOrder = layoutOrder
b.Parent = scrollFrame
.(, b)
b
(defText, layoutOrder)
b = .()
b.Size = .(, , , )
b.BackgroundColor3 = .(,,)
b.BackgroundTransparency =
b.TextColor3 = .(,,)
b.Text = defText
b.Font = .Font.Gotham
b.TextSize =
b.LayoutOrder = layoutOrder
b.Parent = scrollFrame
.(, b)
b
(text, layoutOrder)
l = .()
l.Size = .(, , , )
l.BackgroundTransparency =
l.TextColor3 = .(, , )
l.Text = text
l.Font = .Font.GothamBold
l.TextSize =
l.LayoutOrder = layoutOrder
l.Parent = scrollFrame
l
order =
() order = order + order
(, ())
toggleBtn = (, .(, , ), ())
modeBtn = (, , ())
lockRotBtn = (, , ())
(, ())
speedIn = (, ())
sensIn = (, ())
fovIn = (, ())
colTog = (, , ())
(, ())
slideBtn = (, , ())
slipIn = (, ())
dpadTog = (, .(, , ), ())
(, ())
recBtn = (, .(, , ), ())
playBtn = (, .(, , ), ())
loopBtn = (, , ())
revBtn = (, , ())
savesBtn = (, .(, , ), ())
pbSpeedIn = (, ())
seekContainer = .()
seekContainer.Size = .(, , , )
seekContainer.BackgroundTransparency =
seekContainer.LayoutOrder = ()
seekContainer.Parent = scrollFrame
seekTimeLabel = .()
seekTimeLabel.Size = .(, , , )
seekTimeLabel.BackgroundTransparency =
seekTimeLabel.Text =
seekTimeLabel.TextColor3 = .(,,)
seekTimeLabel.TextSize =
seekTimeLabel.Font = .Font.Code
seekTimeLabel.Parent = seekContainer
seekBarBg = .()
seekBarBg.Name =
seekBarBg.Size = .(, , , )
seekBarBg.Position = .(, , , )
seekBarBg.BackgroundColor3 = .(,,)
seekBarBg.Active =
seekBarBg.Parent = seekContainer
.(, seekBarBg)
seekFill = .()
seekFill.Size = .(, , , )
seekFill.BackgroundColor3 = .(, , )
seekFill.Parent = seekBarBg
.(, seekFill)
seekKnob = .()
seekKnob.Size = .(, , , )
seekKnob.Position = .(, , , )
seekKnob.AnchorPoint = .(, )
seekKnob.Text =
seekKnob.Active =
seekKnob.Parent = seekBarBg
.(, seekKnob)
(, ())
fpsTog = (, , ())
fpsIn = (, ())
tpBtn = (, .(, , ), ())
hideBtn = (, .(, , ), ())
resizeHandle = .()
resizeHandle.Size = .(, , , )
resizeHandle.Position = .(, -, , -)
resizeHandle.BackgroundTransparency =
resizeHandle.Image =
resizeHandle.ImageColor3 = .(, , )
resizeHandle.Parent = mainFrame
showBtn = .()
showBtn.Size = .(, , , )
showBtn.Position = .(, -, , )
showBtn.BackgroundColor3 = .(,,)
showBtn.Text =
showBtn.TextColor3 = .(,,)
showBtn.Visible =
showBtn.Active =
showBtn.Parent = screenGui
.(, showBtn)
savesFrame = .()
savesFrame.Name =
savesFrame.Size = .(, , , )
savesFrame.Position = .(, -, , -)
savesFrame.BackgroundColor3 = .(, , )
savesFrame.Visible =
savesFrame.Active =
savesFrame.Parent = screenGui
.(, savesFrame)
savesHeader = .()
savesHeader.Size = .(, , , )
savesHeader.BackgroundColor3 = .(, , )
savesHeader.Text =
savesHeader.TextColor3 = .(,,)
savesHeader.Font = .Font.GothamBold
savesHeader.TextSize =
savesHeader.Parent = savesFrame
.(, savesHeader)
closeSaves = .()
closeSaves.Size = .(, , , )
closeSaves.Position = .(, -, , )
closeSaves.BackgroundColor3 = .(, , )
closeSaves.Text =
closeSaves.TextColor3 = .(,,)
closeSaves.Parent = savesHeader
.(, closeSaves)
savesScroll = .()
savesScroll.Size = .(, -, , -)
savesScroll.Position = .(, , , )
savesScroll.BackgroundTransparency =
savesScroll.ScrollBarThickness =
savesScroll.Active =
savesScroll.Parent = savesFrame
savesList = .()
savesList.Parent = savesScroll
savesList.Padding = .(, )
savesList.SortOrder = .SortOrder.LayoutOrder
confirmFrame = .()
confirmFrame.Size = .(, , , )
confirmFrame.Position = .(, -, , -)
confirmFrame.BackgroundColor3 = .(,,)
confirmFrame.Visible =
confirmFrame.ZIndex =
confirmFrame.Active =
confirmFrame.Parent = screenGui
.(, confirmFrame)
confirmText = .()
confirmText.Size = .(, , , )
confirmText.BackgroundTransparency =
confirmText.Text =
confirmText.TextColor3 = .(,,)
confirmText.Font = .Font.GothamBold
confirmText.TextSize =
confirmText.ZIndex =
confirmText.Parent = confirmFrame
yesBtn = .()
yesBtn.Size = .(, , , )
yesBtn.Position = .(, , , )
yesBtn.BackgroundColor3 = .(, , )
yesBtn.Text =
yesBtn.TextColor3 = .(,,)
yesBtn.ZIndex =
yesBtn.Parent = confirmFrame
.(, yesBtn)
noBtn = .()
noBtn.Size = .(, , , )
noBtn.Position = .(, -, , )
noBtn.BackgroundColor3 = .(, , )
noBtn.Text =
noBtn.TextColor3 = .(,,)
noBtn.ZIndex =
noBtn.Parent = confirmFrame
.(, noBtn)
itemToDeleteIdx =
()
_, v (savesScroll:()) v:() v:()
i, save (savedRecordings)
row = .()
row.Size = .(, , , )
row.BackgroundColor3 = .(, , )
row.Parent = savesScroll
row.Active =
.(, row)
nameBox = .()
nameBox.Size = .(, , , )
nameBox.Position = .(, , , )
nameBox.BackgroundTransparency =
nameBox.Text = save.name
nameBox.TextColor3 = .(,,)
nameBox.Font = .Font.GothamBold
nameBox.TextXAlignment = .TextXAlignment.Left
nameBox.TextSize =
nameBox.Parent = row
nameBox.FocusLost:(() save.name = nameBox.Text; () )
dateLbl = .()
dateLbl.Size = .(, , , )
dateLbl.Position = .(, , , )
dateLbl.BackgroundTransparency =
dateLbl.Text = save.date .. ..string.(, save.dur)..
dateLbl.TextColor3 = .(,,)
dateLbl.Font = .Font.Code
dateLbl.TextSize =
dateLbl.TextXAlignment = .TextXAlignment.Left
dateLbl.Parent = row
pBtn = .()
pBtn.Size = .(, , , )
pBtn.Position = .(, -, , -)
pBtn.BackgroundColor3 = .(, , )
pBtn.Text =
pBtn.TextColor3 = .(,,)
pBtn.Parent = row
.(, pBtn)
dBtn = .()
dBtn.Size = .(, , , )
dBtn.Position = .(, -, , -)
dBtn.BackgroundColor3 = .(, , )
dBtn.Text =
dBtn.TextColor3 = .(,,)
dBtn.Parent = row
.(, dBtn)
pBtn.MouseButton1Click:(()
recordedPath = save.path; totalDuration = save.dur; playbackTime =
isPlaying = ; isRecording = ; playBtn.Text =
playBtn.BackgroundColor3 = .(, , )
)
dBtn.MouseButton1Click:(()
itemToDeleteIdx = i
confirmFrame.Visible =
)
savesScroll.CanvasSize = .(, , , #savedRecordings * )
yesBtn.MouseButton1Click:(()
itemToDeleteIdx
.(savedRecordings, itemToDeleteIdx)
(); ()
itemToDeleteIdx =
confirmFrame.Visible =
)
noBtn.MouseButton1Click:(()
itemToDeleteIdx =
confirmFrame.Visible =
)
vertFrame = .()
vertFrame.Size = .(, , , )
vertFrame.Position = .(, , , -)
vertFrame.BackgroundTransparency =
vertFrame.Parent = screenGui
(txt, pos, val)
b = .()
b.Size = .(, , , )
b.Position = pos
b.BackgroundColor3 = .(,,)
b.BackgroundTransparency =
b.Text = txt; b.TextColor3 = .(,,); b.TextSize = ; b.Font = .Font.GothamBold
b.Active =
b.Parent = vertFrame
.(, b)
b.InputBegan:((i) i.UserInputType == .UserInputType.MouseButton1 i.UserInputType == .UserInputType.Touch verticalMove = val; b.BackgroundTransparency = )
b.InputEnded:((i) i.UserInputType == .UserInputType.MouseButton1 i.UserInputType == .UserInputType.Touch verticalMove == val verticalMove = ; b.BackgroundTransparency = )
(, .(,,,), )
(, .(,,,-), -)
dpadFrame = .()
dpadFrame.Size = .(, , , )
dpadFrame.Position = .(, , , -)
dpadFrame.BackgroundTransparency =
dpadFrame.Visible =
dpadFrame.Parent = screenGui
(name, pos, rot)
btn = .()
btn.Size = .(, , , ); btn.Position = pos
btn.BackgroundColor3 = .(,,); btn.BackgroundTransparency =
btn.Image = ; btn.Rotation = rot; btn.Active = ; btn.Parent = dpadFrame
.(, btn)
btn
btnU, btnD, btnL, btnR = (, .(, -, , ), ), (, .(, -, , -), ), (, .(, , , -), -), (, .(, -, , -), )
.(()
fpsCapEnabled
t = .()
RunService.Heartbeat:()
(.() - t) < (/targetFPS)
RunService.Heartbeat:()
)
(delta)
rotationLocked
is180Mode
yaw = yaw - .(delta.X)
pitch = .(pitch - .(delta.Y), .(-), .())
cameraCFrame = .(cameraCFrame.Position) * .(, yaw, ) * .(pitch, , )
cameraCFrame = cameraCFrame * .(, -.(delta.X), ) * .(-.(delta.Y), , )
(t)
#recordedPath < cameraCFrame
t = .(t, , totalDuration)
idx1, idx2 = , #recordedPath
i = , #recordedPath - recordedPath[i+].t >= t idx1 = i; idx2 = i + ;
f1, f2 = recordedPath[idx1], recordedPath[idx2]
duration = f2.t - f1.t
duration <= f1.cf
f1.cf:(f2.cf, (t - f1.t) / duration)
RunService:(, .RenderPriority.Camera.Value + , (dt)
isRecording
t = .() - recStartTime
.(recordedPath, {cf = camera.CFrame, t = t})
totalDuration = t
seekTimeLabel.Text = .(, t, t)
isPlaying
totalDuration >
playbackTime = playbackTime + (dt * playbackSpeed * (isReverse - ))
isLooping
playbackTime > totalDuration playbackTime = playbackTime < playbackTime = totalDuration
playbackTime > totalDuration playbackTime = totalDuration; isPlaying = ; playBtn.Text =
playbackTime < playbackTime = ; isPlaying = ; playBtn.Text =
camera.CFrame = (playbackTime); cameraCFrame = camera.CFrame
percent = .(playbackTime / totalDuration, , )
seekKnob.Position = .(percent, , , ); seekFill.Size = .(percent, , , )
seekTimeLabel.Text = .(, playbackTime, totalDuration)
camera.CameraType = .CameraType.Scriptable;
isFreecamEnabled
camera.CameraType = .CameraType.Scriptable
mv = isDpadMode dpadMove controls:()
yForce = verticalMove
UserInputService:(.KeyCode.Q) yForce = UserInputService:(.KeyCode.E) yForce = -
UserInputService:(.UserInputType.Gamepad1)
state = UserInputService:(.UserInputType.Gamepad1)
_, input (state)
input.KeyCode == .KeyCode.ButtonL2 input.Position.Z > yForce =
input.KeyCode == .KeyCode.ButtonR2 input.Position.Z > yForce = -
gamepadRotation.Magnitude > (gamepadRotation * currentSens)
dir = (cameraCFrame.RightVector * mv.X) + (cameraCFrame.LookVector * -mv.Z) + (camera.CFrame.UpVector * yForce)
targetVel = dir * currentSpeed
slideEnabled velocity = velocity:(targetVel, .(dt * (/slipPower), , )) velocity = targetVel
moveStep = velocity
collisionEnabled moveStep.Magnitude >
params = RaycastParams.()
params.FilterDescendantsInstances = {player.Character}
params.FilterType = .RaycastFilterType.Exclude
i = ,
moveStep.Magnitude <
cast = :(cameraCFrame.Position, CAM_RADIUS, moveStep + (moveStep.Unit * ), params)
cast cast.Instance cast.Instance.CanCollide
normal = cast.Normal
moveStep = moveStep - (normal * moveStep:(normal))
cameraCFrame = cameraCFrame + moveStep
camera.CFrame = cameraCFrame; camera.FieldOfView = currentFOV
)
(box, var, prefix)
box.FocusLost:(()
val = (box.Text:())
val
var == currentSpeed = val var == currentSens = val var == currentFOV = val
var == slipPower = .(val, ) var == targetFPS = .(val, , )
var == playbackSpeed = val
box.Text = prefix .. (val )
)
(speedIn, , ); (sensIn, , ); (fovIn, , )
(slipIn, , ); (fpsIn, , ); (pbSpeedIn, , )
toggleBtn.MouseButton1Click:(()
isFreecamEnabled = isFreecamEnabled
toggleBtn.Text = isFreecamEnabled
toggleBtn.BackgroundColor3 = isFreecamEnabled .(, , ) .(, , )
isFreecamEnabled
cameraCFrame = camera.CFrame; look = cameraCFrame.LookVector
yaw = .(-look.X, -look.Z); pitch = .(.(look.Y, -, ))
player.Character _, v (player.Character:()) v:() v.Anchored =
isRecording = ; isPlaying = ; camera.CameraType = .CameraType.Custom
player.Character _, v (player.Character:()) v:() v.Anchored =
UserInputService.MouseBehavior = .MouseBehavior.Default
)
recBtn.MouseButton1Click:(()
isRecording
isRecording = ; recBtn.Text = ; recBtn.BackgroundColor3 = .(, , )
.(savedRecordings, {name = ..#savedRecordings+, date = .(), dur = totalDuration, path = recordedPath})
(); ()
isRecording = ; isPlaying = ; recBtn.Text = ; recBtn.BackgroundColor3 = .(, , )
recordedPath = {}; recStartTime = .(); playbackTime =
)
playBtn.MouseButton1Click:(()
isPlaying isPlaying = ; playBtn.Text = ; playBtn.BackgroundColor3 = .(, , )
#recordedPath > isPlaying = ; isRecording = ; playBtn.Text = ; playBtn.BackgroundColor3 = .(, , )
playbackTime >= totalDuration playbackTime =
)
loopBtn.MouseButton1Click:(() isLooping = isLooping; loopBtn.Text = isLooping ; loopBtn.BackgroundColor3 = isLooping .(, , ) .(, , ) )
revBtn.MouseButton1Click:(() isReverse = isReverse; revBtn.Text = isReverse ; revBtn.BackgroundColor3 = isReverse .(, , ) .(, , ) )
savesBtn.MouseButton1Click:(() savesFrame.Visible = ; () )
closeSaves.MouseButton1Click:(() savesFrame.Visible = )
isDraggingSeek =
wasPlayingBeforeSeek =
(input)
barCenterY = seekBarBg.AbsolutePosition.Y + (seekBarBg.AbsoluteSize.Y / )
distY = .(input.Position.Y - barCenterY)
distY >
pct = .((input.Position.X - seekBarBg.AbsolutePosition.X) / seekBarBg.AbsoluteSize.X, , )
playbackTime = totalDuration * pct
seekKnob.Position = .(pct, , , ); seekFill.Size = .(pct, , , )
seekTimeLabel.Text = .(, playbackTime, totalDuration)
#recordedPath > camera.CameraType = .CameraType.Scriptable; camera.CFrame = (playbackTime)
seekBarBg.InputBegan:((i)
i.UserInputType == .UserInputType.MouseButton1 i.UserInputType == .UserInputType.Touch
isDraggingSeek =
wasPlayingBeforeSeek = isPlaying
isPlaying =
playBtn.Text =
(i)
)
seekBarBg.InputEnded:((i)
i.UserInputType == .UserInputType.MouseButton1 i.UserInputType == .UserInputType.Touch
isDraggingSeek =
wasPlayingBeforeSeek isPlaying = ; playBtn.Text = playBtn.Text =
)
UserInputService.InputChanged:((i)
isDraggingSeek (i.UserInputType == .UserInputType.MouseMovement i.UserInputType == .UserInputType.Touch)
(i)
)
modeBtn.MouseButton1Click:(() is180Mode = is180Mode; modeBtn.Text = is180Mode )
lockRotBtn.MouseButton1Click:(() rotationLocked = rotationLocked; lockRotBtn.Text = rotationLocked ; lockRotBtn.BackgroundColor3 = rotationLocked .(, , ) .(,,) )
colTog.MouseButton1Click:(() collisionEnabled = collisionEnabled; colTog.Text = collisionEnabled )
slideBtn.MouseButton1Click:(() slideEnabled = slideEnabled; slideBtn.Text = slideEnabled )
dpadTog.MouseButton1Click:(() isDpadMode = isDpadMode; dpadTog.Text = isDpadMode ; dpadFrame.Visible = isDpadMode; dpadTog.BackgroundColor3 = isDpadMode .(, , ) .(, , ); player.DevTouchMovementMode = isDpadMode .DevTouchMovementMode.Scriptable .DevTouchMovementMode.UserChoice )
fpsTog.MouseButton1Click:(() fpsCapEnabled = fpsCapEnabled; fpsTog.Text = fpsCapEnabled )
tpBtn.MouseButton1Click:(() player.Character player.Character:(cameraCFrame.Position) )
hideBtn.MouseButton1Click:(() mainFrame.Visible = ; showBtn.Visible = )
showBtn.MouseButton1Click:(() mainFrame.Visible = ; showBtn.Visible = )
isDrag, isResize, activeFrame, dStart, sPos, sSize = , , , , ,
dragHandle.InputBegan:((i) i.UserInputType == .UserInputType.MouseButton1 i.UserInputType == .UserInputType.Touch isDrag=; activeFrame=mainFrame; dStart=i.Position; sPos=mainFrame.Position )
savesHeader.InputBegan:((i) i.UserInputType == .UserInputType.MouseButton1 i.UserInputType == .UserInputType.Touch isDrag=; activeFrame=savesFrame; dStart=i.Position; sPos=savesFrame.Position )
resizeHandle.InputBegan:((i) i.UserInputType == .UserInputType.MouseButton1 i.UserInputType == .UserInputType.Touch isResize=; dStart=i.Position; sSize=mainFrame.Size )
UserInputService.InputChanged:((i)
i.UserInputType == .UserInputType.MouseMovement i.UserInputType == .UserInputType.Touch
isDrag activeFrame delta = i.Position - dStart; activeFrame.Position = .(sPos.X.Scale, sPos.X.Offset + delta.X, sPos.Y.Scale, sPos.Y.Offset + delta.Y)
isResize delta = i.Position - dStart; mainFrame.Size = .(, .(, sSize.X.Offset + delta.X), , .(, sSize.Y.Offset + delta.Y))
)
UserInputService.InputEnded:((i) i.UserInputType == .UserInputType.MouseButton1 i.UserInputType == .UserInputType.Touch isDrag=; isResize=; activeFrame= )
()
x, z = (dpadState.Right ) - (dpadState.Left ), (dpadState.Down ) - (dpadState.Up )
dpadMove = .(x, , z); dpadMove.Magnitude > dpadMove = dpadMove.Unit
(b, d)
b.InputBegan:((i) i.UserInputType == .UserInputType.Touch i.UserInputType == .UserInputType.MouseButton1 dpadState[d] = ; (); b.BackgroundTransparency = )
b.InputEnded:((i) i.UserInputType == .UserInputType.Touch i.UserInputType == .UserInputType.MouseButton1 dpadState[d] = ; (); b.BackgroundTransparency = )
(btnU, ); (btnD, ); (btnL, ); (btnR, )
UserInputService.InputBegan:((input, gpe)
isFreecamEnabled
input.UserInputType == .UserInputType.MouseButton2
isRightMouseDown =
UserInputService.MouseBehavior = .MouseBehavior.LockCurrentPosition
isDpadMode input.UserInputType == .UserInputType.Gamepad1
k = input.KeyCode
k == .KeyCode.DPadUp dpadState.Up = k == .KeyCode.DPadDown dpadState.Down = k == .KeyCode.DPadLeft dpadState.Left = k == .KeyCode.DPadRight dpadState.Right =
()
input.UserInputType == .UserInputType.Touch isDpadMode input.Position.X < (camera.ViewportSize.X * ) joystickTouch = input
)
UserInputService.InputEnded:((input)
input.UserInputType == .UserInputType.MouseButton2
isRightMouseDown =
UserInputService.MouseBehavior = .MouseBehavior.Default
input == joystickTouch joystickTouch =
input.KeyCode == .KeyCode.Thumbstick2 gamepadRotation = .zero
isDpadMode input.UserInputType == .UserInputType.Gamepad1
k = input.KeyCode
k == .KeyCode.DPadUp dpadState.Up = k == .KeyCode.DPadDown dpadState.Down = k == .KeyCode.DPadLeft dpadState.Left = k == .KeyCode.DPadRight dpadState.Right =
()
)
UserInputService.InputChanged:((input, gpe)
isFreecamEnabled
input.KeyCode == .KeyCode.Thumbstick2
p = input.Position; gamepadRotation = (p.Magnitude > ) .(p.X * , -p.Y * ) .zero
input.UserInputType == .UserInputType.MouseMovement (input.UserInputType == .UserInputType.Touch input ~= joystickTouch)
gpe
isDraggingSeek (isDpadMode input.UserInputType == .UserInputType.Touch input.Position.X < (camera.ViewportSize.X * ))
input.UserInputType == .UserInputType.Touch (input.UserInputType == .UserInputType.MouseMovement isRightMouseDown)
(.(input.Delta.X * currentSens, input.Delta.Y * currentSens))
)
Test

Universal