UserInputService

Tampilkan yang Tidak Digunakan Lagi

*Konten ini diterjemahkan menggunakan AI (Beta) dan mungkin mengandung kesalahan. Untuk melihat halaman ini dalam bahasa Inggris, klik di sini.

Tidak Dapat Dibuat
Layanan
Tidak Direplikasi

UserInputService adalah layanan yang digunakan untuk mendeteksi dan menangkap berbagai jenis masukan yang tersedia di perangkat pengguna.

Tujuan utama layanan ini adalah untuk memungkinkan pengalaman untuk berkooperasi dengan banyak bentuk input yang tersedia, seperti gamepad, layar sentuh, dan keyboard. Ini memungkinkan LocalScript untuk melakukan berbagai tindakan tergantung pada perangkat dan, kemudian, menyediakan pengalaman terbaik bagi pengguna akhir.

Beberapa penggunaan layanan ini termasuk mendeteksi masukan pengguna saat mereka berinteraksi dengan GUI, alat, dan instans game lainnya. Untuk mendeteksi masukan pengguna, layanan harus mencari acara layanan. Misalnya, layanan dapat mendeteksi acara seperti saat pengguna menyentuh lay

Karena layanan ini hanya sisi klien, itu hanya akan bekerja ketika digunakan dalam LocalScript atau ModuleScript yang diperlukan oleh LocalScript . Sebagai UserInputService sisi klien, pengguna dalam permainan hanya dapat mendeteksi masukan mereka sendiri - dan bukan masukan orang lain.

Lihat juga ContextActionService, layanan yang memungkinkan Anda untuk menyambungkan fungsi ke banyak input pengguna.

Contoh Kode

UserInputService

-- We must get the UserInputService before we can use it
local UserInputService = game:GetService("UserInputService")
-- A sample function providing one usage of InputBegan
local function onInputBegan(input, _gameProcessed)
if input.UserInputType == Enum.UserInputType.MouseButton1 then
print("The left mouse button has been pressed!")
end
end
UserInputService.InputBegan:Connect(onInputBegan)

Rangkuman

Properti

  • Hanya Baca
    Tidak Direplikasi
    Baca Paralel

    Menggambarkan apakah perangkat pengguna memiliki accelerometer.

  • Hanya Baca
    Tidak Direplikasi
    Baca Paralel

    Menggambarkan apakah perangkat yang digunakan oleh pengguna memiliki gamepad yang tersedia.

  • Hanya Baca
    Tidak Direplikasi
    Baca Paralel

    Menggambarkan apakah perangkat pengguna memiliki giroskop.

  • Hanya Baca
    Tidak Direplikasi
    Baca Paralel

    Menggambarkan apakah perangkat pengguna memiliki keyboard yang tersedia.

  • Menentukan apakah mouse pengguna dapat diubah secara bebas atau terkunci.

  • Tidak Direplikasi
    Baca Paralel

    Mengukur output delta (ubah) pengguna Mouse .

  • Hanya Baca
    Tidak Direplikasi
    Baca Paralel

    Menggambarkan apakah perangkat pengguna memiliki mouse yang tersedia.

  • MouseIcon:ContentId
    Baca Paralel

    ID konten gambar yang digunakan sebagai ikon mouse pengguna.

  • Menentukan apakah ikon Mouse tersebut terlihat.

  • Hanya Baca
    Tidak Direplikasi
    Baca Paralel

    Menentukan posisi keyboard on-screen.

  • Hanya Baca
    Tidak Direplikasi
    Baca Paralel

    Menentukan ukuran keyboard on-screen.

  • Hanya Baca
    Tidak Direplikasi
    Baca Paralel

    Menggambarkan apakah keyboard on-screen saat ini terlihat di layar pengguna.

  • Hanya Baca
    Tidak Direplikasi
    Baca Paralel

    Menggambarkan apakah perangkat pengguna saat ini memiliki layar sentuh yang tersedia.

  • Hanya Baca
    Tidak Direplikasi
    Baca Paralel

    Menunjukkan apakah pengguna menggunakan headset realitas virtual.

Metode

Acara

Properti

AccelerometerEnabled

Hanya Baca
Tidak Direplikasi
Baca Paralel

Item ini menggambarkan apakah perangkat pengguna memiliki accelerometer

Akselerometer adalah komponen yang ditemukan di kebanyakan perangkat seluler yang mengukur akselerasi (perubahan dalam kecepatan).

Misalnya, kode contoh berikut menunjukkan cara memeriksa apakah perangkat pengguna memiliki accelerometer.


local UserInputService = game:GetService("UserInputService")
local accelerometerEnabled = UserInputService.AccelerometerEnabled
if accelerometerEnabled then
print("Accelerometer enabled!")
else
print("Accelerometer not enabled!")
end

Jika perangkat memiliki accelerometer yang diaktifkan, Anda dapat menggunakan fungsi UserInputService:GetDeviceAcceleration() atau melacak ketika accelerasi perangkat berubah dengan menggunakan acara UserInputService.DeviceAccelerationChanged .

Karena UserInputService hanya sisi klien, property ini hanya dapat digunakan dalam LocalScript .

Contoh Kode

Move a Ball using the Accelerometer

local Workspace = game:GetService("Workspace")
local UserInputService = game:GetService("UserInputService")
local ball = script.Parent:WaitForChild("Ball")
local mass = ball:GetMass()
local gravityForce = ball:WaitForChild("GravityForce")
local function moveBall(gravity)
gravityForce.Force = gravity.Position * Workspace.Gravity * mass
end
if UserInputService.AccelerometerEnabled then
UserInputService.DeviceGravityChanged:Connect(moveBall)
end
Create a Gyroscopic Camera

local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local character = player.CharacterAdded:Wait()
local head = character:WaitForChild("Head")
local camera = workspace.CurrentCamera
local currentRotation = camera.CFrame -- CFrame.new(Vector3.new(0,0,0), Vector3.new(0,0,0))
local lastInputFrame = nil
local upsideDown = false
task.wait()
local orientationSet = false
local function GravityChanged(gravity)
if not orientationSet then
upsideDown = (gravity.Position.X < -0.5 or gravity.Position.Z > 0.5)
orientationSet = true
end
end
local function RotationChanged(_rotation, rotCFrame)
if orientationSet then
if not lastInputFrame then
lastInputFrame = rotCFrame
end
local delta = rotCFrame * lastInputFrame:inverse()
local x, y, z = delta:ToEulerAnglesXYZ()
if upsideDown then
delta = CFrame.Angles(-x, y, z)
else
delta = CFrame.Angles(x, -y, z)
end
currentRotation = currentRotation * delta
lastInputFrame = rotCFrame
end
end
local function HideCharacter()
for _, limb in pairs(character:GetChildren()) do
if limb:IsA("Part") then
limb.Transparency = 1
end
end
end
if UserInputService.GyroscopeEnabled then
UserInputService.DeviceGravityChanged:Connect(GravityChanged)
UserInputService.DeviceRotationChanged:Connect(RotationChanged)
HideCharacter()
RunService:BindToRenderStep("Camera", Enum.RenderPriority.Camera.Value, function()
camera.CFrame = CFrame.new(head.Position - Vector3.new(0, 8, 10)) * currentRotation
camera.Focus = CFrame.new(currentRotation * Vector3.new(0, 0, -10))
end)
end

GamepadEnabled

Hanya Baca
Tidak Direplikasi
Baca Paralel

Properti ini menggambarkan apakah perangkat yang digunakan oleh pengguna memiliki gamepad yang tersedia. Jika gamepad tersedia, Anda dapat menggunakan UserInputService:GetConnectedGamepads() untuk mengambil daftar gamepad yang terhubung.

Karena UserInputService hanya sisi klien, property ini hanya dapat digunakan dalam LocalScript .

Lihat juga:

Contoh Kode

How to Set the Active Gamepad for Input

local UserInputService = game:GetService("UserInputService")
local function getActiveGamepad()
local activeGamepad = nil
local connectedGamepads = UserInputService:GetConnectedGamepads()
if #connectedGamepads > 0 then
for _, gamepad in connectedGamepads do
if activeGamepad == nil or gamepad.Value < activeGamepad.Value then
activeGamepad = gamepad
end
end
end
if activeGamepad == nil then -- Nothing is connected; set up for "Gamepad1"
activeGamepad = Enum.UserInputType.Gamepad1
end
return activeGamepad
end
if UserInputService.GamepadEnabled then
local activeGamepad = getActiveGamepad()
print(activeGamepad)
end

GyroscopeEnabled

Hanya Baca
Tidak Direplikasi
Baca Paralel

Item ini menggambarkan apakah perangkat pengguna memiliki giroskop.

Gyroscope adalah komponen yang ditemukan di kebanyakan perangkat seluler yang mendeteksi orientasi dan kecepatan rotasi.

Jika perangkat pengguna memiliki giroskop, Anda dapat menggunakannya dalam game Anda dengan menggunakan fungsi Class.UserInputService:GetDeviceRotation() dan acara Class.UserInputService.DeviceRotationChanged.


local UserInputService = game:GetService("UserInputService")
local gyroIsEnabled = UserInputService.GyroscopeEnabled
if gyroIsEnabled then
print("Gyroscope is enabled!")
else
print("Gyroscope is not enabled!")
end

Karena UserInputService hanya sisi klien, property ini hanya dapat digunakan dalam LocalScript .

Contoh Kode

Create a Gyroscopic Camera

local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local character = player.CharacterAdded:Wait()
local head = character:WaitForChild("Head")
local camera = workspace.CurrentCamera
local currentRotation = camera.CFrame -- CFrame.new(Vector3.new(0,0,0), Vector3.new(0,0,0))
local lastInputFrame = nil
local upsideDown = false
task.wait()
local orientationSet = false
local function GravityChanged(gravity)
if not orientationSet then
upsideDown = (gravity.Position.X < -0.5 or gravity.Position.Z > 0.5)
orientationSet = true
end
end
local function RotationChanged(_rotation, rotCFrame)
if orientationSet then
if not lastInputFrame then
lastInputFrame = rotCFrame
end
local delta = rotCFrame * lastInputFrame:inverse()
local x, y, z = delta:ToEulerAnglesXYZ()
if upsideDown then
delta = CFrame.Angles(-x, y, z)
else
delta = CFrame.Angles(x, -y, z)
end
currentRotation = currentRotation * delta
lastInputFrame = rotCFrame
end
end
local function HideCharacter()
for _, limb in pairs(character:GetChildren()) do
if limb:IsA("Part") then
limb.Transparency = 1
end
end
end
if UserInputService.GyroscopeEnabled then
UserInputService.DeviceGravityChanged:Connect(GravityChanged)
UserInputService.DeviceRotationChanged:Connect(RotationChanged)
HideCharacter()
RunService:BindToRenderStep("Camera", Enum.RenderPriority.Camera.Value, function()
camera.CFrame = CFrame.new(head.Position - Vector3.new(0, 8, 10)) * currentRotation
camera.Focus = CFrame.new(currentRotation * Vector3.new(0, 0, -10))
end)
end

KeyboardEnabled

Hanya Baca
Tidak Direplikasi
Baca Paralel

Item ini menggambarkan apakah perangkat pengguna memiliki keyboard yang tersedia. Item ini adalah true ketika perangkat pengguna memiliki keyboard yang tersedia, dan false ketika tidak.

Ini dapat digunakan untuk menentukan apakah pengguna memiliki keyboard yang tersedia - yang dapat menjadi penting jika Anda ingin memeriksa apakah Anda dapat menggunakan UserInputService:IsKeyDown() atau UserInputService:GetKeysPressed() untuk memeriksa masukan keyboard.

Karena UserInputService hanya sisi klien, property ini hanya dapat digunakan dalam LocalScript .

Contoh Kode

Check if Keyboard is Enabled

local UserInputService = game:GetService("UserInputService")
if UserInputService.KeyboardEnabled then
print("The user's device has an available keyboard!")
else
print("The user's device does not have an available keyboard!")
end

MouseBehavior

Baca Paralel

Item ini menyetel cara mouse pengguna bertindak berdasarkan Enum.MouseBehavior Enum.Nilai default adalah Enum.MouseBehavior.Default.

Dapat diatur ke tiga nilai:

  1. Standar : Mouse bergerak bebas di sekitar layar pengguna.
  2. LockCenter : Mouse dikunci, dan tidak dapat bergerak dari, pusat layar pengguna.
  3. TandaPosisiSaatIni : Mouse dikunci, dan tidak dapat bergerak dari, posisi saat ini di layar pengguna pada saat menyetel.

Nilai property ini tidak menghasilkan sensitivitas pengukuran gerakan mouse. Misalnya, GetMouseDelta mengembalikan posisi layar Vector2 yang sama dalam pixel, terlepas dari apakah mouse tersebut terkunci atau dapat bergerak bebas di sekitar layar pengguna. Akibatnya, script default se

Elemen ini diatas ditangani jika GuiButton dengan Modal diaktifkan adalah GuiButton.Visible kecuali tombol kanan pemain tidak diaktifkan.

Catat bahwa, jika mouse dikunci, UserInputService.InputChanged masih akan menyala saat pemain menggerakkan mouse dan akan melewati Delta yang mouse mencoba untuk pindahkan. Selain itu, jika pemain diusir dari game, mouse akan dipaksa buka kunci secara otomatis.

Karena UserInputService hanya sisi klien, property ini hanya dapat digunakan dalam LocalScript .

Contoh Kode

Create a Binoculars Script

local UserInputService = game:GetService("UserInputService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local character = player.CharacterAdded:Wait()
local head = character:WaitForChild("Head", false)
local mouse = player:GetMouse()
local zoomed = false
local camera = game.Workspace.CurrentCamera
local target = nil
local originalProperties = {
FieldOfView = nil,
_CFrame = nil,
MouseBehavior = nil,
MouseDeltaSensitivity = nil,
}
local AngleX, TargetAngleX = 0, 0
local AngleY, TargetAngleY = 0, 0
-- Reset camera back to CFrame and FieldOfView before zoom
local function ResetCamera()
target = nil
camera.CameraType = Enum.CameraType.Custom
camera.CFrame = originalProperties._CFrame
camera.FieldOfView = originalProperties.FieldOfView
UserInputService.MouseBehavior = originalProperties.MouseBehavior
UserInputService.MouseDeltaSensitivity = originalProperties.MouseDeltaSensitivity
end
local function ZoomCamera()
-- Allow camera to be changed by script
camera.CameraType = Enum.CameraType.Scriptable
-- Store camera properties before zoom
originalProperties._CFrame = camera.CFrame
originalProperties.FieldOfView = camera.FieldOfView
originalProperties.MouseBehavior = UserInputService.MouseBehavior
originalProperties.MouseDeltaSensitivity = UserInputService.MouseDeltaSensitivity
-- Zoom camera
target = mouse.Hit.Position
local eyesight = head.Position
camera.CFrame = CFrame.new(eyesight, target)
camera.Focus = CFrame.new(target)
camera.FieldOfView = 10
-- Lock and slow down mouse
UserInputService.MouseBehavior = Enum.MouseBehavior.LockCenter
UserInputService.MouseDeltaSensitivity = 1
-- Reset zoom angles
AngleX, TargetAngleX = 0, 0
AngleY, TargetAngleY = 0, 0
end
-- Toggle camera zoom/unzoom
local function MouseClick()
if zoomed then
-- Unzoom camera
ResetCamera()
else
-- Zoom in camera
ZoomCamera()
end
zoomed = not zoomed
end
local function MouseMoved(input)
if zoomed then
local sensitivity = 0.6 -- anything higher would make looking up and down harder; recommend anything between 0~1
local smoothness = 0.05 -- recommend anything between 0~1
local delta = Vector2.new(input.Delta.x / sensitivity, input.Delta.y / sensitivity) * smoothness
local X = TargetAngleX - delta.y
local Y = TargetAngleY - delta.x
TargetAngleX = (X >= 80 and 80) or (X <= -80 and -80) or X
TargetAngleY = (Y >= 80 and 80) or (Y <= -80 and -80) or Y
AngleX = AngleX + (TargetAngleX - AngleX) * 0.35
AngleY = AngleY + (TargetAngleY - AngleY) * 0.15
camera.CFrame = CFrame.new(head.Position, target)
* CFrame.Angles(0, math.rad(AngleY), 0)
* CFrame.Angles(math.rad(AngleX), 0, 0)
end
end
local function InputBegan(input, _gameProcessedEvent)
if input.UserInputType == Enum.UserInputType.MouseButton1 then
MouseClick()
end
end
local function InputChanged(input, _gameProcessedEvent)
if input.UserInputType == Enum.UserInputType.MouseMovement then
MouseMoved(input)
end
end
if UserInputService.MouseEnabled then
UserInputService.InputBegan:Connect(InputBegan)
UserInputService.InputChanged:Connect(InputChanged)
end
Create a Custom CameraScript

local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local Players = game:GetService("Players")
local camera = workspace.CurrentCamera
local player = Players.LocalPlayer
local character = player.CharacterAdded:Wait()
local torso = character:WaitForChild("HumanoidRootPart")
local playerPosition = torso.Position
local default_CameraPosition = torso.Position
local default_CameraRotation = Vector2.new(0, math.rad(-60))
local default_CameraZoom = 15
local cameraPosition = default_CameraPosition
local cameraRotation = default_CameraRotation
local cameraZoom = default_CameraZoom
local cameraZoomBounds = nil -- {10,200}
local cameraRotateSpeed = 10
local cameraMouseRotateSpeed = 0.25
local cameraTouchRotateSpeed = 10
local function SetCameraMode()
camera.CameraType = "Scriptable"
camera.FieldOfView = 80
camera.CameraSubject = nil
end
local function UpdateCamera()
SetCameraMode()
local cameraRotationCFrame = CFrame.Angles(0, cameraRotation.X, 0) * CFrame.Angles(cameraRotation.Y, 0, 0)
camera.CFrame = cameraRotationCFrame + cameraPosition + cameraRotationCFrame * Vector3.new(0, 0, cameraZoom)
camera.Focus = camera.CFrame - Vector3.new(0, camera.CFrame.p.Y, 0)
end
local lastTouchTranslation = nil
local function TouchMove(_touchPositions, totalTranslation, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = totalTranslation - lastTouchTranslation
cameraPosition = cameraPosition + Vector3.new(difference.X, 0, difference.Y)
UpdateCamera()
end
lastTouchTranslation = totalTranslation
end
local lastTouchRotation = nil
local function TouchRotate(_touchPositions, rotation, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = rotation - lastTouchRotation
cameraRotation = cameraRotation
+ Vector2.new(-difference, 0) * math.rad(cameraTouchRotateSpeed * cameraRotateSpeed)
UpdateCamera()
end
lastTouchRotation = rotation
end
local lastTouchScale = nil
local function TouchZoom(_touchPositions, scale, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = scale - lastTouchScale
cameraZoom = cameraZoom * (1 + difference)
if cameraZoomBounds ~= nil then
cameraZoom = math.min(math.max(cameraZoom, cameraZoomBounds[1]), cameraZoomBounds[2])
else
cameraZoom = math.max(cameraZoom, 0)
end
UpdateCamera()
end
lastTouchScale = scale
end
local function Input(inputObject)
if inputObject.UserInputType == Enum.UserInputType.Keyboard then
if inputObject.UserInputState == Enum.UserInputState.Begin then
-- (I) Zoom In
if inputObject.KeyCode == Enum.KeyCode.I then
cameraZoom = cameraZoom - 15
elseif inputObject.KeyCode == Enum.KeyCode.O then
cameraZoom = cameraZoom + 15
end
-- (O) Zoom Out
if cameraZoomBounds ~= nil then
cameraZoom = math.min(math.max(cameraZoom, cameraZoomBounds[1]), cameraZoomBounds[2])
else
cameraZoom = math.max(cameraZoom, 0)
end
UpdateCamera()
end
end
local pressed = UserInputService:IsMouseButtonPressed(Enum.UserInputType.MouseButton1)
if pressed then
UserInputService.MouseBehavior = Enum.MouseBehavior.LockCurrentPosition
local rotation = UserInputService:GetMouseDelta()
cameraRotation = cameraRotation + rotation * math.rad(cameraMouseRotateSpeed)
else
UserInputService.MouseBehavior = Enum.MouseBehavior.Default
end
end
local function PlayerChanged()
local movement = torso.Position - playerPosition
cameraPosition = cameraPosition + movement
playerPosition = torso.Position
UpdateCamera()
end
-- Determine whether the user is on a mobile device
if UserInputService.TouchEnabled then
-- The user is on a mobile device, use Touch events
UserInputService.TouchPan:Connect(TouchMove)
UserInputService.TouchRotate:Connect(TouchRotate)
UserInputService.TouchPinch:Connect(TouchZoom)
else
-- The user is not on a mobile device use Input events
UserInputService.InputBegan:Connect(Input)
UserInputService.InputChanged:Connect(Input)
UserInputService.InputEnded:Connect(Input)
-- Camera controlled by player movement
task.wait(2)
RunService:BindToRenderStep("PlayerChanged", Enum.RenderPriority.Camera.Value - 1, PlayerChanged)
end

MouseDeltaSensitivity

Tidak Direplikasi
Baca Paralel

Item ini menentukan sensitivitas Mouse pengguna.

Sensitivitas menentukan tingkatan di mana gerakan mouse fisik Anda diterjemahkan ke gerakan mouse dalam game. Ini dapat digunakan untuk menyesuaikan seberapa sensitif acara melacak gerakan mouse, seperti GetMouseDelta , gerakan mouse.

Properti ini tidak mengubah gerakan mouse ikon. Norotnya juga tidak mengubah pengaturan Sensitivitas Kamera yang ditemukan di tab Pengaturan dari Pengaturan menu klien, yang juga menyesuaikan sensitivitas gerakan mouse.

Item ini memiliki nilai maksimum 10 dan nilai minimum 0. Sebuah nilai yang lebih rendah sesuai dengan sensitivitas yang lebih rendah, dan nilai yang lebih tinggi untuk sensitivitas yang lebih tinggi.

Ketika sensitivitas adalah 0, acara yang melacak gerakan mouse masih akan menembak tetapi semua parameter dan proporsi yang menunjukkan perubahan posisi mouse akan kembali Vector2.new() , atau Vector3.new() dalam k

Contoh Kode

Create a Binoculars Script

local UserInputService = game:GetService("UserInputService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local character = player.CharacterAdded:Wait()
local head = character:WaitForChild("Head", false)
local mouse = player:GetMouse()
local zoomed = false
local camera = game.Workspace.CurrentCamera
local target = nil
local originalProperties = {
FieldOfView = nil,
_CFrame = nil,
MouseBehavior = nil,
MouseDeltaSensitivity = nil,
}
local AngleX, TargetAngleX = 0, 0
local AngleY, TargetAngleY = 0, 0
-- Reset camera back to CFrame and FieldOfView before zoom
local function ResetCamera()
target = nil
camera.CameraType = Enum.CameraType.Custom
camera.CFrame = originalProperties._CFrame
camera.FieldOfView = originalProperties.FieldOfView
UserInputService.MouseBehavior = originalProperties.MouseBehavior
UserInputService.MouseDeltaSensitivity = originalProperties.MouseDeltaSensitivity
end
local function ZoomCamera()
-- Allow camera to be changed by script
camera.CameraType = Enum.CameraType.Scriptable
-- Store camera properties before zoom
originalProperties._CFrame = camera.CFrame
originalProperties.FieldOfView = camera.FieldOfView
originalProperties.MouseBehavior = UserInputService.MouseBehavior
originalProperties.MouseDeltaSensitivity = UserInputService.MouseDeltaSensitivity
-- Zoom camera
target = mouse.Hit.Position
local eyesight = head.Position
camera.CFrame = CFrame.new(eyesight, target)
camera.Focus = CFrame.new(target)
camera.FieldOfView = 10
-- Lock and slow down mouse
UserInputService.MouseBehavior = Enum.MouseBehavior.LockCenter
UserInputService.MouseDeltaSensitivity = 1
-- Reset zoom angles
AngleX, TargetAngleX = 0, 0
AngleY, TargetAngleY = 0, 0
end
-- Toggle camera zoom/unzoom
local function MouseClick()
if zoomed then
-- Unzoom camera
ResetCamera()
else
-- Zoom in camera
ZoomCamera()
end
zoomed = not zoomed
end
local function MouseMoved(input)
if zoomed then
local sensitivity = 0.6 -- anything higher would make looking up and down harder; recommend anything between 0~1
local smoothness = 0.05 -- recommend anything between 0~1
local delta = Vector2.new(input.Delta.x / sensitivity, input.Delta.y / sensitivity) * smoothness
local X = TargetAngleX - delta.y
local Y = TargetAngleY - delta.x
TargetAngleX = (X >= 80 and 80) or (X <= -80 and -80) or X
TargetAngleY = (Y >= 80 and 80) or (Y <= -80 and -80) or Y
AngleX = AngleX + (TargetAngleX - AngleX) * 0.35
AngleY = AngleY + (TargetAngleY - AngleY) * 0.15
camera.CFrame = CFrame.new(head.Position, target)
* CFrame.Angles(0, math.rad(AngleY), 0)
* CFrame.Angles(math.rad(AngleX), 0, 0)
end
end
local function InputBegan(input, _gameProcessedEvent)
if input.UserInputType == Enum.UserInputType.MouseButton1 then
MouseClick()
end
end
local function InputChanged(input, _gameProcessedEvent)
if input.UserInputType == Enum.UserInputType.MouseMovement then
MouseMoved(input)
end
end
if UserInputService.MouseEnabled then
UserInputService.InputBegan:Connect(InputBegan)
UserInputService.InputChanged:Connect(InputChanged)
end

MouseEnabled

Hanya Baca
Tidak Direplikasi
Baca Paralel

Item ini menggambarkan apakah perangkat pengguna memiliki mouse yang tersedia. Item ini adalah true ketika perangkat pengguna memiliki mouse yang tersedia, dan false ketika tidak.


local UserInputService = game:GetService("UserInputService")
if UserInputService.MouseEnabled then
print("The user's device has an available mouse!")
else
print("The user's device does not have an available mouse!")
end

Sangat penting untuk memeriksa ini sebelum menggunakan fungsi mouse seperti UserInputService .

Karena UserInputService hanya sisi klien, property ini hanya dapat digunakan dalam LocalScript .

Lihat juga:

Contoh Kode

Create a Binoculars Script

local UserInputService = game:GetService("UserInputService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local character = player.CharacterAdded:Wait()
local head = character:WaitForChild("Head", false)
local mouse = player:GetMouse()
local zoomed = false
local camera = game.Workspace.CurrentCamera
local target = nil
local originalProperties = {
FieldOfView = nil,
_CFrame = nil,
MouseBehavior = nil,
MouseDeltaSensitivity = nil,
}
local AngleX, TargetAngleX = 0, 0
local AngleY, TargetAngleY = 0, 0
-- Reset camera back to CFrame and FieldOfView before zoom
local function ResetCamera()
target = nil
camera.CameraType = Enum.CameraType.Custom
camera.CFrame = originalProperties._CFrame
camera.FieldOfView = originalProperties.FieldOfView
UserInputService.MouseBehavior = originalProperties.MouseBehavior
UserInputService.MouseDeltaSensitivity = originalProperties.MouseDeltaSensitivity
end
local function ZoomCamera()
-- Allow camera to be changed by script
camera.CameraType = Enum.CameraType.Scriptable
-- Store camera properties before zoom
originalProperties._CFrame = camera.CFrame
originalProperties.FieldOfView = camera.FieldOfView
originalProperties.MouseBehavior = UserInputService.MouseBehavior
originalProperties.MouseDeltaSensitivity = UserInputService.MouseDeltaSensitivity
-- Zoom camera
target = mouse.Hit.Position
local eyesight = head.Position
camera.CFrame = CFrame.new(eyesight, target)
camera.Focus = CFrame.new(target)
camera.FieldOfView = 10
-- Lock and slow down mouse
UserInputService.MouseBehavior = Enum.MouseBehavior.LockCenter
UserInputService.MouseDeltaSensitivity = 1
-- Reset zoom angles
AngleX, TargetAngleX = 0, 0
AngleY, TargetAngleY = 0, 0
end
-- Toggle camera zoom/unzoom
local function MouseClick()
if zoomed then
-- Unzoom camera
ResetCamera()
else
-- Zoom in camera
ZoomCamera()
end
zoomed = not zoomed
end
local function MouseMoved(input)
if zoomed then
local sensitivity = 0.6 -- anything higher would make looking up and down harder; recommend anything between 0~1
local smoothness = 0.05 -- recommend anything between 0~1
local delta = Vector2.new(input.Delta.x / sensitivity, input.Delta.y / sensitivity) * smoothness
local X = TargetAngleX - delta.y
local Y = TargetAngleY - delta.x
TargetAngleX = (X >= 80 and 80) or (X <= -80 and -80) or X
TargetAngleY = (Y >= 80 and 80) or (Y <= -80 and -80) or Y
AngleX = AngleX + (TargetAngleX - AngleX) * 0.35
AngleY = AngleY + (TargetAngleY - AngleY) * 0.15
camera.CFrame = CFrame.new(head.Position, target)
* CFrame.Angles(0, math.rad(AngleY), 0)
* CFrame.Angles(math.rad(AngleX), 0, 0)
end
end
local function InputBegan(input, _gameProcessedEvent)
if input.UserInputType == Enum.UserInputType.MouseButton1 then
MouseClick()
end
end
local function InputChanged(input, _gameProcessedEvent)
if input.UserInputType == Enum.UserInputType.MouseMovement then
MouseMoved(input)
end
end
if UserInputService.MouseEnabled then
UserInputService.InputBegan:Connect(InputBegan)
UserInputService.InputChanged:Connect(InputChanged)
end

MouseIcon

ContentId
Baca Paralel

Properti MouseIcon menentukan gambar yang digunakan sebagai poin pengacara. Jika kosong, panah default digunakan. Saat cursor menyentuh objek UI tertentu seperti ImageButton , TextButton , 1> Class.Loaded1> , atau 4> Class.Pro

Untuk menyembunyikan seluruh kurungan, lakukan tidak menggunakan gambar transparan. Sebaliknya, tetapkan UserInputService.MouseIconEnabled ke false.

Contoh Kode

UserInputService.MouseIcon

local UserInputService = game:GetService("UserInputService")
-- In order to restore the cursor to what it was set to previously, it will need to be saved to a variable
local savedCursor = nil
local function setTemporaryCursor(cursor: string)
-- Only update the saved cursor if it's not currently saved
if not savedCursor then
savedCursor = UserInputService.MouseIcon
end
UserInputService.MouseIcon = cursor
end
local function clearTemporaryCursor()
-- Only restore the mouse cursor if there's a saved cursor to restore
if savedCursor then
UserInputService.MouseIcon = savedCursor
-- Don't restore the same cursor twice (might overwrite another script)
savedCursor = nil
end
end
setTemporaryCursor("http://www.roblox.com/asset?id=163023520")
print(UserInputService.MouseIcon)
clearTemporaryCursor()
print(UserInputService.MouseIcon)

MouseIconEnabled

Baca Paralel

Item ini menentukan apakah ikon Mouse terlihat ketika true ikon mouse terlihat, ketika false tidak.

Misalnya, potongan kode di bawah ini menyembunyikan ikon mouse.


local UserInputService = game:GetService("UserInputService")
UserInputService.MouseIconEnabled = false

Karena UserInputService hanya sisi klien, property ini hanya dapat digunakan dalam LocalScript .

Contoh Kode

Hide Mouse During Keyboard Input

local UserInputService = game:GetService("UserInputService")
local mouseInput = {
Enum.UserInputType.MouseButton1,
Enum.UserInputType.MouseButton2,
Enum.UserInputType.MouseButton3,
Enum.UserInputType.MouseMovement,
Enum.UserInputType.MouseWheel,
}
local keyboard = Enum.UserInputType.Keyboard
local function toggleMouse(lastInputType)
if lastInputType == keyboard then
UserInputService.MouseIconEnabled = false
return
end
for _, mouse in pairs(mouseInput) do
if lastInputType == mouse then
UserInputService.MouseIconEnabled = true
return
end
end
end
UserInputService.LastInputTypeChanged:Connect(toggleMouse)

OnScreenKeyboardPosition

Hanya Baca
Tidak Direplikasi
Baca Paralel

Elemen ini menggambarkan posisi keyboard on-screen dalam pixel. Posisi keyboard adalah Vector2.new(0, 0) ketika tidak terlihat.

Karena UserInputService hanya sisi klien, property ini hanya dapat digunakan dalam LocalScript , atau Script dengan 1> Class.BaseScript.RunContext|RunContext1> set ke 4> Enum.RunContext.Client4> .

Lihat juga OnScreenKeyboardVisible dan OnScreenKeyboardSize .

Contoh Kode

UserInputService.OnScreenKeyboardPosition

local UserInputService = game:GetService("UserInputService")
print(UserInputService.OnScreenKeyboardPosition)

OnScreenKeyboardSize

Hanya Baca
Tidak Direplikasi
Baca Paralel

Elemen ini menggambarkan ukuran keyboard on-screen dalam pixel. Ukuran keyboard adalah Vector2.new(0, 0) saat tidak terlihat.

Karena UserInputService hanya sisi klien, property ini hanya dapat digunakan dalam LocalScript , atau Script dengan 1> Class.BaseScript.RunContext|RunContext1> set ke 4> Enum.RunContext.Client4> .

Lihat juga OnScreenKeyboardVisible dan OnScreenKeyboardPosition .

OnScreenKeyboardVisible

Hanya Baca
Tidak Direplikasi
Baca Paralel

Item ini menggambarkan apakah keyboard on-screen saat ini tampaknya di layar pengguna.

Karena UserInputService hanya sisi klien, property ini hanya dapat digunakan dalam LocalScript , atau Script dengan 1> Class.BaseScript.RunContext|RunContext1> set ke 4> Enum.RunContext.Client4> .

Lihat juga OnScreenKeyboardSize dan OnScreenKeyboardPosition .

TouchEnabled

Hanya Baca
Tidak Direplikasi
Baca Paralel

Item ini menggambarkan apakah perangkat pengguna saat ini memiliki layar sentuh yang tersedia.

Properti digunakan untuk menentukan apakah perangkat pengguna memiliki layar sentuh, dan oleh karena itu apakah acara sentuh akan diaktifkan. Jika TouchEnabled benar, Anda dapat menggunakan acara UserInputService seperti UserInputService.TouchStarted dan UserInputService.TouchEnded untuk melacak ketika pengguna memulai dan berhenti menyentuh

Potongan kode di bawah ini menunjukkan apakah perangkat pengguna memiliki layar sentuh.


local UserInputService = game:GetService("UserInputService")
if UserInputService.TouchEnabled then
print("The user's device has a touchscreen!")
else
print("The user's device does not have a touchscreen!")
end

Lihat juga:

Contoh Kode

Create a Custom CameraScript

local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local Players = game:GetService("Players")
local camera = workspace.CurrentCamera
local player = Players.LocalPlayer
local character = player.CharacterAdded:Wait()
local torso = character:WaitForChild("HumanoidRootPart")
local playerPosition = torso.Position
local default_CameraPosition = torso.Position
local default_CameraRotation = Vector2.new(0, math.rad(-60))
local default_CameraZoom = 15
local cameraPosition = default_CameraPosition
local cameraRotation = default_CameraRotation
local cameraZoom = default_CameraZoom
local cameraZoomBounds = nil -- {10,200}
local cameraRotateSpeed = 10
local cameraMouseRotateSpeed = 0.25
local cameraTouchRotateSpeed = 10
local function SetCameraMode()
camera.CameraType = "Scriptable"
camera.FieldOfView = 80
camera.CameraSubject = nil
end
local function UpdateCamera()
SetCameraMode()
local cameraRotationCFrame = CFrame.Angles(0, cameraRotation.X, 0) * CFrame.Angles(cameraRotation.Y, 0, 0)
camera.CFrame = cameraRotationCFrame + cameraPosition + cameraRotationCFrame * Vector3.new(0, 0, cameraZoom)
camera.Focus = camera.CFrame - Vector3.new(0, camera.CFrame.p.Y, 0)
end
local lastTouchTranslation = nil
local function TouchMove(_touchPositions, totalTranslation, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = totalTranslation - lastTouchTranslation
cameraPosition = cameraPosition + Vector3.new(difference.X, 0, difference.Y)
UpdateCamera()
end
lastTouchTranslation = totalTranslation
end
local lastTouchRotation = nil
local function TouchRotate(_touchPositions, rotation, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = rotation - lastTouchRotation
cameraRotation = cameraRotation
+ Vector2.new(-difference, 0) * math.rad(cameraTouchRotateSpeed * cameraRotateSpeed)
UpdateCamera()
end
lastTouchRotation = rotation
end
local lastTouchScale = nil
local function TouchZoom(_touchPositions, scale, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = scale - lastTouchScale
cameraZoom = cameraZoom * (1 + difference)
if cameraZoomBounds ~= nil then
cameraZoom = math.min(math.max(cameraZoom, cameraZoomBounds[1]), cameraZoomBounds[2])
else
cameraZoom = math.max(cameraZoom, 0)
end
UpdateCamera()
end
lastTouchScale = scale
end
local function Input(inputObject)
if inputObject.UserInputType == Enum.UserInputType.Keyboard then
if inputObject.UserInputState == Enum.UserInputState.Begin then
-- (I) Zoom In
if inputObject.KeyCode == Enum.KeyCode.I then
cameraZoom = cameraZoom - 15
elseif inputObject.KeyCode == Enum.KeyCode.O then
cameraZoom = cameraZoom + 15
end
-- (O) Zoom Out
if cameraZoomBounds ~= nil then
cameraZoom = math.min(math.max(cameraZoom, cameraZoomBounds[1]), cameraZoomBounds[2])
else
cameraZoom = math.max(cameraZoom, 0)
end
UpdateCamera()
end
end
local pressed = UserInputService:IsMouseButtonPressed(Enum.UserInputType.MouseButton1)
if pressed then
UserInputService.MouseBehavior = Enum.MouseBehavior.LockCurrentPosition
local rotation = UserInputService:GetMouseDelta()
cameraRotation = cameraRotation + rotation * math.rad(cameraMouseRotateSpeed)
else
UserInputService.MouseBehavior = Enum.MouseBehavior.Default
end
end
local function PlayerChanged()
local movement = torso.Position - playerPosition
cameraPosition = cameraPosition + movement
playerPosition = torso.Position
UpdateCamera()
end
-- Determine whether the user is on a mobile device
if UserInputService.TouchEnabled then
-- The user is on a mobile device, use Touch events
UserInputService.TouchPan:Connect(TouchMove)
UserInputService.TouchRotate:Connect(TouchRotate)
UserInputService.TouchPinch:Connect(TouchZoom)
else
-- The user is not on a mobile device use Input events
UserInputService.InputBegan:Connect(Input)
UserInputService.InputChanged:Connect(Input)
UserInputService.InputEnded:Connect(Input)
-- Camera controlled by player movement
task.wait(2)
RunService:BindToRenderStep("PlayerChanged", Enum.RenderPriority.Camera.Value - 1, PlayerChanged)
end

VREnabled

Hanya Baca
Tidak Direplikasi
Baca Paralel

Item ini menggambarkan apakah pengguna menggunakan perangkat kenyataan virtual (VR).

Jika perangkat VR diaktifkan, Anda dapat berinteraksi dengan lokasi dan gerakannya melalui fungsi seperti UserInputService:GetUserCFrame() . Anda juga dapat bereaksi terhadap gerakan perangkat VR menggunakan acara UserInputService.UserCFrameChanged.


local UserInputService = game:GetService("UserInputService")
local isUsingVR = UserInputService.VREnabled
if isUsingVR then
print("User is using a VR headset!")
else
print("User is not using a VR headset!")
end

Karena UserInputService hanya sisi klien, property ini hanya dapat digunakan dalam LocalScript .

Lihat juga:

Contoh Kode

VR Head Tracking

local VRService = game:GetService("VRService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local character = player.CharacterAdded:Wait()
local head = character:WaitForChild("Head")
local function TrackHead(inputType, value)
if inputType == Enum.UserCFrame.Head then
head.CFrame = value
end
end
if VRService.VREnabled then
-- Set the initial CFrame
head.CFrame = VRService:GetUserCFrame(Enum.UserCFrame.Head)
-- Track VR headset movement and mirror for character's head
VRService.UserCFrameChanged:Connect(TrackHead)
end

Metode

GamepadSupports

Fungsi ini menentukan apakah gamepad yang diberikan Enum.UserInputType mendukung tombol yang sesuai dengan Enum.KeyCode yang diberikan. Fungsi ini digunakan untuk menentukan masukan gamepad yang valid.

Untuk menentukan gamepad mana yang terhubung, gunakan Enum.UserInputType.

Karena UserInputService hanya sisi klien, fungsi ini hanya dapat digunakan di LocalScript .

Lihat juga:

Parameter

gamepadNum: Enum.UserInputType

The Enum.UserInputType of the gamepad.

gamepadKeyCode: Enum.KeyCode

The Enum.KeyCode of the button in question.


Memberikan nilai

Apakah gamepad yang diberikan mendukung tombol yang sesuai dengan Enum.KeyCode yang diberikan.

Contoh Kode

Binding Functions to Gamepad Controls

local UserInputService = game:GetService("UserInputService")
local ContextActionService = game:GetService("ContextActionService")
local controller = Enum.UserInputType.Gamepad1
local buttonX = Enum.KeyCode.ButtonX
local function isSupported(gamepad, keycode)
return UserInputService:GamepadSupports(gamepad, keycode)
end
local function action()
print("Action")
end
if isSupported(controller, buttonX) then
ContextActionService:BindAction("sample action", action, false, buttonX)
end

GetConnectedGamepads

Fungsi ini mengembalikan matriks Enum.UserInputType gamepad saat ini yang terhubung. Jika tidak ada gamepad yang terhubung, matriks ini akan kosong. Selain itu, itu hanya mengembalikan objek Gamepad1 yang terhubung tetapi bukan objek Keyboard. kejadian, acara ini akan mengembalikan objek Gamepad1 yang terhubung tetapi bukan objek Keyboard.

Misalnya, kode berikut mengekstraksi gamepad yang terhubung dan menyimpannya dalam variabel bernama connectedGamepads .


local UserInputService = game:GetService("UserInputService")
local connectedGamepads = UserInputService:GetConnectedGamepads()

Untuk memeriksa apakah gamepad khusus terhubung, gunakan UserInputService:GetGamepadConnected() .

Karena UserInputService hanya sisi klien, fungsi ini hanya dapat digunakan di LocalScript .

Lihat juga:


Memberikan nilai

Sebuah matriks dari UserInputTypes yang sesuai dengan gamepad yang terhubung ke perangkat pengguna.

Contoh Kode

How to Set the Active Gamepad for Input

local UserInputService = game:GetService("UserInputService")
local function getActiveGamepad()
local activeGamepad = nil
local connectedGamepads = UserInputService:GetConnectedGamepads()
if #connectedGamepads > 0 then
for _, gamepad in connectedGamepads do
if activeGamepad == nil or gamepad.Value < activeGamepad.Value then
activeGamepad = gamepad
end
end
end
if activeGamepad == nil then -- Nothing is connected; set up for "Gamepad1"
activeGamepad = Enum.UserInputType.Gamepad1
end
return activeGamepad
end
if UserInputService.GamepadEnabled then
local activeGamepad = getActiveGamepad()
print(activeGamepad)
end

GetDeviceAcceleration

Fungsi GetDeviceAcceleration menentukan akselerasi saat ini dari perangkat pengguna. Ini mengembalikan InputObject yang menggambarkan akselerasi saat ini perangkat.

Untuk memastikan ini berfungsi, perangkat pengguna harus memiliki accelerometer yang diaktifkan. Untuk memeriksa apakah perangkat pengguna memiliki accelerometer yang diaktifkan, Anda dapat mengecek propinsi UserInputService.AccelerometerEnabled.

Jika Anda ingin melacak ketika percepatan perangkat pengguna berubah sebagai gantinya, Anda dapat menggunakan acara UserInputService.DeviceAccelerationChanged.

Karena hanya mengeksekusi lokal, itu hanya dapat digunakan dalam LocalScript .


Memberikan nilai

Contoh Kode

Print Device Acceleration

local UserInputService = game:GetService("UserInputService")
local accelerometerEnabled = UserInputService.AccelerometerEnabled
if accelerometerEnabled then
local acceleration = UserInputService:GetDeviceAcceleration().Position
print(acceleration)
else
print("Cannot get device acceleration because device does not have an enabled accelerometer!")
end

GetDeviceGravity

Fungsi ini mengembalikan InputObject yang menggambarkan vektor gravitasi perangkat saat ini.

Vektor gravitasi ditentukan oleh orientasi perangkat terhadap kekuatan gravitasi dunia nyata. kejadian, jika perangkat benar-benar tegak (portrait), vektor gravitasi adalah Vector3.new(0, 0, -9.18) . Jika sisi kiri perang

Fungsi ini dapat digunakan untuk mengaktifkan perangkat pengguna untuk berdampak atau mengontrol gravitasi dalam game atau pindahkan objek dalam game seperti bola.

Gravitasi hanya diperhatikan untuk pemain yang menggunakan perangkat dengan giroskop yang aktif - seperti perangkat seluler.

Untuk memeriksa apakah perangkat pengguna memiliki Gyroscope yang diaktifkan, periksa nilai dari UserInputService.GyroscopeEnabled . Jika perangkat memiliki Gyroscope yang diaktifkan, Anda juga dapat menggunakan acara UserInputService.DeviceGravityChanged untuk melacak ketika kekuatan gravitasi pada perangkat pengguna berubah.

Karena UserInputService hanya sisi klien, fungsi ini hanya dapat digunakan di LocalScript .


Memberikan nilai

Contoh Kode

Moving Objects with the Gyroscope

local UserInputService = game:GetService("UserInputService")
local bubble = script.Parent:WaitForChild("Bubble")
local camera = workspace.CurrentCamera
camera.CameraType = Enum.CameraType.Scriptable
camera.CFrame = CFrame.new(0, 20, 0) * CFrame.Angles(-math.pi / 2, 0, 0)
if UserInputService.GyroscopeEnabled then
-- Bind event to when gyroscope detects change
UserInputService.DeviceGravityChanged:Connect(function(accel)
-- Move the bubble in the world based on the gyroscope data
bubble.Position = Vector3.new(-8 * accel.Position.X, 1.8, -8 * accel.Position.Z)
end)
end

GetDeviceRotation

Fungsi ini mengembalikan InputObject dan CFrame yang menggambarkan vektor rotasi perangkat saat ini.

Ini diaktifkan dengan sebuah ObjectInput. Propinsi Posisi dari objek input adalah Enum.InputType.Gyroscope yang melacak rotasi total di setiap sumbu perangkat lokal.

Rotasi perangkat hanya dapat diperbarui di perangkat dengan gyroscope.

Karena fungsi ini mengeksekusi lokal, itu hanya dapat digunakan dalam LocalScript .


Memberikan nilai

Template yang berisi dua propinsi:

  1. Propinsi Delta menjelaskan jumlah rotasi yang terakhir terjadi
  2. CFrame adalah rotasi saat ini perangkat berdasarkan referensi referensi defaultnya.

Contoh Kode

Print Device Rotation

local UserInputService = game:GetService("UserInputService")
local gyroEnabled = UserInputService:GyroscopeEnabled()
if gyroEnabled then
local _inputObj, cframe = UserInputService:GetDeviceRotation()
print("CFrame: {", cframe, "}")
else
print("Cannot get device rotation because device does not have an enabled gyroscope!")
end

GetFocusedTextBox

Fungsi ini mengembalikan TextBox yang dikonsentrasikan klien saat ini. Sebuah TextBox dapat dipilih secara manual oleh pengguna, atau pemilihan dapat dipaksa menggunakan fungsi TextBox:CaptureFocus(). Jika tidak ada TextBox yang dipilih, fungsi ini akan mengembalikan nol.

Karena UserInputService hanya sisi klien, fungsi ini hanya dapat digunakan di LocalScript .

Lihat juga:


Memberikan nilai

Contoh Kode

Ignore User Input When a TextBox Is Focused

local UserInputService = game:GetService("UserInputService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local character = player.Character or player.CharacterAdded:Wait()
local humanoid = character:WaitForChild("Humanoid")
local jumpKey = Enum.KeyCode.J
local isJumping = false
local function InputBegan(input, _gameProcessedEvent)
local TextBoxFocused = UserInputService:GetFocusedTextBox()
-- Ignore input event if player is focusing on a TextBox
if TextBoxFocused then
return
end
-- Make player jump when user presses jumpKey Key on Keyboard
if input.UserInputType == Enum.UserInputType.Keyboard and input.KeyCode == jumpKey then
if not isJumping then
isJumping = true
humanoid:ChangeState(Enum.HumanoidStateType.Jumping)
end
end
end
local function StateChanged(_oldState, newState)
-- Prevent player from jumping again using jumpKey if already jumping
if newState == Enum.HumanoidStateType.Jumping then
isJumping = true
-- Allow player to jump again after landing
elseif newState == Enum.HumanoidStateType.Landed then
isJumping = false
end
end
UserInputService.InputBegan:Connect(InputBegan)
humanoid.StateChanged:Connect(StateChanged)

GetGamepadConnected

Fungsi ini mengembalikan apakah gamepad dengan Enum.UserInputType yang diberikan terhubung ke klien.

Ini dapat digunakan untuk memeriksa apakah gamepad khusus, seperti 'Gamepad1' terhubung ke perangkat klien.

Untuk mengambil daftar semua gamepad yang terhubung, gunakan UserInputService:GetConnectedGamepads() .

Karena UserInputService hanya sisi klien, fungsi ini hanya dapat digunakan di LocalScript .

Lihat juga:

Parameter

gamepadNum: Enum.UserInputType

The Enum.UserInputType of the gamepad dalam pertanyaan.


Memberikan nilai

Apakah gamepad yang dikaitkan dengan Enum.UserInputType terhubung.

Contoh Kode

Check Whether a Gamepad is Connected

local UserInputService = game:GetService("UserInputService")
local isConnected = UserInputService:GetGamepadConnected(Enum.UserInputType.Gamepad1)
if isConnected then
print("Gamepad1 is connected to the client")
else
print("Gamepad1 is not connected to the client")
end

GetGamepadState

Fungsi ini mengembalikan matriks InputObjects untuk semua masukan yang tersedia di gamepad Enum.UserInputType yang diberikan, mewakili setiap negara masukan terakhir.

Untuk menemukan UserInputTypes dari gamepad yang terhubung, gunakan UserInputService:GetConnectedGamepads().

Karena fungsi ini hanya dijalankan lokal, itu hanya dapat digunakan dalam LocalScript .

Lihat juga:

Parameter

gamepadNum: Enum.UserInputType

The Enum.UserInputType yang sesuai dengan gamepad dalam pertanyaan.


Memberikan nilai

Sebuah matriksi dari InputObjects mewakili kondisi saat ini dari semua masukan yang tersedia untuk gamepad yang diberikan.

GetImageForKeyCode

ContentId

Metode ini mengambil Enum.KeyCode yang diminta dan mengembalikan gambar yang terkait untuk perangkat gamepad saat ini yang terhubung (terbatas pada Xbox, PlayStation, dan Windows). Ini berarti bahwa jika kontroler terhubung adalah kontroler Xbox, pengguna melihat aset Xbox. Demikian pula, jika perangkat ter

Parameter

keyCode: Enum.KeyCode

The Enum.KeyCode untuk which to fetch the image yang terkait.


Memberikan nilai

ContentId

ID aset gambar yang dikembalikan.

Contoh Kode

UserInputService - Get Image For KeyCode

local UserInputService = game:GetService("UserInputService")
local imageLabel = script.Parent
local key = Enum.KeyCode.ButtonA
local mappedIconImage = UserInputService:GetImageForKeyCode(key)
imageLabel.Image = mappedIconImage

GetKeysPressed

Fungsi ini mengembalikan matriksi InputObjects yang terkait dengan tombol yang saat ini ditekan.

배열 ini dapat diulang melalui untuk menentukan mana tombol yang saat ini ditekan, menggunakan nilai InputObject.KeyCode.

Untuk memeriksa apakah tombol khusus dipukul, gunakan UserInputService:IsKeyDown().

Karena UserInputService hanya sisi klien, fungsi ini hanya dapat digunakan di LocalScript .


Memberikan nilai

Sebuah matriks InputObjects yang terkait dengan tombol saat ini ditekan.

Contoh Kode

Double Jump Key Combo

local UserInputService = game:GetService("UserInputService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local character = player.Character or player.CharacterAdded:Wait()
local humanoid = character:WaitForChild("Humanoid")
local actionKey = Enum.KeyCode.LeftShift
local canJump = true
local canDoubleJump = false
local function jumpRequest()
local keysPressed = UserInputService:GetKeysPressed()
for _, key in ipairs(keysPressed) do
if key.KeyCode == actionKey and canJump then
canJump = false
canDoubleJump = true
end
end
end
local function stateChanged(oldState, newState)
-- Double jump during freefall if able to
if oldState == Enum.HumanoidStateType.Jumping and newState == Enum.HumanoidStateType.Freefall and canDoubleJump then
canDoubleJump = false
task.wait(0.2)
humanoid:ChangeState(Enum.HumanoidStateType.Jumping)
end
-- Allow player to jump again after they land
if oldState == Enum.HumanoidStateType.Freefall and newState == Enum.HumanoidStateType.Landed then
canJump = true
end
end
UserInputService.JumpRequest:Connect(jumpRequest)
humanoid.StateChanged:Connect(stateChanged)

GetLastInputType

Fungsi ini mengembalikan 'enum.UserInputType' yang terkait dengan input terbaru pengguna.

Misalnya, jika masukan sebelumnya pengguna telah menekan tombol spasi, maka Enum.UserInputType yang dikembalikan akan menjadi 'Keyboard'.

Acara UserInputService.LastInputTypeChanged dapat digunakan untuk melacak kapan Enum.UserInputType terakhir yang digunakan oleh pengguna berubah.

Karena UserInputService hanya sisi klien, fungsi ini hanya dapat digunakan di LocalScript .


Memberikan nilai

Menu.UserInputType yang terkait dengan masukan terbaru pengguna.

Contoh Kode

UserInputService:GetLastInputType

local UserInputService = game:GetService("UserInputService")
local lastInput = UserInputService:GetLastInputType()
if lastInput == Enum.UserInputType.Keyboard then
print("Most recent input was via keyboard")
end

GetMouseButtonsPressed

Fungsi ini mengembalikan matriks InputObjects yang sesuai dengan tombol mouse saat ini ditekan.

Tombol mouse yang ditrack oleh fungsi ini termasuk:


<tr>
<td>Tombol Tikus1</td>
<td>Tombol kiri mouse.</td>
</tr>
<tr>
<td>Tombol Tikus 2</td>
<td>Tombol kanan tikus.</td>
</tr>
<tr>
<td>Tombol Tikus3</td>
<td>Tombol tengah mouse.</td>
</tr>
NamaDeskripsi

Jika pengguna tidak menekan tombol mouse apa pun saat fungsi dianggil, itu akan mengembalikan array yang kosong.

Karena UserInputService hanya sisi klien, fungsi ini hanya dapat digunakan di LocalScript .


Memberikan nilai

Sebuah matriksi dari InputObjects yang sesuai dengan tombol mouse saat ini yang saat ini tersisa.

Contoh Kode

Check which MouseButtons are Pressed

local UserInputService = game:GetService("UserInputService")
-- InputBegan is a UserInputService event that fires when the player
-- begins interacting via a Human-User input device
UserInputService.InputBegan:Connect(function(_input, _gameProcessedEvent)
-- Returns an array of the pressed MouseButtons
local buttons = UserInputService:GetMouseButtonsPressed()
local m1Pressed, m2Pressed = false, false
for _, button in pairs(buttons) do
if button.UserInputType.Name == "MouseButton1" then
print("MouseButton1 is pressed")
m1Pressed = true
end
if button.UserInputType.Name == "MouseButton2" then
print("MouseButton2 is pressed")
m2Pressed = true
end
if m1Pressed and m2Pressed then
print("Both mouse buttons are pressed")
end
end
end)

GetMouseDelta

Fungsi ini mengembalikan perubahan, dalam pixel, dari posisi pemain Mouse di frame terakhir yang rendah sebagai Vector2 . Fungsi ini hanya berfungsi jika mouse telah dikunci menggunakan properti UserInputService.MouseBehavior. Jika mouse tidak dikunci, nilai

Sensitivitas mouse, ditentukan dalam pengaturan klien dan UserInputService.MouseDeltaSensitivity , akan mempengaruhi hasilnya.

Karena UserInputService hanya sisi klien, fungsi ini hanya dapat digunakan di LocalScript .


Memberikan nilai

Ubah dalam gerakan mouse.

Contoh Kode

Getting Mouse Delta

local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local function OnRenderStep()
local delta = UserInputService:GetMouseDelta()
print("The mouse has moved", delta, "since the last step.")
end
RunService:BindToRenderStep("MeasureMouseMovement", Enum.RenderPriority.Input.Value, OnRenderStep)
Create a Custom CameraScript

local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local Players = game:GetService("Players")
local camera = workspace.CurrentCamera
local player = Players.LocalPlayer
local character = player.CharacterAdded:Wait()
local torso = character:WaitForChild("HumanoidRootPart")
local playerPosition = torso.Position
local default_CameraPosition = torso.Position
local default_CameraRotation = Vector2.new(0, math.rad(-60))
local default_CameraZoom = 15
local cameraPosition = default_CameraPosition
local cameraRotation = default_CameraRotation
local cameraZoom = default_CameraZoom
local cameraZoomBounds = nil -- {10,200}
local cameraRotateSpeed = 10
local cameraMouseRotateSpeed = 0.25
local cameraTouchRotateSpeed = 10
local function SetCameraMode()
camera.CameraType = "Scriptable"
camera.FieldOfView = 80
camera.CameraSubject = nil
end
local function UpdateCamera()
SetCameraMode()
local cameraRotationCFrame = CFrame.Angles(0, cameraRotation.X, 0) * CFrame.Angles(cameraRotation.Y, 0, 0)
camera.CFrame = cameraRotationCFrame + cameraPosition + cameraRotationCFrame * Vector3.new(0, 0, cameraZoom)
camera.Focus = camera.CFrame - Vector3.new(0, camera.CFrame.p.Y, 0)
end
local lastTouchTranslation = nil
local function TouchMove(_touchPositions, totalTranslation, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = totalTranslation - lastTouchTranslation
cameraPosition = cameraPosition + Vector3.new(difference.X, 0, difference.Y)
UpdateCamera()
end
lastTouchTranslation = totalTranslation
end
local lastTouchRotation = nil
local function TouchRotate(_touchPositions, rotation, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = rotation - lastTouchRotation
cameraRotation = cameraRotation
+ Vector2.new(-difference, 0) * math.rad(cameraTouchRotateSpeed * cameraRotateSpeed)
UpdateCamera()
end
lastTouchRotation = rotation
end
local lastTouchScale = nil
local function TouchZoom(_touchPositions, scale, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = scale - lastTouchScale
cameraZoom = cameraZoom * (1 + difference)
if cameraZoomBounds ~= nil then
cameraZoom = math.min(math.max(cameraZoom, cameraZoomBounds[1]), cameraZoomBounds[2])
else
cameraZoom = math.max(cameraZoom, 0)
end
UpdateCamera()
end
lastTouchScale = scale
end
local function Input(inputObject)
if inputObject.UserInputType == Enum.UserInputType.Keyboard then
if inputObject.UserInputState == Enum.UserInputState.Begin then
-- (I) Zoom In
if inputObject.KeyCode == Enum.KeyCode.I then
cameraZoom = cameraZoom - 15
elseif inputObject.KeyCode == Enum.KeyCode.O then
cameraZoom = cameraZoom + 15
end
-- (O) Zoom Out
if cameraZoomBounds ~= nil then
cameraZoom = math.min(math.max(cameraZoom, cameraZoomBounds[1]), cameraZoomBounds[2])
else
cameraZoom = math.max(cameraZoom, 0)
end
UpdateCamera()
end
end
local pressed = UserInputService:IsMouseButtonPressed(Enum.UserInputType.MouseButton1)
if pressed then
UserInputService.MouseBehavior = Enum.MouseBehavior.LockCurrentPosition
local rotation = UserInputService:GetMouseDelta()
cameraRotation = cameraRotation + rotation * math.rad(cameraMouseRotateSpeed)
else
UserInputService.MouseBehavior = Enum.MouseBehavior.Default
end
end
local function PlayerChanged()
local movement = torso.Position - playerPosition
cameraPosition = cameraPosition + movement
playerPosition = torso.Position
UpdateCamera()
end
-- Determine whether the user is on a mobile device
if UserInputService.TouchEnabled then
-- The user is on a mobile device, use Touch events
UserInputService.TouchPan:Connect(TouchMove)
UserInputService.TouchRotate:Connect(TouchRotate)
UserInputService.TouchPinch:Connect(TouchZoom)
else
-- The user is not on a mobile device use Input events
UserInputService.InputBegan:Connect(Input)
UserInputService.InputChanged:Connect(Input)
UserInputService.InputEnded:Connect(Input)
-- Camera controlled by player movement
task.wait(2)
RunService:BindToRenderStep("PlayerChanged", Enum.RenderPriority.Camera.Value - 1, PlayerChanged)
end

GetMouseLocation

Fungsi ini mengembalikan Vector2 mewakili lokasi layar saat ini pemain Mouse dalam pixel relatif terhadap sudut atas kiri. Ini tidak mengambil GUI dalam set.

Jika lokasi tombol mouse berada di luar layar atau perangkat pemain tidak memiliki mouse, nilai yang dikembalikan akan tidak ditentukan.

Karena UserInputService hanya sisi klien, fungsi ini hanya dapat digunakan di LocalScript .


Memberikan nilai

A Vector2 mewakili lokasi layar saat ini dari mouse, dalam pixel.

Contoh Kode

Move GUI To Mouse Location

local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local gui = script.Parent
local screenGui = gui.Parent
screenGui.IgnoreGuiInset = true
local function moveGuiToMouse()
local mouseLocation = UserInputService:GetMouseLocation()
gui.Position = UDim2.fromOffset(mouseLocation.X, mouseLocation.Y)
end
moveGuiToMouse()
RunService:BindToRenderStep("moveGuiToMouse", 1, moveGuiToMouse)

GetNavigationGamepads

Fungsi ini mengembalikan array gamepad UserInputTypes yang terhubung dan diaktifkan untuk navigasi GUI. Daftar ini dalam urutan prioritas menurun, yang berarti dapat diulang untuk menentukan gamepad mana yang harus memiliki kontrol navigasi.

Apakah gamepad yang terhubung hanya gamepad navigasi yang menentukan gamepad mana yang mengendalikan GUI navigasi. Ini tidak mengubah kendalinavigasi.

Karena UserInputService hanya sisi klien, fungsi ini hanya dapat digunakan di LocalScript .

Lihat juga:


Memberikan nilai

Sebuah matriksi dari UserInputTypes yang dapat digunakan untuk navigasi GUI, dalam urutan prioritas yang menurun.

GetStringForKeyCode

GetStringForKeyCode mengembalikan string mewakili kunci yang harus ditekan pengguna untuk memasukkan Enum.KeyCode yang diberikan, dengan menyimpan layout keyboard mereka. Untuk kode kunci yang memerlukan beberapa modifier untuk dipegang, fungsi ini mengembalikan kunci untuk ditekan bersama dengan modifier. Lihat contoh di bawah ini untuk penjelasan lebih lanjut

Ketika menggunakan Roblox dengan layout keyboard non-QWERTY, kode kunci dipeta ke posisi QWERTY yang setara. Misalnya, menekan A


local UserInputService = game:GetService("UserInputService")
local textLabel = script.Parent
local mapKey = Enum.KeyCode.M
textLabel.Text = "Press " .. UserInputService:GetStringForKeyCode(mapKey) .. " to open the map"

Contoh di Keyboard QWERTY


<tbody>
<tr>
<td><code>ENSEMBLE.KeyCode.Q</code></td>
<td><code>Q</code></td>
</tr>
<tr>
<td><code>ENSEMBLE.KeyCode.W</code></td>
<td><code>W</code></td>
</tr>
<tr>
<td><code>enum.KeyCode.Equals</code></td>
<td><code>=</code></td>
</tr>
<tr>
<td><code>enum.KeyCode.At</code></td>
<td><code>2</code> karena <code>@</code> ditulis dengan <kbd>Shift</kbd><kbd>2</kbd></td>
</tr>
</tbody>
Kode KunciKembalikanNilai

Contoh di Keyboard AZERTY


<tbody>
<tr>
<td><code>ENSEMBLE.KeyCode.Q</code></td>
<td><code>A)</code></td>
</tr>
<tr>
<td><code>ENSEMBLE.KeyCode.W</code></td>
<td><code>Z</code></td>
</tr>
<tr>
<td><code>enum.KeyCode.Equals</code></td>
<td><code>=</code></td>
</tr>
<tr>
<td><code>enum.KeyCode.At</code></td>
<td><code>É</code></td>
</tr>
</tbody>
Kode KunciKembalikanNilai

Penggunaan Gamepad

GetStringForKeyCode() mengembalikan pengubah string untuk Enum.KeyCode untuk gamepad terakhir yang terhubung. Jika kontroler yang terhubung tidak didukung, fungsi mengembalikan konversi string default untuk kode kunci yang diminta.

Contoh berikut menunjukkan cara Anda dapat mengumpulkan sumber daya khusus untuk ButtonA :


local UserInputService = game:GetService("UserInputService")
local imageLabel = script.Parent
local key = Enum.KeyCode.ButtonA
local mappings = {
ButtonA = "rbxasset://BUTTON_A_ASSET", -- Replace with the desired ButtonA asset
ButtonCross = "rbxasset://BUTTON_CROSS_ASSET" -- Replace with the desired ButtonCross asset
}
local mappedKey = UserInputService:GetStringForKeyCode(key)
local image = mappings[mappedKey]
imageLabel.Image = image

Peta Gamepad

Kode kunci pad arah tidak memiliki perbedaan apa pun berdasarkan perangkat. Enum.KeyCode.ButtonSelect memiliki perilaku yang sedikit berbeda dalam beberapa kasus. Gunakan kedua peta PlayStation untuk memastikan pengguna melihat tombol yang benar.


<tbody>
<tr>
<td><code>ButtonA Kode Daftar</code></td>
<td><code>TombolCross</code></td>
<td><code>TombolA</code></td>
</tr>
<tr>
<td><code>ButtonB Kode Daftar.</code></td>
<td><code>Lingkaran Tombol</code></td>
<td><code>Tombol B</code></td>
</tr>
<tr>
<td><code>enum.KeyCode.ButtonX</code></td>
<td><code>Kotak Tombol</code></td>
<td><code>Tombol X</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.ButtonY</code></td>
<td><code>TombolTriangle</code></td>
<td><code>TombolY</code></td>
</tr>
<tr>
<td><code>enum.KeyCode.ButtonL1</code></td>
<td><code>Tombol L1</code></td>
<td><code>TombolLB</code></td>
</tr>
<tr>
<td><code>enum.KeyCode.ButtonL2</code></td>
<td><code>Tombol L2</code></td>
<td><code>TombolLT</code></td>
</tr>
<tr>
<td><code>enum.KeyCode.ButtonL3</code></td>
<td><code>Tombol L3</code></td>
<td><code>Tombol LS</code></td>
</tr>
<tr>
<td><code>enum.KeyCode.ButtonR1</code></td>
<td><code>TombolR1</code></td>
<td><code>Tombol RB</code></td>
</tr>
<tr>
<td><code>enum.KeyCode.ButtonR2</code></td>
<td><code>TombolR2</code></td>
<td><code>TombolRT</code></td>
</tr>
<tr>
<td><code>enum.KeyCode.ButtonR3</code></td>
<td><code>TombolR3</code></td>
<td><code>Tombol RS</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.ButtonStart</code></td>
<td><code>OpsiTombol</code></td>
<td><code>Tombol Mulai</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.ButtonSelect</code></td>
<td><code>TombolTouchpad</code> dan <code>TombolBerbagi</code></td>
<td><code>TombolSelect</code></td>
</tr>
</tbody>
Kode KunciNilai Kembali PlayStationNilai Kembali Xbox

Gambar Sistem untuk KeyCodes

Ketika menggunakan Enum.KeyCode yang dapat lebih baik diwakili sebagai gambar, seperti untuk ImageLabel dalam metode pengambilan yang lebih modern, seperti untuk Class.UserInputService:GetImageForKeyCode()|GetImageForKeyCode()


<tbody>
<tr>
<td><code>enum.KeyCode.ButtonX</code></td>
<td>
<img src="../../../assets/scripting/controls/xboxX.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/xboxX.png</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.ButtonY</code></td>
<td>
<img src="../../../assets/scripting/controls/xboxY.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/xboxY.png</code></td>
</tr>
<tr>
<td><code>ButtonA Kode Daftar</code></td>
<td>
<img src="../../../assets/scripting/controls/xboxA.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/xboxA.png</code></td>
</tr>
<tr>
<td><code>ButtonB Kode Daftar.</code></td>
<td>
<img src="../../../assets/scripting/controls/xboxB.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/xboxB.png</code></td>
</tr>
<tr>
<td><code>enum.KeyCode.DPadLeft</code></td>
<td>
<img src="../../../assets/scripting/controls/dpadLeft.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/dpadLeft.png</code></td>
</tr>
<tr>
<td><code>enum.KeyCode.DPadRight</code></td>
<td>
<img src="../../../assets/scripting/controls/dpadRight.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/dpadRight.png</code></td>
</tr>
<tr>
<td><code>enum.KeyCode.DPadUp</code></td>
<td>
<img src="../../../assets/scripting/controls/dpadUp.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/dpadUp.png</code></td>
</tr>
<tr>
<td><code>enum.KeyCode.DPadDown</code></td>
<td>
<img src="../../../assets/scripting/controls/dpadDown.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/dpadDown.png</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.ButtonSelect</code></td>
<td>
<img src="../../../assets/scripting/controls/xboxView.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/xboxView.png</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.ButtonStart</code></td>
<td>
<img src="../../../assets/scripting/controls/xboxmenu.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/xboxmenu.png</code></td>
</tr>
<tr>
<td><code>enum.KeyCode.ButtonL1</code></td>
<td>
<img src="../../../assets/scripting/controls/xboxLB.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/xboxLB.png</code></td>
</tr>
<tr>
<td><code>enum.KeyCode.ButtonR1</code></td>
<td>
<img src="../../../assets/scripting/controls/xboxRB.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/xboxRB.png</code></td>
</tr>
<tr>
<td><code>enum.KeyCode.ButtonL2</code></td>
<td>
<img src="../../../assets/scripting/controls/xboxLT.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/xboxLT.png</code></td>
</tr>
<tr>
<td><code>enum.KeyCode.ButtonR2</code></td>
<td>
<img src="../../../assets/scripting/controls/xboxRT.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/xboxRT.png</code></td>
</tr>
<tr>
<td><code>enum.KeyCode.ButtonL3</code></td>
<td>
<img src="../../../assets/scripting/controls/xboxLS.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/xboxLS.png</code></td>
</tr>
<tr>
<td><code>enum.KeyCode.ButtonR3</code></td>
<td>
<img src="../../../assets/scripting/controls/xboxRS.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/xboxRS.png</code></td>
</tr>
<tr>
<td><code>enum.KeyCode.Thumbstick1</code></td>
<td>
<img src="../../../assets/scripting/controls/xboxLSDirectional.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/xboxLSDirectional.png</code></td>
</tr>
<tr>
<td><code>enum.KeyCode.Thumbstick2</code></td>
<td>
<img src="../../../assets/scripting/controls/xboxRSDirectional.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/xboxRSDirectional.png</code></td>
</tr>
<tr>
<td><code>enum.KeyCode.Backspace</code></td>
<td>
<img src="../../../assets/scripting/controls/backspace.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/backspace.png</code></td>
</tr>
<tr>
<td><code>enum.KeyCode.Return</code></td>
<td>
<img src="../../../assets/scripting/controls/return.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/return.png</code></td>
</tr>
<tr>
<td><code>enum.KeyCode.LeftShift</code></td>
<td>
<img src="../../../assets/scripting/controls/shift.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/shift.png</code></td>
</tr>
<tr>
<td><code>enum.KeyCode.RightShift</code></td>
<td>
<img src="../../../assets/scripting/controls/shift.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/shift.png</code></td>
</tr>
<tr>
<td><code>enum.KeyCode.Tab</code></td>
<td>
<img src="../../../assets/scripting/controls/tab.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/tab.png</code></td>
</tr>
<tr>
<td><code>enum.KeyCode.Apostrophe</code></td>
<td>
<img src="../../../assets/scripting/controls/apostrophe.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/apostrophe.png</code></td>
</tr>
<tr>
<td><code>enum.KeyCode.Comma</code></td>
<td>
<img src="../../../assets/scripting/controls/comma.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/comma.png</code></td>
</tr>
<tr>
<td><code>ENSEMBLE.KeyCode.Backquote</code></td>
<td>
<img src="../../../assets/scripting/controls/graveaccent.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/graveaccent.png</code></td>
</tr>
<tr>
<td><code>enum.KeyCode.Period</code></td>
<td>
<img src="../../../assets/scripting/controls/period.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/ periodic.png</code></td>
</tr>
<tr>
<td><code>enum.KeyCode.Space</code></td>
<td>
<img src="../../../assets/scripting/controls/spacebar.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/spacebar.png</code></td>
</tr>
</tbody>
Kode KunciGambarID Aset

Parameter

keyCode: Enum.KeyCode

Memberikan nilai

GetSupportedGamepadKeyCodes

Fungsi ini mengembalikan matriks enum.keycode|keycode yang gamepad asosiasi dengan dukungan <a href="/reference/engine/datatypes">enum.UserInputType</a> yang diberikan.

Fungsi ini dapat digunakan untuk menentukan KeyCodes mana yang didukung dan tidak didukung oleh gamepad terhubung. Untuk menentukan apakah KeyCodes tertentu didukung, gunakan UserInputService:GamepadSupports().

Jika dianggil pada gamepad yang tidak ada, atau tidak terhubung, fungsi ini akan mengembalikan array yang kosong.

Karena UserInputService hanya sisi klien, fungsi ini hanya dapat digunakan di LocalScript .

Lihat juga:

Parameter

gamepadNum: Enum.UserInputType

The Enum.UserInputType of the gamepad.


Memberikan nilai

Sebuah matriks KeyCodes yang didukung oleh gamepad yang diberikan.

Contoh Kode

Binding Supported Gamepad KeyCodes

local UserInputService = game:GetService("UserInputService")
local ContextActionService = game:GetService("ContextActionService")
local function actionHandler(actionName, inputState, inputObject)
if inputState == Enum.UserInputState.Begin then
print("Action Handler: " .. actionName)
print(inputObject)
end
-- Since this function does not return anything, this handler will
-- "sink" the input and no other action handlers will be called after
-- this one.
end
local navGamepads = UserInputService:GetNavigationGamepads()
for _, gamepad in pairs(navGamepads) do
local supportedKeyCodes = UserInputService:GetSupportedGamepadKeyCodes(gamepad)
for _, keycode in pairs(supportedKeyCodes) do
if keycode == Enum.KeyCode.ButtonX then
ContextActionService:BindAction("SampleAction", actionHandler, false, Enum.KeyCode.ButtonX)
end
if keycode == Enum.KeyCode.X then
ContextActionService:BindAction("SampleAction", actionHandler, false, Enum.KeyCode.X)
end
end
end

IsGamepadButtonDown

Fungsi ini memeriksa apakah tombol khusus ditekan di gamepad tertentu. Ini mengembalikan true jika gamepad memiliki tombol khusus yang ditekan, jika tidak maka mengembalikan salah.

Jenis Masukan Pengguna yang Valid

Gamepad yang ditentukan harus menjadi salah satu dari berikut nilai UserInputType:


<tr>
<td>Gamepad1-8</td>
</tr>
Nama

Kode Sandi yang Valid

Tombol yang ditentukan harus menjadi salah satu dari berikut KeyCodes daftar nilai:


<tr>
<td>Kode Tombol.</td>
</tr>
<tr>
<td>Kode Tombol.</td>
</tr>
<tr>
<td>Kode Tombol.</td>
</tr>
<tr>
<td>Kode Tombol.</td>
</tr>
<tr>
<td>Kode Tombol.</td>
</tr>
<tr>
<td>Kode Tombol.</td>
</tr>
<tr>
<td>Kode Tombol.</td>
</tr>
<tr>
<td>Kode Tombol.</td>
</tr>
<tr>
<td>Kode Tombol.</td>
</tr>
<tr>
<td>Kode Tombol Umum.</td>
</tr>
<tr>
<td>ButtonStartKode</td>
</tr>
<tr>
<td>ButtonSelectKode</td>
</tr>
<tr>
<td>Kode Papan Kiri Ennum.KeyCode.DPadLeft</td>
</tr>
<tr>
<td>Kode Papan Kanan.</td>
</tr>
<tr>
<td>Kode Papan Pintas.</td>
</tr>
<tr>
<td>Kode Umum.</td>
</tr>
Nama

Ini dapat digunakan untuk memeriksa apakah tombol khusus, seperti A, dipegang. Misalnya:


local UserInputService = game:GetService("UserInputService")
local button = Enum.KeyCode.ButtonA
local gamepad = Enum.UserInputType.Gamepad1
local isButtonHeld = UserInputService:IsGamepadButtonDown(gamepad, button)

Karena UserInputService hanya sisi klien, fungsi ini hanya dapat digunakan di LocalScript .

Lihat juga:

Parameter

gamepadNum: Enum.UserInputType

The Enum.UserInputType of the given gamepad.

gamepadKeyCode: Enum.KeyCode

The Enum.KeyCode of the specified button.


Memberikan nilai

Apakah tombol gamepad yang ditentukan pada gamepad yang diberikan ditekan.

Contoh Kode

Special Action on Gamepad Button Combo

local UserInputService = game:GetService("UserInputService")
local activeGamepad = nil
local buttonX = Enum.KeyCode.ButtonX
local function isGamepadXDown()
if activeGamepad then
return UserInputService:IsGamepadButtonDown(activeGamepad, buttonX)
end
return false
end
local function input(_input, _gameProcessedEvent)
if not isGamepadXDown() then
-- Normal event
else
-- X Button down event
end
end
local function getActiveGamepad()
local activateGamepad = nil
local navigationGamepads = {}
navigationGamepads = UserInputService:GetNavigationGamepads()
if #navigationGamepads > 1 then
for i = 1, #navigationGamepads do
if activateGamepad == nil or navigationGamepads[i].Value < activateGamepad.Value then
activateGamepad = navigationGamepads[i]
end
end
else
local connectedGamepads = {}
connectedGamepads = UserInputService:GetConnectedGamepads()
if #connectedGamepads > 0 then
for i = 1, #connectedGamepads do
if activateGamepad == nil or connectedGamepads[i].Value < activateGamepad.Value then
activateGamepad = connectedGamepads[i]
end
end
end
if activateGamepad == nil then -- nothing is connected, at least set up for gamepad1
activateGamepad = Enum.UserInputType.Gamepad1
end
end
return activateGamepad
end
if UserInputService.GamepadEnabled then
activeGamepad = getActiveGamepad()
UserInputService.InputBegan:Connect(input)
end

IsKeyDown

Fungsi ini mengembalikan apakah pengguna menahan tombol yang terkait dengan Enum.KeyCode yang diberikan. Ini mengembalikan true jika tombol yang ditentukan ditekan atau false jika tidak ditentukan.

Ini dapat digunakan untuk memeriksa apakah unitkhusus, seperti bar ruang, ditekan. Misalnya:


local UserInputService = game:GetService("UserInputService")
local spaceHeld = UserInputService:IsKeyDown(Enum.KeyCode.Space)

Untuk mengambil daftar semua tombol yang ditekan oleh pengguna, gunakan fungsi UserInputService:GetKeysPressed().

Karena UserInputService hanya sisi klien, fungsi ini hanya dapat digunakan di LocalScript .

Lihat juga:

Parameter

keyCode: Enum.KeyCode

The Enum.KeyCode of the unit.


Memberikan nilai

Apakah kunci yang ditentukan dipegang.

Contoh Kode

Special Action on Key Combo Press

local UserInputService = game:GetService("UserInputService")
local shiftKeyL = Enum.KeyCode.LeftShift
local shiftKeyR = Enum.KeyCode.RightShift
-- Return whether left or right shift keys are down
local function isShiftKeyDown()
return UserInputService:IsKeyDown(shiftKeyL) or UserInputService:IsKeyDown(shiftKeyR)
end
-- Handle user input began differently depending on whether a shift key is pressed
local function input(_input, _gameProcessedEvent)
if not isShiftKeyDown() then
-- Normal input
else
-- Shift input
end
end
UserInputService.InputBegan:Connect(input)

IsMouseButtonPressed

Fungsi ini mengambil tombol mouse Enum.UserInputType dan mengembalikan boo yang menunjukkan apakah tombol itu saat ini ditekan.

Tombol mouse yang ditekan tergantung pada nilai Enum.UserInputType yang diterima fungsi sebagai argumen. Misalnya:


local UserInputService = game:GetService("UserInputService")
local pressed = UserInputService:IsMouseButtonPressed(Enum.UserInputType.MouseButton1)

Karena UserInputService hanya sisi klien, fungsi ini hanya dapat digunakan di LocalScript."

Parameter

mouseButton: Enum.UserInputType

The Enum.UserInputType of the mouse button.


Memberikan nilai

Apakah tombol mouse yang diberikan saat ini tertahan.

Contoh Kode

Create a Custom CameraScript

local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local Players = game:GetService("Players")
local camera = workspace.CurrentCamera
local player = Players.LocalPlayer
local character = player.CharacterAdded:Wait()
local torso = character:WaitForChild("HumanoidRootPart")
local playerPosition = torso.Position
local default_CameraPosition = torso.Position
local default_CameraRotation = Vector2.new(0, math.rad(-60))
local default_CameraZoom = 15
local cameraPosition = default_CameraPosition
local cameraRotation = default_CameraRotation
local cameraZoom = default_CameraZoom
local cameraZoomBounds = nil -- {10,200}
local cameraRotateSpeed = 10
local cameraMouseRotateSpeed = 0.25
local cameraTouchRotateSpeed = 10
local function SetCameraMode()
camera.CameraType = "Scriptable"
camera.FieldOfView = 80
camera.CameraSubject = nil
end
local function UpdateCamera()
SetCameraMode()
local cameraRotationCFrame = CFrame.Angles(0, cameraRotation.X, 0) * CFrame.Angles(cameraRotation.Y, 0, 0)
camera.CFrame = cameraRotationCFrame + cameraPosition + cameraRotationCFrame * Vector3.new(0, 0, cameraZoom)
camera.Focus = camera.CFrame - Vector3.new(0, camera.CFrame.p.Y, 0)
end
local lastTouchTranslation = nil
local function TouchMove(_touchPositions, totalTranslation, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = totalTranslation - lastTouchTranslation
cameraPosition = cameraPosition + Vector3.new(difference.X, 0, difference.Y)
UpdateCamera()
end
lastTouchTranslation = totalTranslation
end
local lastTouchRotation = nil
local function TouchRotate(_touchPositions, rotation, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = rotation - lastTouchRotation
cameraRotation = cameraRotation
+ Vector2.new(-difference, 0) * math.rad(cameraTouchRotateSpeed * cameraRotateSpeed)
UpdateCamera()
end
lastTouchRotation = rotation
end
local lastTouchScale = nil
local function TouchZoom(_touchPositions, scale, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = scale - lastTouchScale
cameraZoom = cameraZoom * (1 + difference)
if cameraZoomBounds ~= nil then
cameraZoom = math.min(math.max(cameraZoom, cameraZoomBounds[1]), cameraZoomBounds[2])
else
cameraZoom = math.max(cameraZoom, 0)
end
UpdateCamera()
end
lastTouchScale = scale
end
local function Input(inputObject)
if inputObject.UserInputType == Enum.UserInputType.Keyboard then
if inputObject.UserInputState == Enum.UserInputState.Begin then
-- (I) Zoom In
if inputObject.KeyCode == Enum.KeyCode.I then
cameraZoom = cameraZoom - 15
elseif inputObject.KeyCode == Enum.KeyCode.O then
cameraZoom = cameraZoom + 15
end
-- (O) Zoom Out
if cameraZoomBounds ~= nil then
cameraZoom = math.min(math.max(cameraZoom, cameraZoomBounds[1]), cameraZoomBounds[2])
else
cameraZoom = math.max(cameraZoom, 0)
end
UpdateCamera()
end
end
local pressed = UserInputService:IsMouseButtonPressed(Enum.UserInputType.MouseButton1)
if pressed then
UserInputService.MouseBehavior = Enum.MouseBehavior.LockCurrentPosition
local rotation = UserInputService:GetMouseDelta()
cameraRotation = cameraRotation + rotation * math.rad(cameraMouseRotateSpeed)
else
UserInputService.MouseBehavior = Enum.MouseBehavior.Default
end
end
local function PlayerChanged()
local movement = torso.Position - playerPosition
cameraPosition = cameraPosition + movement
playerPosition = torso.Position
UpdateCamera()
end
-- Determine whether the user is on a mobile device
if UserInputService.TouchEnabled then
-- The user is on a mobile device, use Touch events
UserInputService.TouchPan:Connect(TouchMove)
UserInputService.TouchRotate:Connect(TouchRotate)
UserInputService.TouchPinch:Connect(TouchZoom)
else
-- The user is not on a mobile device use Input events
UserInputService.InputBegan:Connect(Input)
UserInputService.InputChanged:Connect(Input)
UserInputService.InputEnded:Connect(Input)
-- Camera controlled by player movement
task.wait(2)
RunService:BindToRenderStep("PlayerChanged", Enum.RenderPriority.Camera.Value - 1, PlayerChanged)
end

IsNavigationGamepad

Fungsi ini mengembalikan true jika gamepad Enum.UserInputType yang ditentukan diizinkan untuk mengontrol Navigasi dan Pemilihan GUIs .

Jika Anda ingin menetapkan gamepad navigasi, Anda dapat menggunakan UserInputService:SetNavigationGamepad() . Anda juga dapat menggunakan UserInputService:GetNavigationGamepads() untuk mendapatkan daftar semua gamepad navigasi.

Misalnya, kode di bawah ini memeriksa apakah gamepad1 sebagai gamepad navigasi:


local UserInputService = game:GetService("UserInputService")
if UserInputService:IsNavigationGamepad(UserInputType.Gamepad1) then
print("Gamepad is a navigation gamepad!")
else
print("Gamepad is not a navigation gamepad!")
end

Daftar semua gamepad yang terhubung, terlepas dari navigasi dapat diambil menggunakan`UserInput/GetConnectedGamepads.

Karena UserInputService hanya sisi klien, fungsi ini hanya dapat digunakan di LocalScript .

Lihat juga:

Parameter

gamepadEnum: Enum.UserInputType

The Enum.UserInputType of the specified gamepad.


Memberikan nilai

Apakah gamepad yang ditentukan adalah gamepad navigasi.

RecenterUserHeadCFrame

void

Fungsi ini menyentuh CFrame dari headset VR ke orientasi saat ini dari headset yang dikenakan pengguna. Ini berarti bahwa orientasi saat ini headset ditetapkan menjadi CFrame.new() .

Gunakan fungsi ini untuk menggeser headset CFrame ke tengah area bermain jika tampaknya berada dalam jarak yang aneh.

Ini bersikap sama dengan fungsi VRService , VRService:RecenterUserHeadCFrame() .

Karena UserInputService hanya sisi klien, fungsi ini hanya dapat digunakan di LocalScript .


Memberikan nilai

void

Contoh Kode

UserInputService:RecenterUserHeadCFrame

local UserInputService = game:GetService("UserInputService")
UserInputService:RecenterUserHeadCFrame()

SetNavigationGamepad

void

Fungsi SetNavigationGamepad menetapkan apakah gamepad yang ditentukan Enum.UserInputType dapat menggerakkan navigator GUI. Gamepad yang diizinkan untuk menggerakkan navigator GUI dianggap sebagai gamepad navigasi.

Jika argument dihabilitasi sebagai true , maka Gamepad dapat menggerakkan navigator GUI. Jika argument adalah false, maka Gamepad tidak dapat menggerakkan navigator GUI.

Jika Anda ingin memeriksa apakah Gamepad yang ditentukan adalah set untuk menjadi Gamepad navigasi, Anda dapat menggunakan fungsi UserInputService:IsNavigationGamepad(). Anda juga dapat menggunakan fungsi UserInputService:GetNavigationGamepads() untuk mengambil daftar semua Gamepad navigasi.

Karena UserInputService hanya sisi klien, fungsi ini hanya dapat digunakan di LocalScript .

Lihat juga:

Parameter

gamepadEnum: Enum.UserInputType

The Enum.UserInputType of the specified gamepad.

enabled: bool

Apakah gamepad yang ditentukan dapat menggerakkan navigator GUI.


Memberikan nilai

void

Contoh Kode

UserInputService:SetNavigationGamepad

local UserInputService = game:GetService("UserInputService")
UserInputService:SetNavigationGamepad(Enum.UserInputType.Gamepad1, true)

Acara

DeviceAccelerationChanged

Acara Percepatan Perangkat berlaku ketika pengguna pindahkan perangkat yang memiliki accelerometer.

Akselerometer adalah komponen yang ditemukan di kebanyakan perangkat seluler yang mengukur akselerasi (perubahan dalam kecepatan).

Untuk menentukan apakah perangkat pengguna memiliki accelerometer yang diaktifkan, lihat UserInputService.AccelerometerEnabled .

Acara ini dapat digunakan untuk melacak gerakan perangkat yang memiliki accelerometer. Penggunaan sampel mencakup pindahan karakter pemain saat perangkat mobile berakselerasi.

Selain itu, acara ini dapat digunakan bersama dengan UserInputService:GetDeviceAcceleration() untuk menentukan gerakan saat ini dari perangkat pengguna jika perangkat memiliki accelerometer.

Acara ini hanya diaktifkan secara lokal - yang berarti bahwa hanya pemain cupla yang pindah ke perangkat mereka dapat menggunakan acara dan itu hanya akan bekerja di LocalScript .

Parameter

acceleration: InputObject

Sebuah InputObject, dengan UserInputType dari 'Akselerometer' , dan 2> Class.InputObject.Position|Position2> yang menunjukkan kekuatan gravitasi di setiap sumbu perangkat lokal.


Contoh Kode

Control Players Using the Accelerometer

local UserInputService = game:GetService("UserInputService")
local Players = game:GetService("Players")
local SENSITIVITY = 0.2
local player = Players.LocalPlayer
local character = player.Character or player.CharacterAdded:Wait()
local humanoid = character:WaitForChild("Humanoid")
local ready = true
local function changeAcceleration(acceleration)
if ready then
ready = false
local accel = acceleration.Position
if accel.Y >= SENSITIVITY then
humanoid.Jump = true
end
if accel.Z <= -SENSITIVITY then
humanoid:Move(Vector3.new(-1, 0, 0))
end
if accel.Z >= SENSITIVITY then
humanoid:Move(Vector3.new(1, 0, 0))
end
if accel.X <= -SENSITIVITY then
humanoid:Move(Vector3.new(0, 0, 1))
end
if accel.X >= SENSITIVITY then
humanoid:Move(Vector3.new(0, 0, -1))
end
task.wait(1)
ready = true
end
end
UserInputService.DeviceAccelerationChanged:Connect(changeAcceleration)

DeviceGravityChanged

Acara UserInputService.DeviceGravityChanged mengaktifkan ketika kedudukan perangkat Vector3 berubah di perangkat yang memiliki accelerometer.

Vector gravitasi perangkat mewakili kekuatan gravitasi pada masing-masing sumbu X, Y, dan Z. Meskipun gravitasi tidak pernah berubah, kekuatan yang dihasilkan pada setiap sumbu perubah ketika perangkat berputar dan mengubah arah.Nilai tekanan gravitasi yang ditunjukkan pada setiap sumbu adalah unit vektor yang berkisar dari -1 hingga 1.

Akselerometer adalah komponen yang ditemukan di kebanyakan perangkat seluler yang mengukur akselerasi (perubahan dalam kecepatan).

Acara ini dapat digunakan untuk menentukan arah dunia nyata dari kekuatan gravitasi pada perangkat pengguna. Ini bahkan dapat kemudian digunakan untuk menyimulasikan kekuatan gravitasi pada perangkat pengguna dalam permainan, seperti pada objek dalam game (lihat contoh di bawah).

Untuk memeriksa apakah perangkat pengguna memiliki accelerometer yang diaktifkan, lihat UserInputService.AccelerometerEnabled. Jika perangkat memiliki accelerometer yang diaktifkan, Anda dapat menggunakan fungsi UserInputService:GetDeviceGravity() untuk mendapatkan kekuatan gravitasi saat ini di perangkat pengguna.

Parameter

gravity: InputObject

Sebuah InputObject, dengan property InputObject.Position yang menunjukkan kekuatan gravitasi di setiap sumbu perangkat lokal. Posisi ini dapat digunakan sebagai arah untuk menentukan arah gravitasi relatif terhadap perangkat.


Contoh Kode

Move a Ball using the Accelerometer

local Workspace = game:GetService("Workspace")
local UserInputService = game:GetService("UserInputService")
local ball = script.Parent:WaitForChild("Ball")
local mass = ball:GetMass()
local gravityForce = ball:WaitForChild("GravityForce")
local function moveBall(gravity)
gravityForce.Force = gravity.Position * Workspace.Gravity * mass
end
if UserInputService.AccelerometerEnabled then
UserInputService.DeviceGravityChanged:Connect(moveBall)
end
Create a Gyroscopic Camera

local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local character = player.CharacterAdded:Wait()
local head = character:WaitForChild("Head")
local camera = workspace.CurrentCamera
local currentRotation = camera.CFrame -- CFrame.new(Vector3.new(0,0,0), Vector3.new(0,0,0))
local lastInputFrame = nil
local upsideDown = false
task.wait()
local orientationSet = false
local function GravityChanged(gravity)
if not orientationSet then
upsideDown = (gravity.Position.X < -0.5 or gravity.Position.Z > 0.5)
orientationSet = true
end
end
local function RotationChanged(_rotation, rotCFrame)
if orientationSet then
if not lastInputFrame then
lastInputFrame = rotCFrame
end
local delta = rotCFrame * lastInputFrame:inverse()
local x, y, z = delta:ToEulerAnglesXYZ()
if upsideDown then
delta = CFrame.Angles(-x, y, z)
else
delta = CFrame.Angles(x, -y, z)
end
currentRotation = currentRotation * delta
lastInputFrame = rotCFrame
end
end
local function HideCharacter()
for _, limb in pairs(character:GetChildren()) do
if limb:IsA("Part") then
limb.Transparency = 1
end
end
end
if UserInputService.GyroscopeEnabled then
UserInputService.DeviceGravityChanged:Connect(GravityChanged)
UserInputService.DeviceRotationChanged:Connect(RotationChanged)
HideCharacter()
RunService:BindToRenderStep("Camera", Enum.RenderPriority.Camera.Value, function()
camera.CFrame = CFrame.new(head.Position - Vector3.new(0, 8, 10)) * currentRotation
camera.Focus = CFrame.new(currentRotation * Vector3.new(0, 0, -10))
end)
end

DeviceRotationChanged

Acara DeviceRotationChanged menyebabkan terjadinya kejadian saat pengguna memutar perangkat yang memiliki giroskop.

Gyroscope adalah komponen yang ditemukan di kebanyakan perangkat seluler yang mendeteksi orientasi dan kecepatan rotasi.

Acara ini berguna ketika melacak orientasi perangkat dan bagaimana perubahan saat pengguna memutar perangkat mereka. Untuk menentukan rotasi perangkat saat ini, Anda dapat menggunakan fungsi UserInputService:GetDeviceRotation().

Untuk memeriksa apakah perangkat pengguna memiliki gyroscope yang diaktifkan, dan bahwa acara ini akan diaktifkan, lihat UserInputService.GyroscopeEnabled .

Acara ini hanya diaktifkan ketika jendela klien Roblox berada dalam fokus. Misalnya, input tidak akan ditangkap saat jendela dikurangi.

Parameter

rotation: InputObject

Sebuah InputObject yang memberikan informasi tentang rotasi perangkat. InputObject.Position mewakili nilai rotasi baru sebuah posisi Vector3 dan 1> Class.InputObj.Delta1> mewakili perubahan rotasi dalam posisi 4> Datatype.Vector34> posisi.

cframe: CFrame

Sebuah CFrame mewakili orientasi perangkat saat ini.


Contoh Kode

Create a Gyroscopic Camera

local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local character = player.CharacterAdded:Wait()
local head = character:WaitForChild("Head")
local camera = workspace.CurrentCamera
local currentRotation = camera.CFrame -- CFrame.new(Vector3.new(0,0,0), Vector3.new(0,0,0))
local lastInputFrame = nil
local upsideDown = false
task.wait()
local orientationSet = false
local function GravityChanged(gravity)
if not orientationSet then
upsideDown = (gravity.Position.X < -0.5 or gravity.Position.Z > 0.5)
orientationSet = true
end
end
local function RotationChanged(_rotation, rotCFrame)
if orientationSet then
if not lastInputFrame then
lastInputFrame = rotCFrame
end
local delta = rotCFrame * lastInputFrame:inverse()
local x, y, z = delta:ToEulerAnglesXYZ()
if upsideDown then
delta = CFrame.Angles(-x, y, z)
else
delta = CFrame.Angles(x, -y, z)
end
currentRotation = currentRotation * delta
lastInputFrame = rotCFrame
end
end
local function HideCharacter()
for _, limb in pairs(character:GetChildren()) do
if limb:IsA("Part") then
limb.Transparency = 1
end
end
end
if UserInputService.GyroscopeEnabled then
UserInputService.DeviceGravityChanged:Connect(GravityChanged)
UserInputService.DeviceRotationChanged:Connect(RotationChanged)
HideCharacter()
RunService:BindToRenderStep("Camera", Enum.RenderPriority.Camera.Value, function()
camera.CFrame = CFrame.new(head.Position - Vector3.new(0, 8, 10)) * currentRotation
camera.Focus = CFrame.new(currentRotation * Vector3.new(0, 0, -10))
end)
end
Move a Ball using the Accelerometer

local Workspace = game:GetService("Workspace")
local UserInputService = game:GetService("UserInputService")
local ball = script.Parent:WaitForChild("Ball")
local mass = ball:GetMass()
local gravityForce = ball:WaitForChild("GravityForce")
local function moveBall(gravity)
gravityForce.Force = gravity.Position * Workspace.Gravity * mass
end
if UserInputService.AccelerometerEnabled then
UserInputService.DeviceGravityChanged:Connect(moveBall)
end

GamepadConnected

Acara GamepadConnected diaktifkan ketika gamepad dikoneksikan ke klien.

Karena permainan Roblox mendukung banyak kontroler, acara ini berguna ketika dipasangkan dengan acara UserInputService.GamepadDisconnected untuk melacak kontroler/gamepad yang aktif. Anda juga dapat menggunakan UserInputService:GetConnectedGamepads() untuk menemukan gamepad yang benar untuk digunakan.

Contoh berikut menunjukkan contoh penggunaan saat gamepad terhubung ke klien.


local UserInputService = game:GetService("UserInputService")
local function GamepadConnected(gamepad)
print("Player has plugged controller: " .. tostring(gamepad))
end)
UserInputService.GamepadConnected:Connect(GamepadConnected)

Jika ingin melihat perangkat mana yang terhubung, Anda dapat menggunakan fungsi UserInputService:GetConnectedGamepads().

Karena acara ini menyala lokal, itu hanya dapat digunakan dalam LocalScript .

Lihat juga:

Parameter

gamepadNum: Enum.UserInputType

The Enum.UserInputType of the connected gamepad.


GamepadDisconnected

Acara GamepadDisconnected terjadi ketika gamepad terputus.

Karena permainan Roblox mendukung banyak kontroler, acara ini berguna ketika dipasangkan dengan acara UserInputService.GamepadConnected untuk melacak kontroler/gamepad yang aktif. Anda juga dapat menggunakan UserInputService:GetConnectedGamepads() untuk menemukan gamepad yang benar untuk digunakan.

Contoh berikut menunjukkan contoh penggunaan saat gamepad terputus dari klien.


local UserInputService = game:GetService("UserInputService")
local function GamepadDisconnected(gamepad)
print("Player has unplugged controller: " .. tostring(gamepad))
end)
UserInputService.GamepadDisconnected:Connect(GamepadDisconnected)

Karena acara ini menyala lokal, itu hanya dapat digunakan dalam LocalScript .

Lihat juga:

Parameter

gamepadNum: Enum.UserInputType

The Enum.UserInputType of the disconnected gamepad.


InputBegan

Acara InputBegan diaktifkan ketika seorang pengguna mulai berinteraksi melalui perangkat Human-Computer Interface (tombol mouse, sentuh dimulai, tombol keyboard, dll).

Dapat digunakan untuk melacak awal interaksi pengguna, seperti ketika seorang pengguna pertama interaksi dengan elemen GUI, gamepad, dll. Ini tidak menangkap gerakan mouse.

Acara ini dapat digunakan bersama dengan UserInputService.InputChanged dan UserInputService.InputEnded untuk melacak ketika input pengguna dimulai, berubah, dan berakhir.

Acara ini hanya diaktifkan ketika jendela klien Roblox berada dalam fokus. Misalnya, input tidak akan ditangkap saat jendela dikurangi.

Karena acara ini hanya diaktifkan lokal, itu hanya dapat digunakan dalam LocalScript .

Parameter

Sebuah kejadianInputObject, yang berisi informasi tentang masukan pengguna.

gameProcessedEvent: bool

Menunjukkan apakah mesin game secara internal mengamati input ini dan bertindak di atasnya. Biasanya ini mengacu pada pemrosesan UI, jadi jika tombol disentuh atau diklik dari input ini, gameProcessedEvent akan menjadi true . Ini juga berlaku untuk acara input yang terhubung melalui ContextActionService.


Contoh Kode

Handling InputBegan

-- In order to use the InputBegan event, the UserInputService service must be used
local UserInputService = game:GetService("UserInputService")
-- A sample function providing multiple usage cases for various types of user input
UserInputService.InputBegan:Connect(function(input, gameProcessed)
if input.UserInputType == Enum.UserInputType.Keyboard then
print("A key is being pushed down! Key:", input.KeyCode)
elseif input.UserInputType == Enum.UserInputType.MouseButton1 then
print("The left mouse button has been pressed down at", input.Position)
elseif input.UserInputType == Enum.UserInputType.MouseButton2 then
print("The right mouse button has been pressed down at", input.Position)
elseif input.UserInputType == Enum.UserInputType.Touch then
print("A touchscreen input has started at", input.Position)
elseif input.UserInputType == Enum.UserInputType.Gamepad1 then
print("A button is being pressed on a gamepad! Button:", input.KeyCode)
end
if gameProcessed then
print("The game engine internally observed this input!")
else
print("The game engine did not internally observe this input!")
end
end)

InputChanged

Acara InputChanged menyetel saat seorang pengguna mengubah cara mereka berinteraksi melalui perangkat Human-Computer Interface (tombol mouse, sentuh dimulai, tombol keyboard, dll).

Untuk mengabaikan acara yang diperbaiki secara otomatis oleh Roblox, seperti menggulir dalam ScrollingFrame , periksa argument gameProcessingEvent yang benar. Acara ini dapat digunakan bersama dengan UserInputService.InputBegan dan 1> Class.UserInputService.Input

Acara ini hanya diaktifkan ketika jendela klien Roblox berada dalam fokus. Misalnya, input tidak akan ditangkap saat jendela dikurangi.

Karena acara ini hanya diaktifkan lokal, itu hanya dapat digunakan dalam LocalScript .

Parameter

Sebuah kejadianInputObject, yang berisi informasi tentang masukan pengguna.

gameProcessedEvent: bool

Menunjukkan apakah mesin game secara internal mengamati input ini dan bertindak di atasnya. Biasanya ini mengacu pada pemrosesan UI, jadi jika tombol disentuh atau diklik dari input ini, gameProcessedEvent akan menjadi true . Ini juga berlaku untuk acara input yang terhubung melalui ContextActionService.


Contoh Kode

Handling InputChanged

-- In order to use the InputChanged event, the UserInputService service must be used
local UserInputService = game:GetService("UserInputService")
-- Prints the current input position and the change (delta) in position
local function printMovement(input)
print("Position:", input.Position)
print("Movement Delta:", input.Delta)
end
-- A sample function providing multiple usage cases for various types of user input
local function InputChanged(input, _gameProcessed)
if input.UserInputType == Enum.UserInputType.MouseMovement then
print("The mouse has been moved!")
printMovement(input)
elseif input.UserInputType == Enum.UserInputType.MouseWheel then
print("The mouse wheel has been scrolled!")
print("Wheel Movement:", input.Position.Z)
elseif input.UserInputType == Enum.UserInputType.Gamepad1 then
if input.KeyCode == Enum.KeyCode.Thumbstick1 then
print("The left thumbstick has been moved!")
printMovement(input)
elseif input.KeyCode == Enum.KeyCode.Thumbstick2 then
print("The right thumbstick has been moved!")
printMovement(input)
elseif input.KeyCode == Enum.KeyCode.ButtonL2 then
print("The pressure being applied to the left trigger has changed!")
print("Pressure:", input.Position.Z)
elseif input.KeyCode == Enum.KeyCode.ButtonR2 then
print("The pressure being applied to the right trigger has changed!")
print("Pressure:", input.Position.Z)
end
elseif input.UserInputType == Enum.UserInputType.Touch then
print("The user's finger is moving on the screen!")
printMovement(input)
elseif input.UserInputType == Enum.UserInputType.Gyro then
local _rotInput, rotCFrame = UserInputService:GetDeviceRotation()
local rotX, rotY, rotZ = rotCFrame:toEulerAnglesXYZ()
local rot = Vector3.new(math.deg(rotX), math.deg(rotY), math.deg(rotZ))
print("The rotation of the user's mobile device has been changed!")
print("Position", rotCFrame.p)
print("Rotation:", rot)
elseif input.UserInputType == Enum.UserInputType.Accelerometer then
print("The acceleration of the user's mobile device has been changed!")
printMovement(input)
end
end
UserInputService.InputChanged:Connect(InputChanged)

InputEnded

Acara InputEnded terjadi ketika pengguna berhenti berinteraksi melalui perangkat Human-Computer Interface (tombol mouse, sentuh dimulai, tombol keyboard, dll). Ini berguna ketika melacak ketika pengguna melepaskan tombol keyboard, tombol mouse, sentuh layar, dll.

Acara ini dapat digunakan bersama dengan UserInputService.InputBegan dan UserInputService.InputChanged untuk melacak ketika input pengguna dimulai, berubah, dan berakhir.

Acara ini hanya diaktifkan ketika jendela klien Roblox berada dalam fokus. Misalnya, input tidak akan ditangkap saat jendela dikurangi.

Karena acara ini hanya diaktifkan lokal, itu hanya dapat digunakan dalam LocalScript .

Parameter

Sebuah InputObject kejadian, yang berisi informasi tentang masukan pengguna.

gameProcessedEvent: bool

Menunjukkan apakah mesin game secara internal mengamati input ini dan bertindak di atasnya. Biasanya ini mengacu pada pemrosesan UI, jadi jika tombol disentuh atau diklik dari input ini, gameProcessedEvent akan menjadi true . Ini juga berlaku untuk acara input yang terhubung melalui ContextActionService.


Contoh Kode

Handling InputEnded

-- In order to use the InputChanged event, the UserInputService service must be used
local UserInputService = game:GetService("UserInputService")
-- A sample function providing multiple usage cases for various types of user input
UserInputService.InputEnded:Connect(function(input, gameProcessed)
if input.UserInputType == Enum.UserInputType.Keyboard then
print("A key has been released! Key:", input.KeyCode)
elseif input.UserInputType == Enum.UserInputType.MouseButton1 then
print("The left mouse button has been released at", input.Position)
elseif input.UserInputType == Enum.UserInputType.MouseButton2 then
print("The right mouse button has been released at", input.Position)
elseif input.UserInputType == Enum.UserInputType.Touch then
print("A touchscreen input has been released at", input.Position)
elseif input.UserInputType == Enum.UserInputType.Gamepad1 then
print("A button has been released on a gamepad! Button:", input.KeyCode)
end
if gameProcessed then
print("The game engine internally observed this input!")
else
print("The game engine did not internally observe this input!")
end
end)

JumpRequest

Acara UserInputService JumpRequest terjadi ketika ada permintaan lompat dari klien, misalnya ketika klien menekan tombol ruang atau tombol lompat di ponsel.

Acara ini diaktifkan setiap kali pengguna mencoba untuk membuat loncatmereka Player.Character . Perilaku default menjawab permintaan lompatan dengan menetapkan propinsi pemain Humanoid.Jump ke benar, yang membuat karakter pengguna loncat.

Acara dapat digunakan untuk melacak setiap kali seorang pemain ingin loncat. Alih-alih menggunakannya untuk membuat pemain loncat, ini harus digunakan untuk mengubah perilaku lompatan default - seperti menonaktifkan lompatan.

Misalnya, kode di bawah ini mengecualikan "Lompat" setiap kali pemain mengirim permintaan lompat.


local UserInputService = game:GetService("UserInputService")
function onJumpRequest()
print("Jump!")
end
UserInputService.JumpRequest:Connect(onJumpRequest)

Karena acara ini menyebabkan banyak kali untuk satu permintaan lompat, menggunakan debounce diperkenal.

Jika Anda ingin menghubungkan kunci atau tombol ke tindakan lain, pertimbangkan menggunakan acara seperti UserInputService:GetKeysPressed() dan UserInputService.InputBegan atau ContextActionService.

Karena acara ini hanya diaktifkan lokal, itu hanya dapat digunakan dalam LocalScript .


Contoh Kode

Disable Jumping

local UserInputService = game:GetService("UserInputService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local character = player.Character or player.CharacterAdded:Wait()
local humanoid = character:WaitForChild("Humanoid")
-- Fires when the user tries to jump
local function jump()
humanoid:SetStateEnabled(Enum.HumanoidStateType.Jumping, false)
end
UserInputService.JumpRequest:Connect(jump)

LastInputTypeChanged

Acara UserInputService.LastInputTypeChanged mengaktifkan setiap kali klien mengubah cara mereka berinteraksi melalui perangkat Human-Computer Interface. (yaitu dari MouseMovement ke MouseWheel atau dari Thumbstick1 ke Thumbstick2).

Untuk mendapatkan nilai dari ketikinput terakhir, terlepas dari apakah itu telah berubah, Anda dapat menggunakan fungsi UserInputService:GetLastInputType().

Karena acara ini hanya diaktifkan lokal, itu hanya dapat digunakan dalam LocalScript .

Parameter

lastInputType: Enum.UserInputType

A Enum.UserInputType menunjukkan ketikinput terakhir.


Contoh Kode

Hide Mouse During Keyboard Input

local UserInputService = game:GetService("UserInputService")
local mouseInput = {
Enum.UserInputType.MouseButton1,
Enum.UserInputType.MouseButton2,
Enum.UserInputType.MouseButton3,
Enum.UserInputType.MouseMovement,
Enum.UserInputType.MouseWheel,
}
local keyboard = Enum.UserInputType.Keyboard
local function toggleMouse(lastInputType)
if lastInputType == keyboard then
UserInputService.MouseIconEnabled = false
return
end
for _, mouse in pairs(mouseInput) do
if lastInputType == mouse then
UserInputService.MouseIconEnabled = true
return
end
end
end
UserInputService.LastInputTypeChanged:Connect(toggleMouse)

PointerAction

Tindakan Pointeur menyetel saat pengguna melakukan actionpoin tertentu. Misalnya, menyeret roda mouse.

Parameter

wheel: number
pan: Vector2
pinch: number
gameProcessedEvent: bool

TextBoxFocusReleased

Acara TextBoxFocusRelease dimulai ketika klien kehilangan fokus pada TextBox - biasanya ketika klien menghentikan entri teks ke dalam TextBox dengan menekan kembali atau mengklik/menyentuh di tempat lain di layar.

Misalnya, kode di bawah ini mencetak nama TextBox yang kehilangan fokus saat acara menembak.


local UserInputService = game:GetService("UserInputService")
function TextBoxFocusReleased(textbox)
print(textbox.Name)
end
UserInputService.TextBoxFocusReleased:Connect(TextBoxFocusReleased)

Dapat digunakan bersama dengan UserInputService.TextBoxFocused untuk melacak ketika TextBox mendapatkan dan kehilangan fokus.

Karena acara ini hanya diaktifkan lokal, itu hanya dapat digunakan dalam LocalScript .

Lihat juga:

Parameter

textboxReleased: TextBox

The TextBox yang kehilangan fokus.


Contoh Kode

TextBoxFocusReleased

local UserInputService = game:GetService("UserInputService")
UserInputService.TextBoxFocusReleased:Connect(function(textbox)
print("The name of the released focus TextBox is " .. textbox.Name)
end)

TextBoxFocused

Acara TextBoxFocused diaktifkan ketika seorang pemain menang fokus pada TextBox - biasanya ketika seorang klien mengklik/mengetuk pada kotak teks untuk memulai menulis teks. Ini juga diaktifkan jika kotak teks fokus menggunakan TextBox:CaptureFocus() .

Misalnya, kode di bawah ini mencetak nama TextBox yang fokus saat acara diaktifkan.


local UserInputService = game:GetService("UserInputService")
function TextBoxFocused(textbox)
print(textbox.Name)
end)
UserInputService.TextBoxFocused:Connect(TextBoxFocused)

Dapat digunakan bersama dengan UserInputService.FocusReleased untuk melacak ketika kotak teks mendapatkan dan kehilangan fokus.

Karena acara ini hanya diaktifkan lokal, itu hanya dapat digunakan dalam LocalScript .

Lihat juga:

Parameter

textboxFocused: TextBox

The TextBox yang mendapatkan fokus.


Contoh Kode

Modifying a TextBox on Focused and FocusReleased

local UserInputService = game:GetService("UserInputService")
local function textBoxFocused(textBox)
textBox.BackgroundTransparency = 0
end
local function textBoxFocusReleased(textBox)
textBox.BackgroundTransparency = 0.7
end
UserInputService.TextBoxFocused:Connect(textBoxFocused)
UserInputService.TextBoxFocusReleased:Connect(textBoxFocusReleased)

TouchEnded

Acara TouchEnded diaktifkan saat seorang pengguna melepaskan jari mereka dari layar TouchEnabled, mengakhiri input sentuh dengan perangkat.

Acara ini dapat digunakan untuk menentukan kapan seorang pengguna berhenti menyentuh layar perangkat mereka. Ini dapat dipasang dengan UserInputService.TouchStarted untuk menentukan kapan seorang pengguna mulai dan berhenti menyentuh layar.

Misalnya, kode di bawah ini mencetak posisi layar di mana pengguna berhenti menyentuh layar.


local UserInputService = game:GetService("UserInputService")
function TouchEnded(touch, gameProcessedEvent)
print("Touch ended at " .. tostring(touch.Position))
end
UserInputService.TouchEnded:Connect(TouchEnded)

Objek input sentuh sama objek input sepanjang masa sentuh. Jadi membandingkan InputObjects ketika mereka adalah objek sentuh adalah valid untuk menentukan apakah itu jari yang sama.

Untuk memeriksa apakah perangkat pengguna mendukung TouchEnabled, dan acara sentuh akan diaktifkan, lihat UserInputService.TouchEnabled .

Acara ini hanya diaktifkan ketika jendela klien Roblox berada dalam fokus. Misalnya, input tidak akan ditangkap saat jendela dikurangi.

Karena acara ini hanya diaktifkan lokal, itu hanya dapat digunakan dalam LocalScript .

Lihat juga:

Parameter

Sebuah kejadianInputObject, yang berisi informasi tentang masukan pengguna.

gameProcessedEvent: bool

Menunjukkan apakah mesin game secara internal mengamati input ini dan bertindak di atasnya. Biasanya ini mengacu pada pemrosesan UI, jadi jika tombol disentuh atau diklik dari input ini, gameProcessedEvent akan menjadi true . Ini juga berlaku untuk acara input yang terhubung melalui ContextActionService.


Contoh Kode

The Difference Between TouchTap and TouchLongPress

local UserInputService = game:GetService("UserInputService")
-- The parent of this script (a ScreenGui)
local touchScreenGui = script.Parent
-- Create the GUI frame that the user interacts with through Touch
-- events
local touchGui = Instance.new("Frame")
touchGui.Name = "TouchGui"
touchGui.AnchorPoint = Vector2.new(0.5, 0.5)
-- Fires when the touches their device's screen
local function TouchTap(touchPositions, _gameProcessedEvent)
touchGui.Parent = touchScreenGui
touchGui.Position = UDim2.new(0, touchPositions[1].X, 0, touchPositions[1].Y)
touchGui.Size = UDim2.new(0, 50, 0, 50)
end
-- Fires when a user starts touching their device's screen and does not
-- move their finger for a short period of time
local function TouchLong(_touchPositions, _state, _gameProcessedEvent)
touchGui.Size = UDim2.new(0, 100, 0, 100)
end
-- Fires when the user moves their finger while touching their device's
-- screen
local function TouchMove(touch, _gameProcessedEvent)
touchGui.Position = UDim2.new(0, touch.Position.X, 0, touch.Position.Y)
end
-- Fires when the user stops touching their device's screen
local function TouchEnd(_touch, _gameProcessedEvent)
touchGui.Parent = nil
touchGui.Size = UDim2.new(0, 50, 0, 50)
end
-- Only use the Touch events if the user is on a mobile device
if UserInputService.TouchEnabled then
UserInputService.TouchTap:Connect(TouchTap)
UserInputService.TouchLongPress:Connect(TouchLong)
UserInputService.TouchMoved:Connect(TouchMove)
UserInputService.TouchEnded:Connect(TouchEnd)
end

TouchLongPress

Diaktifkan saat pengguna memegang setidaknya satu jari selama waktu yang singkat di posisi layar yang sama dari perangkat yang Dipicu.

Acara ini dapat digunakan untuk menentukan kapan seorang pengguna menahan jari mereka di bawah dalam game GUI atau elemen.

Contoh di bawah ini mencetak state dari long press saat pengguna mengatakan setidaknya satu jari selama waktu yang singkat di posisi layar yang sama. Negara yang mungkin termasuk: Mulai , Perubah , 1> Akhir1> , 4> Batalkan4> dan <


local UserInputService = game:GetService("UserInputService")
function TouchLongPress(TouchPositions, state, gameProcessedEvent)
print("Long press event fired. State of press: " .. tostring(state))
end
UserInputService.TouchLongPress:Connect(TouchLongPress)

Untuk memeriksa apakah perangkat pengguna mendukung TouchEnabled, dan acara sentuh akan diaktifkan, lihat UserInputService.TouchEnabled .

Dapat dipasang dengan UserInputService.TouchStarted dan UserInputService.TouchEnded untuk menentukan kapan seorang pengguna memulai dan berhenti menyentuh layar.

Acara ini hanya diaktifkan ketika jendela klien Roblox berada dalam fokus. Misalnya, input tidak akan ditangkap saat jendela dikurangi.

Karena acara ini hanya diaktifkan lokal, itu hanya dapat digunakan dalam LocalScript .

Lihat juga:

Parameter

touchPositions: Array

Sebuah matriksi dari Vector2 objek, menunjukkan posisi jari-jari yang terlibat dalam gerakan.

The Enum.UserInputState of the gesture.

gameProcessedEvent: bool

Menunjukkan apakah mesin game secara internal mengamati input ini dan bertindak di atasnya. Biasanya ini mengacu pada pemrosesan UI, jadi jika tombol disentuh atau diklik dari input ini, gameProcessedEvent akan menjadi true . Ini juga berlaku untuk acara input yang terhubung melalui ContextActionService.


Contoh Kode

The Difference Between TouchTap and TouchLongPress

local UserInputService = game:GetService("UserInputService")
-- The parent of this script (a ScreenGui)
local touchScreenGui = script.Parent
-- Create the GUI frame that the user interacts with through Touch
-- events
local touchGui = Instance.new("Frame")
touchGui.Name = "TouchGui"
touchGui.AnchorPoint = Vector2.new(0.5, 0.5)
-- Fires when the touches their device's screen
local function TouchTap(touchPositions, _gameProcessedEvent)
touchGui.Parent = touchScreenGui
touchGui.Position = UDim2.new(0, touchPositions[1].X, 0, touchPositions[1].Y)
touchGui.Size = UDim2.new(0, 50, 0, 50)
end
-- Fires when a user starts touching their device's screen and does not
-- move their finger for a short period of time
local function TouchLong(_touchPositions, _state, _gameProcessedEvent)
touchGui.Size = UDim2.new(0, 100, 0, 100)
end
-- Fires when the user moves their finger while touching their device's
-- screen
local function TouchMove(touch, _gameProcessedEvent)
touchGui.Position = UDim2.new(0, touch.Position.X, 0, touch.Position.Y)
end
-- Fires when the user stops touching their device's screen
local function TouchEnd(_touch, _gameProcessedEvent)
touchGui.Parent = nil
touchGui.Size = UDim2.new(0, 50, 0, 50)
end
-- Only use the Touch events if the user is on a mobile device
if UserInputService.TouchEnabled then
UserInputService.TouchTap:Connect(TouchTap)
UserInputService.TouchLongPress:Connect(TouchLong)
UserInputService.TouchMoved:Connect(TouchMove)
UserInputService.TouchEnded:Connect(TouchEnd)
end

TouchMoved

Acara TouchMoved diaktifkan saat seorang pengguna menyesuaikan jari mereka di perangkat yang Diberdayakan.

Acara ini dapat digunakan untuk menentukan kapan seorang pengguna menggerakkan jari mereka saat menyentuh layar dari perangkat yang Diberdayakan sentuh. Ini dapat berguna untuk melacak apakah seorang pengguna menggerakkan jari mereka di layar, serta di mana pengguna menggerakkan jari mereka.

Kode di bawah ini mencetak "Sentuh pindah dari" posisi Vector2 sebelumnya "untuk" posisi Vector2 baru pada sentuh yang diaktifkan perangkat.


local UserInputService = game:GetService("UserInputService")
function onTouchMoved(touch, gameProcessedEvent)
local oldPosition = touch.Position - touch.Delta
print("Touch moved from " .. tostring(oldPosition) .. "to " .. tostring(touch.Position))
end
UserInputService.TouchMoved:Connect(onTouchMoved)

Dapat dipasang dengan UserInputService.TouchStarted dan UserInputService.TouchEnded untuk menentukan kapan seorang pengguna mulai menyentuh layar, bagaimana jari mereka bergerak saat menyentuhnya, dan kapan mereka berhenti menyentuh layar.

Untuk memeriksa apakah perangkat pengguna mendukung TouchEnabled, dan acara sentuh akan diaktifkan, lihat UserInputService.TouchEnabled .

Acara ini hanya diaktifkan ketika jendela klien Roblox berada dalam fokus. Misalnya, input tidak akan ditangkap saat jendela dikurangi.

Karena acara ini hanya diaktifkan lokal, itu hanya dapat digunakan dalam LocalScript .

Lihat juga:

Parameter

Sebuah kejadianInputObject, yang berisi informasi tentang masukan pengguna.

gameProcessedEvent: bool

Menunjukkan apakah mesin game secara internal mengamati input ini dan bertindak di atasnya. Biasanya ini mengacu pada pemrosesan UI, jadi jika tombol disentuh atau diklik dari input ini, gameProcessedEvent akan menjadi true . Ini juga berlaku untuk acara input yang terhubung melalui ContextActionService.


Contoh Kode

The Difference Between TouchTap and TouchLongPress

local UserInputService = game:GetService("UserInputService")
-- The parent of this script (a ScreenGui)
local touchScreenGui = script.Parent
-- Create the GUI frame that the user interacts with through Touch
-- events
local touchGui = Instance.new("Frame")
touchGui.Name = "TouchGui"
touchGui.AnchorPoint = Vector2.new(0.5, 0.5)
-- Fires when the touches their device's screen
local function TouchTap(touchPositions, _gameProcessedEvent)
touchGui.Parent = touchScreenGui
touchGui.Position = UDim2.new(0, touchPositions[1].X, 0, touchPositions[1].Y)
touchGui.Size = UDim2.new(0, 50, 0, 50)
end
-- Fires when a user starts touching their device's screen and does not
-- move their finger for a short period of time
local function TouchLong(_touchPositions, _state, _gameProcessedEvent)
touchGui.Size = UDim2.new(0, 100, 0, 100)
end
-- Fires when the user moves their finger while touching their device's
-- screen
local function TouchMove(touch, _gameProcessedEvent)
touchGui.Position = UDim2.new(0, touch.Position.X, 0, touch.Position.Y)
end
-- Fires when the user stops touching their device's screen
local function TouchEnd(_touch, _gameProcessedEvent)
touchGui.Parent = nil
touchGui.Size = UDim2.new(0, 50, 0, 50)
end
-- Only use the Touch events if the user is on a mobile device
if UserInputService.TouchEnabled then
UserInputService.TouchTap:Connect(TouchTap)
UserInputService.TouchLongPress:Connect(TouchLong)
UserInputService.TouchMoved:Connect(TouchMove)
UserInputService.TouchEnded:Connect(TouchEnd)
end

TouchPan

Acara TouchPan menyebabkan ketika seorang pengguna menyeret setidaknya satu jari di perangkat TouchEnabled .

Acara ini dapat digunakan untuk menentukan kapan seorang pengguna menyentuh jari mereka di layar perangkat yang Diberdayakan - seperti untuk memutar Camera dalam naskah kamera khusus.

Petikan di bawah ini mencetak "Kecepatan geser sentuh" setelah kecepatan sentuh pengguna ketika pengguna menyeret jari mereka di layar.


local UserInputService = game:GetService("UserInputService")
UserInputService.TouchPan:Connect(function(touchPositions, totalTranslation, velocity, state, gameProcessedEvent)
print("Speed of touch drag: " .. tostring(velocity))
end)

Lihat fungsi UserInputService lainnya yang berguna di sini UserInputService.TouchRotate .

Acara ini hanya diaktifkan ketika jendela klien Roblox berada dalam fokus. Misalnya, input tidak akan ditangkap saat jendela dikurangi.

Karena acara ini hanya diaktifkan lokal, itu hanya dapat digunakan dalam LocalScript .

Lihat juga:

Parameter

touchPositions: Array

Sebuah matriksi dari Vector2 objek, menunjukkan posisi sentuh (jari, dll) yang terlibat dalam gerakan.

totalTranslation: Vector2

Ukuran panah dari awal hingga akhir (dalam pixel).

velocity: Vector2

Kecepatan gerakan pan (dalam pixel) per detik.

The Enum.UserInputState of the gesture.

gameProcessedEvent: bool

Menunjukkan apakah mesin game secara internal mengamati input ini dan bertindak di atasnya. Biasanya ini mengacu pada pemrosesan UI, jadi jika tombol disentuh atau diklik dari input ini, gameProcessedEvent akan menjadi true . Ini juga berlaku untuk acara input yang terhubung melalui ContextActionService.


Contoh Kode

Create a Custom CameraScript

local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local Players = game:GetService("Players")
local camera = workspace.CurrentCamera
local player = Players.LocalPlayer
local character = player.CharacterAdded:Wait()
local torso = character:WaitForChild("HumanoidRootPart")
local playerPosition = torso.Position
local default_CameraPosition = torso.Position
local default_CameraRotation = Vector2.new(0, math.rad(-60))
local default_CameraZoom = 15
local cameraPosition = default_CameraPosition
local cameraRotation = default_CameraRotation
local cameraZoom = default_CameraZoom
local cameraZoomBounds = nil -- {10,200}
local cameraRotateSpeed = 10
local cameraMouseRotateSpeed = 0.25
local cameraTouchRotateSpeed = 10
local function SetCameraMode()
camera.CameraType = "Scriptable"
camera.FieldOfView = 80
camera.CameraSubject = nil
end
local function UpdateCamera()
SetCameraMode()
local cameraRotationCFrame = CFrame.Angles(0, cameraRotation.X, 0) * CFrame.Angles(cameraRotation.Y, 0, 0)
camera.CFrame = cameraRotationCFrame + cameraPosition + cameraRotationCFrame * Vector3.new(0, 0, cameraZoom)
camera.Focus = camera.CFrame - Vector3.new(0, camera.CFrame.p.Y, 0)
end
local lastTouchTranslation = nil
local function TouchMove(_touchPositions, totalTranslation, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = totalTranslation - lastTouchTranslation
cameraPosition = cameraPosition + Vector3.new(difference.X, 0, difference.Y)
UpdateCamera()
end
lastTouchTranslation = totalTranslation
end
local lastTouchRotation = nil
local function TouchRotate(_touchPositions, rotation, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = rotation - lastTouchRotation
cameraRotation = cameraRotation
+ Vector2.new(-difference, 0) * math.rad(cameraTouchRotateSpeed * cameraRotateSpeed)
UpdateCamera()
end
lastTouchRotation = rotation
end
local lastTouchScale = nil
local function TouchZoom(_touchPositions, scale, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = scale - lastTouchScale
cameraZoom = cameraZoom * (1 + difference)
if cameraZoomBounds ~= nil then
cameraZoom = math.min(math.max(cameraZoom, cameraZoomBounds[1]), cameraZoomBounds[2])
else
cameraZoom = math.max(cameraZoom, 0)
end
UpdateCamera()
end
lastTouchScale = scale
end
local function Input(inputObject)
if inputObject.UserInputType == Enum.UserInputType.Keyboard then
if inputObject.UserInputState == Enum.UserInputState.Begin then
-- (I) Zoom In
if inputObject.KeyCode == Enum.KeyCode.I then
cameraZoom = cameraZoom - 15
elseif inputObject.KeyCode == Enum.KeyCode.O then
cameraZoom = cameraZoom + 15
end
-- (O) Zoom Out
if cameraZoomBounds ~= nil then
cameraZoom = math.min(math.max(cameraZoom, cameraZoomBounds[1]), cameraZoomBounds[2])
else
cameraZoom = math.max(cameraZoom, 0)
end
UpdateCamera()
end
end
local pressed = UserInputService:IsMouseButtonPressed(Enum.UserInputType.MouseButton1)
if pressed then
UserInputService.MouseBehavior = Enum.MouseBehavior.LockCurrentPosition
local rotation = UserInputService:GetMouseDelta()
cameraRotation = cameraRotation + rotation * math.rad(cameraMouseRotateSpeed)
else
UserInputService.MouseBehavior = Enum.MouseBehavior.Default
end
end
local function PlayerChanged()
local movement = torso.Position - playerPosition
cameraPosition = cameraPosition + movement
playerPosition = torso.Position
UpdateCamera()
end
-- Determine whether the user is on a mobile device
if UserInputService.TouchEnabled then
-- The user is on a mobile device, use Touch events
UserInputService.TouchPan:Connect(TouchMove)
UserInputService.TouchRotate:Connect(TouchRotate)
UserInputService.TouchPinch:Connect(TouchZoom)
else
-- The user is not on a mobile device use Input events
UserInputService.InputBegan:Connect(Input)
UserInputService.InputChanged:Connect(Input)
UserInputService.InputEnded:Connect(Input)
-- Camera controlled by player movement
task.wait(2)
RunService:BindToRenderStep("PlayerChanged", Enum.RenderPriority.Camera.Value - 1, PlayerChanged)
end

TouchPinch

Diaktifkan ketika seorang pengguna menempatkan dan menyesuaikan dua jari di layar perangkat TouchEnabled .

kejadian, potongan kode di bawah ini menunjukkan seberapa banyak skala zoom kamera telah berubah sejak awal touch pinch.


local UserInputService = game:GetService("UserInputService")
UserInputService.TouchPinch:Connect(function(touchPositions, scale, velocity, state, gameProcessedEvent)
print("Scale difference since beginning of pinch: " .. tostring(scale))
end)

Untuk memeriksa apakah perangkat pengguna mendukung TouchEnabled, dan acara sentuh akan diaktifkan, lihat UserInputService.TouchEnabled .

Acara ini hanya diaktifkan ketika jendela klien Roblox berada dalam fokus. Misalnya, input tidak akan ditangkap saat jendela dikurangi. Sebagai acara ini hanya diaktifkan secara lokal, itu hanya dapat digunakan dalam LocalScript .

Lihat juga:

Parameter

touchPositions: Array

Sebuah matriks Vector2s , menunjukkan posisi layar, dalam pixel, dari jari-jari yang terlibat dalam gerakan pemasukan.

scale: number

Kecualian untuk memulai dari posisi pemotongan pada awalnya (dalam pixel) dibagi dengan posisi pemotongan awal.

velocity: number

Kecepatan gerakan tekan (dalam pixel) per detik.

The Enum.UserInputState of the gesture.

gameProcessedEvent: bool

Menunjukkan apakah mesin game secara internal mengamati input ini dan bertindak di atasnya. Biasanya ini mengacu pada pemrosesan UI, jadi jika tombol disentuh atau diklik dari input ini, gameProcessedEvent akan menjadi true . Ini juga berlaku untuk acara input yang terhubung melalui ContextActionService.


Contoh Kode

Create a Custom CameraScript

local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local Players = game:GetService("Players")
local camera = workspace.CurrentCamera
local player = Players.LocalPlayer
local character = player.CharacterAdded:Wait()
local torso = character:WaitForChild("HumanoidRootPart")
local playerPosition = torso.Position
local default_CameraPosition = torso.Position
local default_CameraRotation = Vector2.new(0, math.rad(-60))
local default_CameraZoom = 15
local cameraPosition = default_CameraPosition
local cameraRotation = default_CameraRotation
local cameraZoom = default_CameraZoom
local cameraZoomBounds = nil -- {10,200}
local cameraRotateSpeed = 10
local cameraMouseRotateSpeed = 0.25
local cameraTouchRotateSpeed = 10
local function SetCameraMode()
camera.CameraType = "Scriptable"
camera.FieldOfView = 80
camera.CameraSubject = nil
end
local function UpdateCamera()
SetCameraMode()
local cameraRotationCFrame = CFrame.Angles(0, cameraRotation.X, 0) * CFrame.Angles(cameraRotation.Y, 0, 0)
camera.CFrame = cameraRotationCFrame + cameraPosition + cameraRotationCFrame * Vector3.new(0, 0, cameraZoom)
camera.Focus = camera.CFrame - Vector3.new(0, camera.CFrame.p.Y, 0)
end
local lastTouchTranslation = nil
local function TouchMove(_touchPositions, totalTranslation, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = totalTranslation - lastTouchTranslation
cameraPosition = cameraPosition + Vector3.new(difference.X, 0, difference.Y)
UpdateCamera()
end
lastTouchTranslation = totalTranslation
end
local lastTouchRotation = nil
local function TouchRotate(_touchPositions, rotation, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = rotation - lastTouchRotation
cameraRotation = cameraRotation
+ Vector2.new(-difference, 0) * math.rad(cameraTouchRotateSpeed * cameraRotateSpeed)
UpdateCamera()
end
lastTouchRotation = rotation
end
local lastTouchScale = nil
local function TouchZoom(_touchPositions, scale, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = scale - lastTouchScale
cameraZoom = cameraZoom * (1 + difference)
if cameraZoomBounds ~= nil then
cameraZoom = math.min(math.max(cameraZoom, cameraZoomBounds[1]), cameraZoomBounds[2])
else
cameraZoom = math.max(cameraZoom, 0)
end
UpdateCamera()
end
lastTouchScale = scale
end
local function Input(inputObject)
if inputObject.UserInputType == Enum.UserInputType.Keyboard then
if inputObject.UserInputState == Enum.UserInputState.Begin then
-- (I) Zoom In
if inputObject.KeyCode == Enum.KeyCode.I then
cameraZoom = cameraZoom - 15
elseif inputObject.KeyCode == Enum.KeyCode.O then
cameraZoom = cameraZoom + 15
end
-- (O) Zoom Out
if cameraZoomBounds ~= nil then
cameraZoom = math.min(math.max(cameraZoom, cameraZoomBounds[1]), cameraZoomBounds[2])
else
cameraZoom = math.max(cameraZoom, 0)
end
UpdateCamera()
end
end
local pressed = UserInputService:IsMouseButtonPressed(Enum.UserInputType.MouseButton1)
if pressed then
UserInputService.MouseBehavior = Enum.MouseBehavior.LockCurrentPosition
local rotation = UserInputService:GetMouseDelta()
cameraRotation = cameraRotation + rotation * math.rad(cameraMouseRotateSpeed)
else
UserInputService.MouseBehavior = Enum.MouseBehavior.Default
end
end
local function PlayerChanged()
local movement = torso.Position - playerPosition
cameraPosition = cameraPosition + movement
playerPosition = torso.Position
UpdateCamera()
end
-- Determine whether the user is on a mobile device
if UserInputService.TouchEnabled then
-- The user is on a mobile device, use Touch events
UserInputService.TouchPan:Connect(TouchMove)
UserInputService.TouchRotate:Connect(TouchRotate)
UserInputService.TouchPinch:Connect(TouchZoom)
else
-- The user is not on a mobile device use Input events
UserInputService.InputBegan:Connect(Input)
UserInputService.InputChanged:Connect(Input)
UserInputService.InputEnded:Connect(Input)
-- Camera controlled by player movement
task.wait(2)
RunService:BindToRenderStep("PlayerChanged", Enum.RenderPriority.Camera.Value - 1, PlayerChanged)
end

TouchRotate

Acara TouchRotate menyetel saat pengguna menggulir dua jari di perangkat TouchEnabled .

Misalnya, kode berikut menunjukkan berapa banyak kamera telah berputar sejak awal rotasi sentuh.


local UserInputService = game:GetService("UserInputService")
UserInputService.TouchRotate:Connect(function(touchPositions, rotation, velocity, state, gameProcessedEvent)
print("Camera has rotated " .. tostring(rotation) .. " degrees!")
end)

Untuk memeriksa apakah perangkat pengguna mendukung TouchEnabled, dan acara sentuh akan diaktifkan, lihat UserInputService.TouchEnabled .

Acara ini hanya diaktifkan ketika jendela klien Roblox berada dalam fokus. Misalnya, input tidak akan ditangkap saat jendela dikurangi.

Karena acara ini hanya diaktifkan lokal, itu hanya dapat digunakan dalam LocalScript .

Skrip inti yang mengontrol kamera pengguna di perangkat mobile menggunakan kode yang berfungsi secara serupa dengan acara ini. Praktik terbaik untuk acara ini adalah menggunakannya saat membuat sistem kamera mobile untuk menghapus kode inti default.

Lihat juga:

Parameter

touchPositions: Array

Sebuah matriksi dari Vector2s, yang menunjukkan posisi jari-jari yang terlibat dalam gerakan.

rotation: number

Jumlah derajat gerakan telah berputar sejak awal gerakan.

velocity: number

Perubahan rotasi (dalam derajat) dibagi dengan durasi perubahan (dalam detik).

The Enum.UserInputState of the gesture.

gameProcessedEvent: bool

Menunjukkan apakah mesin game secara internal mengamati input ini dan bertindak di atasnya. Biasanya ini mengacu pada pemrosesan UI, jadi jika tombol disentuh atau diklik dari input ini, gameProcessedEvent akan menjadi true . Ini juga berlaku untuk acara input yang terhubung melalui ContextActionService.


Contoh Kode

Create a Custom CameraScript

local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local Players = game:GetService("Players")
local camera = workspace.CurrentCamera
local player = Players.LocalPlayer
local character = player.CharacterAdded:Wait()
local torso = character:WaitForChild("HumanoidRootPart")
local playerPosition = torso.Position
local default_CameraPosition = torso.Position
local default_CameraRotation = Vector2.new(0, math.rad(-60))
local default_CameraZoom = 15
local cameraPosition = default_CameraPosition
local cameraRotation = default_CameraRotation
local cameraZoom = default_CameraZoom
local cameraZoomBounds = nil -- {10,200}
local cameraRotateSpeed = 10
local cameraMouseRotateSpeed = 0.25
local cameraTouchRotateSpeed = 10
local function SetCameraMode()
camera.CameraType = "Scriptable"
camera.FieldOfView = 80
camera.CameraSubject = nil
end
local function UpdateCamera()
SetCameraMode()
local cameraRotationCFrame = CFrame.Angles(0, cameraRotation.X, 0) * CFrame.Angles(cameraRotation.Y, 0, 0)
camera.CFrame = cameraRotationCFrame + cameraPosition + cameraRotationCFrame * Vector3.new(0, 0, cameraZoom)
camera.Focus = camera.CFrame - Vector3.new(0, camera.CFrame.p.Y, 0)
end
local lastTouchTranslation = nil
local function TouchMove(_touchPositions, totalTranslation, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = totalTranslation - lastTouchTranslation
cameraPosition = cameraPosition + Vector3.new(difference.X, 0, difference.Y)
UpdateCamera()
end
lastTouchTranslation = totalTranslation
end
local lastTouchRotation = nil
local function TouchRotate(_touchPositions, rotation, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = rotation - lastTouchRotation
cameraRotation = cameraRotation
+ Vector2.new(-difference, 0) * math.rad(cameraTouchRotateSpeed * cameraRotateSpeed)
UpdateCamera()
end
lastTouchRotation = rotation
end
local lastTouchScale = nil
local function TouchZoom(_touchPositions, scale, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = scale - lastTouchScale
cameraZoom = cameraZoom * (1 + difference)
if cameraZoomBounds ~= nil then
cameraZoom = math.min(math.max(cameraZoom, cameraZoomBounds[1]), cameraZoomBounds[2])
else
cameraZoom = math.max(cameraZoom, 0)
end
UpdateCamera()
end
lastTouchScale = scale
end
local function Input(inputObject)
if inputObject.UserInputType == Enum.UserInputType.Keyboard then
if inputObject.UserInputState == Enum.UserInputState.Begin then
-- (I) Zoom In
if inputObject.KeyCode == Enum.KeyCode.I then
cameraZoom = cameraZoom - 15
elseif inputObject.KeyCode == Enum.KeyCode.O then
cameraZoom = cameraZoom + 15
end
-- (O) Zoom Out
if cameraZoomBounds ~= nil then
cameraZoom = math.min(math.max(cameraZoom, cameraZoomBounds[1]), cameraZoomBounds[2])
else
cameraZoom = math.max(cameraZoom, 0)
end
UpdateCamera()
end
end
local pressed = UserInputService:IsMouseButtonPressed(Enum.UserInputType.MouseButton1)
if pressed then
UserInputService.MouseBehavior = Enum.MouseBehavior.LockCurrentPosition
local rotation = UserInputService:GetMouseDelta()
cameraRotation = cameraRotation + rotation * math.rad(cameraMouseRotateSpeed)
else
UserInputService.MouseBehavior = Enum.MouseBehavior.Default
end
end
local function PlayerChanged()
local movement = torso.Position - playerPosition
cameraPosition = cameraPosition + movement
playerPosition = torso.Position
UpdateCamera()
end
-- Determine whether the user is on a mobile device
if UserInputService.TouchEnabled then
-- The user is on a mobile device, use Touch events
UserInputService.TouchPan:Connect(TouchMove)
UserInputService.TouchRotate:Connect(TouchRotate)
UserInputService.TouchPinch:Connect(TouchZoom)
else
-- The user is not on a mobile device use Input events
UserInputService.InputBegan:Connect(Input)
UserInputService.InputChanged:Connect(Input)
UserInputService.InputEnded:Connect(Input)
-- Camera controlled by player movement
task.wait(2)
RunService:BindToRenderStep("PlayerChanged", Enum.RenderPriority.Camera.Value - 1, PlayerChanged)
end

TouchStarted

Acara TouchStarted menyala saat seorang pengguna menempatkan jari mereka di perangkat TouchEnabled, dimulai dengan masukan sentuh dengan perangkat.

Acara ini dapat digunakan untuk menentukan kapan seorang pengguna mulai menyentuh layar perangkat mereka. Ini dapat dipasang dengan UserInputService.TouchEnded untuk menentukan kapan seorang pengguna mulai dan berhenti menyentuh layar.

Objek input sentuh sama objek input sepanjang masa sentuh. Jadi membandingkan InputObjects ketika mereka adalah objek sentuh adalah valid untuk menentukan apakah itu jari yang sama.

Untuk memeriksa apakah perangkat pengguna mendukung TouchEnabled, dan acara sentuh akan diaktifkan, lihat UserInputService.TouchEnabled .

Acara ini hanya diaktifkan ketika jendela klien Roblox berada dalam fokus. Misalnya, input tidak akan ditangkap saat jendela dikurangi.

Karena acara ini hanya diaktifkan lokal, itu hanya dapat digunakan dalam LocalScript .

Lihat juga:

Parameter

Sebuah kejadianInputObject, yang berisi informasi tentang masukan pengguna.

gameProcessedEvent: bool

Menunjukkan apakah mesin game secara internal mengamati input ini dan bertindak di atasnya. Biasanya ini mengacu pada pemrosesan UI, jadi jika tombol disentuh atau diklik dari input ini, gameProcessedEvent akan menjadi true . Ini juga berlaku untuk acara input yang terhubung melalui ContextActionService.


Contoh Kode

Tracking Touches

local UserInputService = game:GetService("UserInputService")
local dragging
local dragInput
local dragStart
local startPos
local gui = script.Parent
local function touchStarted(input, _gameProcessed)
if not dragging then
dragging = true
dragInput = input
dragStart = input.Position
startPos = gui.Position
end
end
local function update(input, _gameProcessed)
if input == dragInput and dragging then
local delta = input.Position - dragStart
gui.Position = UDim2.new(
startPos.X.Scale,
startPos.X.Offset + delta.X,
startPos.Y.Scale,
startPos.Y.Offset + delta.Y
)
end
end
local function touchEnded(input, _gameProcessed)
if input == dragInput then
dragging = false
end
end
UserInputService.TouchStarted:Connect(touchStarted)
UserInputService.TouchMoved:Connect(update)
UserInputService.TouchEnded:Connect(touchEnded)

TouchSwipe

Acara TouchSwipe diaktifkan ketika pengguna menyentuh jari mereka di perangkat TouchEnabled .

Acara ini dapat digunakan untuk menentukan kapan pengguna menyentuh jari mereka di layar perangkat mereka dan arah yang di geser pengguna.

Untuk melacak gerakan input sentuh dengan lebih tepat, gunakan menggunakan UserInputService.TouchMoved

Untuk memeriksa apakah perangkat pengguna mendukung TouchEnabled, dan acara sentuh akan diaktifkan, lihat UserInputService.TouchEnabled .

Acara ini hanya diaktifkan ketika jendela klien Roblox berada dalam fokus. Misalnya, input tidak akan ditangkap saat jendela dikurangi.

Karena acara ini hanya diaktifkan lokal, itu hanya dapat digunakan dalam LocalScript .

Lihat juga:

Parameter

swipeDirection: Enum.SwipeDirection

Sebuah Enum.SwipeDirection, menunjukkan arah yang di geser oleh pengguna.

numberOfTouches: number

Jumlah sentuhan (jari, dll) yang terlibat dalam gerakan.

gameProcessedEvent: bool

Menunjukkan apakah mesin game secara internal mengamati input ini dan bertindak di atasnya. Biasanya ini mengacu pada pemrosesan UI, jadi jika tombol disentuh atau diklik dari input ini, gameProcessedEvent akan menjadi true . Ini juga berlaku untuk acara input yang terhubung melalui ContextActionService.


Contoh Kode

Touch Swipe a GUI

local UserInputService = game:GetService("UserInputService")
local gui = script.Parent
local swipePositionY = gui.Position.Y.Offset
local swipePositionX = gui.Position.X.Offset
local camera = workspace.CurrentCamera
local maxY = camera.ViewportSize.Y - gui.Size.Y.Offset
local maxX = camera.ViewportSize.X - gui.Size.X.Offset
local function TouchSwipe(swipeDirection, _numberOfTouches, _gameProcessedEvent)
if swipeDirection == Enum.SwipeDirection.Up then
swipePositionY = math.max(swipePositionY - 200, 0)
elseif swipeDirection == Enum.SwipeDirection.Down then
swipePositionY = math.min(swipePositionY + 200, maxY)
elseif swipeDirection == Enum.SwipeDirection.Left then
swipePositionX = math.max(swipePositionX - 200, 0)
elseif swipeDirection == Enum.SwipeDirection.Right then
swipePositionX = math.min(swipePositionX + 200, maxX)
end
gui:TweenPosition(UDim2.new(0, swipePositionX, 0, swipePositionY), "Out", "Quad", 0.25, true)
end
UserInputService.TouchSwipe:Connect(TouchSwipe)

TouchTap

Acara TouchTap diaktifkan ketika pengguna menyentuh/mengetuk jari mereka di layar pada perangkat TouchEnabled ini.

Acara ini akan berfungsi terlepas dari apakah pengguna menyentuh/menyentuh dunia game atau elemen GUI. Jika Anda mencari acara yang hanya berfungsi saat pengguna menyentuh/menyentuh dunia game, gunakan UserInputService.TouchTapInWorld.

Untuk memeriksa apakah perangkat pengguna mendukung TouchEnabled, dan acara sentuh akan diaktifkan, lihat UserInputService.TouchEnabled .

Acara ini hanya diaktifkan ketika jendela klien Roblox berada dalam fokus. Misalnya, input tidak akan ditangkap saat jendela dikurangi.

Karena acara ini hanya diaktifkan lokal, itu hanya dapat digunakan dalam LocalScript .

Parameter

touchPositions: Array

Sebuah matriksi dari Vector2 objek, menunjukkan posisi jari-jari yang terlibat dalam gestur sentuh.

gameProcessedEvent: bool

Menunjukkan apakah mesin game secara internal mengamati input ini dan bertindak di atasnya. Biasanya ini mengacu pada pemrosesan UI, jadi jika tombol disentuh atau diklik dari input ini, gameProcessedEvent akan menjadi true . Ini juga berlaku untuk acara input yang terhubung melalui ContextActionService.


Contoh Kode

The Difference Between TouchTap and TouchLongPress

local UserInputService = game:GetService("UserInputService")
-- The parent of this script (a ScreenGui)
local touchScreenGui = script.Parent
-- Create the GUI frame that the user interacts with through Touch
-- events
local touchGui = Instance.new("Frame")
touchGui.Name = "TouchGui"
touchGui.AnchorPoint = Vector2.new(0.5, 0.5)
-- Fires when the touches their device's screen
local function TouchTap(touchPositions, _gameProcessedEvent)
touchGui.Parent = touchScreenGui
touchGui.Position = UDim2.new(0, touchPositions[1].X, 0, touchPositions[1].Y)
touchGui.Size = UDim2.new(0, 50, 0, 50)
end
-- Fires when a user starts touching their device's screen and does not
-- move their finger for a short period of time
local function TouchLong(_touchPositions, _state, _gameProcessedEvent)
touchGui.Size = UDim2.new(0, 100, 0, 100)
end
-- Fires when the user moves their finger while touching their device's
-- screen
local function TouchMove(touch, _gameProcessedEvent)
touchGui.Position = UDim2.new(0, touch.Position.X, 0, touch.Position.Y)
end
-- Fires when the user stops touching their device's screen
local function TouchEnd(_touch, _gameProcessedEvent)
touchGui.Parent = nil
touchGui.Size = UDim2.new(0, 50, 0, 50)
end
-- Only use the Touch events if the user is on a mobile device
if UserInputService.TouchEnabled then
UserInputService.TouchTap:Connect(TouchTap)
UserInputService.TouchLongPress:Connect(TouchLong)
UserInputService.TouchMoved:Connect(TouchMove)
UserInputService.TouchEnded:Connect(TouchEnd)
end

TouchTapInWorld

Acara TouchTapInWorld diaktifkan saat pengguna menyentuh/mengetuk jari mereka di layar pada perangkat TouchEnabled ini. Ini diaktifkan saat pengguna berada di dunia game.

Acara ini dapat digunakan untuk menentukan kapan seorang pengguna mengetuk layar dan tidak mengetuk elemen GUI. Jika pengguna mengetuk elemen GUI, UserInputService.TouchTap akan diaktifkan alih-alih TouchTapInWorld.

Untuk memeriksa apakah perangkat pengguna mendukung TouchEnabled, dan acara sentuh akan diaktifkan, lihat UserInputService.TouchEnabled .

Acara ini hanya diaktifkan ketika jendela klien Roblox berada dalam fokus. Misalnya, input tidak akan ditangkap saat jendela dikurangi.

Karena hanya mengeksekusi lokal, itu hanya dapat digunakan dalam LocalScript .

Lihat juga:

Parameter

position: Vector2

A Vector2 menunjukkan posisi sentuh.

processedByUI: bool

Apakah pengguna mengetuk elemen GUI.


Contoh Kode

Create a Part in World at Touch Position

local UserInputService = game:GetService("UserInputService")
local camera = workspace.CurrentCamera
local LENGTH = 500
local function createPart(position, processedByUI)
-- Do not create a part if the player clicked on a GUI/UI element
if processedByUI then
return
end
-- Get Vector3 world position from the Vector2 viewport position
local unitRay = camera:ViewportPointToRay(position.X, position.Y)
local ray = Ray.new(unitRay.Origin, unitRay.Direction * LENGTH)
local hitPart, worldPosition = workspace:FindPartOnRay(ray)
-- Create a new part at the world position if the player clicked on a part
-- Do not create a new part if player clicks on empty skybox
if hitPart then
local part = Instance.new("Part")
part.Parent = workspace
part.Anchored = true
part.Size = Vector3.new(1, 1, 1)
part.Position = worldPosition
end
end
UserInputService.TouchTapInWorld:Connect(createPart)

WindowFocusReleased

Acara UserInputService WindowFocusRelease saat jendela Roblox client kehilangan fokus - biasanya saat Roblox client dikurangi oleh pengguna.

Misalnya, kode di bawah ini mengecualikan "Window focus released" setiap kali klien Roblox kehilangan fokus.


local UserInputService = game:GetService("UserInputService")
UserInputService.WindowFocusReleased:Connect(function()
print("Window focus released")
end)

Acara ini dapat digunakan bersamaan dengan UserInputService.WindowFocused untuk melacak apakah klien Roblox aktif fokus pada layar pengguna.

Karena hanya mengeksekusi lokal, itu hanya dapat digunakan dalam LocalScript .


Contoh Kode

Window Focus AFK Script (Script)

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local afkEvent = Instance.new("RemoteEvent")
afkEvent.Name = "AfkEvent"
afkEvent.Parent = ReplicatedStorage
local function setAfk(player, afk)
if afk then
local forcefield = Instance.new("ForceField")
forcefield.Parent = player.Character
else
local forcefield = player.Character:FindFirstChildOfClass("ForceField")
if forcefield then
forcefield:Destroy()
end
end
end
afkEvent.OnServerEvent:Connect(setAfk)
Window Focus AFK Script (LocalScript)

local UserInputService = game:GetService("UserInputService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local afkEvent = ReplicatedStorage:WaitForChild("AfkEvent")
local function focusGained()
afkEvent:FireServer(false)
end
local function focusReleased()
afkEvent:FireServer(true)
end
UserInputService.WindowFocused:Connect(focusGained)
UserInputService.WindowFocusReleased:Connect(focusReleased)

WindowFocused

Acara UserInputService WindowFocused menyala saat jendela Roblox client mendapat fokus - biasanya saat Roblox client maksimal/aktif dibuka di layar pengguna.

Misalnya, kode di bawah ini mengeprint "Window focused" setiap kali klien Roblox mendapatkan fokus.


local UserInputService = game:GetService("UserInputService")
UserInputService.WindowFocused:Connect(function()
print("Window focused")
end)

Acara ini dapat digunakan bersamaan dengan UserInputService.WindowFocusReleased untuk melacak apakah klien Roblox aktif fokus pada layar pengguna.

Karena acara ini hanya diaktifkan lokal, itu hanya dapat digunakan dalam LocalScript .


Contoh Kode

Window Focus AFK Script (Script)

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local afkEvent = Instance.new("RemoteEvent")
afkEvent.Name = "AfkEvent"
afkEvent.Parent = ReplicatedStorage
local function setAfk(player, afk)
if afk then
local forcefield = Instance.new("ForceField")
forcefield.Parent = player.Character
else
local forcefield = player.Character:FindFirstChildOfClass("ForceField")
if forcefield then
forcefield:Destroy()
end
end
end
afkEvent.OnServerEvent:Connect(setAfk)
Window Focus AFK Script (LocalScript)

local UserInputService = game:GetService("UserInputService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local afkEvent = ReplicatedStorage:WaitForChild("AfkEvent")
local function focusGained()
afkEvent:FireServer(false)
end
local function focusReleased()
afkEvent:FireServer(true)
end
UserInputService.WindowFocused:Connect(focusGained)
UserInputService.WindowFocusReleased:Connect(focusReleased)