UserInputService

Hiển Thị Bản Đã Lỗi Thời

*Nội dung này được dịch bằng AI (Beta) và có thể có lỗi. Để xem trang này bằng tiếng Anh, hãy nhấp vào đây.

Không Thể Tạo
Dịch Vụ
Không Sao Chép

UserInputService là một dịch vụ được sử dụng để phát hiện và bắt các loại nhập khác nhau có sẵn trên thiết bị của người dùng.

Mục đích chính của dịch vụ này là cho phép các trải nghiệm hợp tác với nhiều hình dạng nhập sẵn, chẳng hạn như gamepads, màn hình cảm ứng và bàn phím. Nó cho phép một LocalScript để thực hiện các hành động khác nhau tùy thuộc vào th

Một số cách sử dụng dịch vụ này bao gồm xác định nhập người dùng khi họ tương tác với GUI, công cụ và các instância game khác. Để xác định nhập người dùng, dịch vụ phải tìm ki

Vì dịch vụ này chỉ dành cho phía client, nó sẽ chỉ hoạt động khi được sử dụng trong một LocalScript hoặc một ModuleScript yêu cầu bởi một LocalScript . Khi UserInputService là bên client, người dùng trong trò chơi chỉ có thể xác n

Xem thêm ContextActionService, một dịch vụ cho phép bạn kết hợp chức năng với nhiều đầu vào của người dùng.

Mẫu mã

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)

Tóm Tắt

Thuộc Tính

  • Chỉ Đọc
    Không Sao Chép
    Đọc Song Song

    Mô tả có tích hợp accelerometer trên thiết bị của người dùng không.

  • Chỉ Đọc
    Không Sao Chép
    Đọc Song Song

    Mô tả có sẵn gamepad cho thiết bị đang được sử dụng bởi một người dùng không.

  • Chỉ Đọc
    Không Sao Chép
    Đọc Song Song

    Mô tả apakah thiết bị của người dùng có cảm biến gyro.

  • Chỉ Đọc
    Không Sao Chép
    Đọc Song Song

    Mô tả có phím bàn phím có sẵn trên thiết bị của người dùng không.

  • Xác định có thể di chuyển chuột người dùng miễn phí hay không hoặc bị khóa.

  • Không Sao Chép
    Đọc Song Song

    Cân nặng tổng sản lượng của user's Mouse .

  • Chỉ Đọc
    Không Sao Chép
    Đọc Song Song

    Mô tả có sẵn một chuột cho thiết bị của người dùng không.

  • MouseIcon:ContentId
    Đọc Song Song

    ID nội dung của hình ảnh được sử dụng như một biểu tượng người dùng.

  • Đọc Song Song

    Xác định có phải biểu tượng Mouse hiển thị không.

  • Chỉ Đọc
    Không Sao Chép
    Đọc Song Song

    Xác định vị trí của bàn phím trên màn hình.

  • Chỉ Đọc
    Không Sao Chép
    Đọc Song Song

    Xác định kích thước của bàn phím trên màn hình.

  • Chỉ Đọc
    Không Sao Chép
    Đọc Song Song

    Mô tả liệu bàn phím trên màn hình hiện có đang hiển thị trên màn hình của người dùng hay không.

  • Chỉ Đọc
    Không Sao Chép
    Đọc Song Song

    Mô tả có sẵn màn hình cảm ứng cho thiết bị của người dùng không.

  • Chỉ Đọc
    Không Sao Chép
    Đọc Song Song

    Chỉ ra có phải người dùng đang sử dụng một bộ nghe thực tai ngheảo tượng.

Phương Pháp

Sự Kiện

Thuộc Tính

AccelerometerEnabled

Chỉ Đọc
Không Sao Chép
Đọc Song Song

Đặ性 này mô tả có tốc độ nâng hạ

Một accelerometer là một thành phần được tìm thấy trên hầu hết các thiết bị di động đo tốc độ (thay đổi trong tốc độ).

Ví dụ, mảnh code sau đây cho thấy cách kiểm tra có sử dụng thiết bị của người dùng có tích hợp thiết bị đo tốc độ hay không.


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

Nếu thiết bị có một accelerometer được kích hoạt, bạn có thể nhận được tốc độ tăng trưởng hiện tại của nó bằng cách sử dụng chức năng UserInputService:GetDeviceAcceleration() hoặc theo dõi khi tốc độ tăng trưởng của thiết bị thay đổi bằng cách sử dụng sự

UserInputService chỉ là bên client, thuộc tính này chỉ có thể được sử dụng trong một LocalScript .

Mẫu mã

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

Chỉ Đọc
Không Sao Chép
Đọc Song Song

Thuộc tính này mô tả có sẵn gamepad cho thiết bị được sử dụng bởi một người dùng có sẵn không. Nếu gamepad có sẵn, bạn có thể sử dụng UserInputService:GetConnectedGamepads() để lấy một danh sách các gamepad kết nối.

UserInputService chỉ là bên client, thuộc tính này chỉ có thể được sử dụng trong một LocalScript .

Xem thêm:

Mẫu mã

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

Chỉ Đọc
Không Sao Chép
Đọc Song Song

Đặc tính này mô tả apakah thiết bị của người dùng có cảm biến quỹ đạo.

Một bộ vi mạch là một thành phần được tìm thấy trong hầu hết các thiết bị di động để phát hiện hướng và tốc độ quay.

Nếu thiết bị của người dùng có cảm ứng, bạn có thể sử dụng nó trong trò chơi của bạn bằng cách sử dụng hàm UserInputService:GetDeviceRotation() và sự kiện 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

UserInputService chỉ là bên client, thuộc tính này chỉ có thể được sử dụng trong một LocalScript .

Mẫu mã

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

Chỉ Đọc
Không Sao Chép
Đọc Song Song

Đặ性 này mô tả có phải thiết bị của người dùng có bàn phím không. Đặ性 này là true khi thiết bị của người dùng có bàn phím, và false khi nó không.

Nó có thể được sử dụng để xác định có phải người dùng có bàn phím có sẵn - điều này có thể là quan trọng nếu bạn muốn kiểm tra xem bạn có thể sử dụng UserInputService:IsKeyDown() hoặc UserInputService:GetKeysPressed() để kiểm tra bàn phím.

UserInputService chỉ là bên client, thuộc tính này chỉ có thể được sử dụng trong một LocalScript .

Mẫu mã

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

Đọc Song Song

Điều này cài đặt cách mà chuột của người dùng hành xử dựa trên Enum.MouseBehavior Enum. Giá trị mặc định là Enum.MouseBehavior.Default.

Nó có thể được cài đặt với ba giá trị:

  1. Mặc định : Chuột di chuyển tự do xung quanh màn hình người dùng.
  2. Khóa trung tâm : Chuột đã bị khóa và không thể di chuyển từ trung tâm của màn hình người dùng.
  3. KhóaCurrentPosition : Chuột đã bị khóa và không thể di chuyển từ, nó hiện tại vị trí trên màn hình người dùng vào thời điểm khóa.

Giá trị của thuộc tính này không ảnh hưởng đến độ nhạy của sự kiểm tra chuyển động chuột. Ví dụ, GetMouseDelta trả lại cùng một vị trí màn hình Vector2 trong khi bạ

Điều này được thay đổi nếu một GuiButton với Modal được kích hoạt là GuiButton.Visible trừ khi nút chuột phải của người người chơiđang ở dưới.

Lưu ý rằng, nếu chuột đã bị khóa, UserInputService.InputChanged vẫn sẽ kích hoạt khi người chơi di chuyển chuột và sẽ được thông qua trong Delta mà chuột đã cố gắng di chuyển. Ngoài ra, nếu người chơi bị kick khỏi trò chơi, chuột sẽ được khóa một cách

UserInputService chỉ là bên client, thuộc tính này chỉ có thể được sử dụng trong một LocalScript .

Mẫu mã

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

Không Sao Chép
Đọc Song Song

Đặc tính này xác định độ nhạy của người dùng Mouse .

Độ nhạy xác định mức độ mà một chiều chuyển động của chuột vật lý dịch chuyển thành một chiều chuyển động của chuột trong trò chơi. Điều này có thể được sử dụng để điều chỉnh mức độ nhạy của sự kiểm tra chuyển động chuột, như Class.UserInput

Điều này không ảnh hưởng đến chuyển động của biểu tượng chuột. Nor does it affect the Sensitivity of Camera setting found in the Settings tab of the client's Settings menu, which also adjusts the sensitivity of events tracking mouse movement.

Giá trị này có giá trị tối đa là 10 và giá trị tối thiểu là 0. Một giá trị thấp hơn tương ứng với độ nhạy thấp và một giá trị cao hơn tương ứng với độ nhạy cao.

Khi độ nhạy là 0, các sự kiện theo dõi chuyển động của chuột vẫn sẽ bắt lửa nhưng tất cả các biến và thuộc tính cho thấy thay đổi vị trí chuột sẽ trở

Mẫu mã

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

Chỉ Đọc
Không Sao Chép
Đọc Song Song

Đặ性 này mô tả có sẵn chuột cho thiết bị của người dùng không. Đặ性 này là true khi thiết bị của người dùng có chuột có sẵn, và false khi nó không.


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

Điều quan trọng là phải kiểm tra này trước khi sử dụng các chức năng chuột của UserInputService như UserInputService:GetMouseLocation() .

UserInputService chỉ là bên client, thuộc tính này chỉ có thể được sử dụng trong một LocalScript .

Xem thêm:

Mẫu mã

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
Đọc Song Song

Thuộc tính MouseIcon xác định hình ảnh được sử dụng như một mũi tên. Nếu trống, một mũi tên mặc định được sử dụng. Khi cursor hoàn toàn trên các thành phần UI như một

Để ẩn hoàn toàn curse, hãy không dùng hình ảnh trong suốt. Thay vào đó, hãy UserInputService.MouseIconEnabled để sai.

Mẫu mã

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

Đọc Song Song

Điều này xác định liệu biểu tượng Mouse có được hiển thị khi true biểu tượng chuột được hiển thị, khi false nó không.

Ví dụ, các câu code dưới đây ẩn biểu tượngcủa chuột.


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

UserInputService chỉ là bên client, thuộc tính này chỉ có thể được sử dụng trong một LocalScript .

Mẫu mã

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

Chỉ Đọc
Không Sao Chép
Đọc Song Song

Đặt tính này mô tả vị trí của bàn phím trên màn hình trong pixel. Vị trí của bàn phím là Vector2.new(0, 0) khi nó không có thể thấy.

Khi UserInputService chỉ là bên client, thuộc tính này chỉ có thể được sử dụng trong một LocalScript , hoặc một Script với 1> Class.BaseScript.RunContext|RunContext1> được đặt 4> Enum.

Xem thêm OnScreenKeyboardVisibleOnScreenKeyboardSize .

Mẫu mã

UserInputService.OnScreenKeyboardPosition

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

OnScreenKeyboardSize

Chỉ Đọc
Không Sao Chép
Đọc Song Song

Đặ性 này mô tả kích thước của bàn phím trên màn hình bằng pixel. Kích thước của bàn phím là Vector2.new(0, 0) khi nó không có thể nhìn thấy.

Khi UserInputService chỉ là bên client, thuộc tính này chỉ có thể được sử dụng trong một LocalScript , hoặc một Script với 1> Class.BaseScript.RunContext|RunContext1> được đặt 4> Enum.

Xem thêm OnScreenKeyboardVisibleOnScreenKeyboardPosition .

OnScreenKeyboardVisible

Chỉ Đọc
Không Sao Chép
Đọc Song Song

Đặ性 này mô tả liệu bàn phím trên màn hình hiện có đang hiển thị trên màn hình người dùng hay không.

Khi UserInputService chỉ là bên client, thuộc tính này chỉ có thể được sử dụng trong một LocalScript , hoặc một Script với 1> Class.BaseScript.RunContext|RunContext1> được đặt 4> Enum.

Xem thêm OnScreenKeyboardSizeOnScreenKeyboardPosition .

TouchEnabled

Chỉ Đọc
Không Sao Chép
Đọc Song Song

Đặt tính này mô tả apakah màn hình cảm ứng hiện tại của người dùng có sẵn hay không.

Thuộc tính được sử dụng để xác định có phải màn hình cảm ứng của người dùng có màn hình chạm, và do đó nếu sự kiện chạm được kích hoạt. Nếu đúng với điều này, bạn có thể sử dụng các sự kiện của User

Các câu code dưới đây in whether the user's device has a touch screen.


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

Xem thêm:

Mẫu mã

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

Chỉ Đọc
Không Sao Chép
Đọc Song Song

Đặ性 này mô tả ap liệu người dùng có sử dụng thiết bị VR hay không.

Nếu một thiết bị VR được kích hoạt, bạn có thể tương tác với vị trí và chuyển động của nó thông qua các chức năng như UserInputService:GetUserCFrame() . Bạn cũng có thể reagieren với sự di chuyển của thiết bị VR bằng cách sử dụng sự kiện Class.UserInputService.


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

UserInputService chỉ là bên client, thuộc tính này chỉ có thể được sử dụng trong một LocalScript .

Xem thêm:

Mẫu mã

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

Phương Pháp

GamepadSupports

Hàm này trả về whether the given Enum.UserInputType gamepad supports a button corresponding with the given Enum.KeyCode . This function is used to determine valid gamepad inputs.

Để xác định các gamepad Enum.UserInputType được kết nối, hãy sử dụng UserInputService:GetConnectedGamepads() .

UserInputService chỉ là bên client, chức năng này chỉ có thể được sử dụng trong một LocalScript .

Xem thêm:

Tham Số

gamepadNum: Enum.UserInputType

The Enum.UserInputType of the gamepad.

gamepadKeyCode: Enum.KeyCode

The Enum.KeyCode of the button in question.


Lợi Nhuận

Có phải gamepad được cung cấp hỗ trợ một nút tương ứng với Enum.KeyCode được cung cấp?

Mẫu mã

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

Hàm này trả về một loạt các Enum.UserInputType gamepads hiện đang kết nối. Nếu không có gamepads kết nối, hàm này sẽ trống. Ngoài ra, nó chỉ trả về các đối tượng đầu vào gamepads. Ví ví dụ / trường hợp, sự kiện này sẽ trả về một đối tượng gamepad1 kết

Ví dụ, mảnh mã sau đây lấy lại các gamepad kết nối và lưu chúng trong một biến tùy chỉnh tên là connectedGamepads .


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

Để kiểm tra xem có phải kết nối gamepad cụ thể hay không, hãy sử dụng UserInputService:GetGamepadConnected() .

UserInputService chỉ là bên client, chức năng này chỉ có thể được sử dụng trong một LocalScript .

Xem thêm:


Lợi Nhuận

Một dàn đề từ UserInputTypes tương ứng với các thiết bị gamepad kết nối với thiết bị của người dùng.

Mẫu mã

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

Hàm GetDeviceAcceleration xác định tốc độ tăng trưởng hiện tại của thiết bị người dùng. Nó trả lại một InputObject để mô tả tốc độ tăng trưởng hiện tại của thiết bị.

Để điều này hoạt động, thiết bị của người dùng phải có một accelerometer được kích hoạt. Để kiểm tra nếu thiết bị của người dùng có một accelerometer được kích hoạt, bạn có thể kiểm tra thuộc tính UserInputService.AccelerometerEnabled .

Nếu bạn muốn theo dõi khi thiết bị của người dùng thay đổi tốc độ tăng trưởng thì bạn có thể sử dụng sự kiện UserInputService.DeviceAccelerationChanged.

Vì nó chỉ được kích hoạt ở địa phương, nó chỉ có thể được sử dụng trong một LocalScript .


Lợi Nhuận

Mẫu mã

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

Hàm này trả lại một InputObject mô tả mức độ rơi hiện tại của thiết bị.

Vectơ hướng tới trọng lực thế giới thực bằng cách xác định hướng tương đối của thiết bị đối với trọng lực thế giới thực. Ví ví dụ / trường hợp, nếu thiết bị đang hoàn

Hành động này có thể được sử dụng để kích hoạt thiết bị của người dùng để tác động hoặc điều khiển trọng lực trong trò chơi hoặc di chuyển các thể thao trong trò chơi như một quả bóng.

Gravity chỉ được theo dõi cho người chơi sử dụng thiết bị có cảm ứng ngang hàng - chẳng hạn như thiết bị di động.

Để kiểm tra có phải thiết bị của người dùng có một cảm biến quả cầu được kích hoạt không, hãy kiểm tra giá trị của UserInputService.GyroscopeEnabled . Nếu thiết bị có cảm biến quả cầu, bạn cũng có thể sử dụng sự kiện Class.

UserInputService chỉ là bên client, chức năng này chỉ có thể được sử dụng trong một LocalScript .


Lợi Nhuận

Mẫu mã

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

Hàm này trả lại một InputObject và một CFrame mô tả véctor quay hiện tại của thiết bị.

Điều này được kích hoạt bằng một đối tượng đầu vào. Đặc tính Position của đối tượng đầu vào là một Enum.InputType.Gyroscope để theo dõi tổng số sự quay trong mỗi trục đồ thị địa phương.

Độ quay của thiết bị chỉ có thể được theo dõi trên các thiết bị có gyroscope .

Vì chức năng này chỉ được kích hoạt ở địa phương, nó chỉ có thể được sử dụng trong một LocalScript .


Lợi Nhuận

Một tuỳ chỉnh chứa hai thuộc tính:

  1. Thuộc tính Delta mô tả số lượng quay cuối cùng xảy ra
  2. CFrame là sự quay về mặt đất hiện tại của thiết bị so với khung tham chiếu mặc định của nó.

Mẫu mã

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

Hàm này trả lại TextBox mà client hiện đang tập trung vào. Một TextBox có thể được chọn tự động bởi người dùng, hoặc chọn có thể được buộc bằng cách sử dụng chức năng TextBox:CaptureFocus() . Nếu không có TextBox nào được chọn, hàm n

UserInputService chỉ là bên client, chức năng này chỉ có thể được sử dụng trong một LocalScript .

Xem thêm:


Lợi Nhuận

Mẫu mã

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

Hàm này trả về có phải gamepad với các thông số đã được định Enum.UserInputType kết nối với client.

Điều này có thể được sử dụng để kiểm tra xem một gamepad cụ thể, chẳng hạn như 'Gamepad1' đã kết nối với thiết bị của khách hàng.

Để lấy danh sách các gamepad liên kết, hãy sử dụng UserInputService:GetConnectedGamepads() .

UserInputService chỉ là bên client, chức năng này chỉ có thể được sử dụng trong một LocalScript .

Xem thêm:

Tham Số

gamepadNum: Enum.UserInputType

The Enum.UserInputType of the gamepad in question.


Lợi Nhuận

Có phải gamepad được kết nối với Enum.UserInputType không?

Mẫu mã

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

Hàm này trả về một loạt các InputObjects cho tất cả các lựa chọn có sẵn trên gamepad được cho, diễn tả trạng thái cuối cùng của mỗi lựa chọn.

Để tìm UserInputTypes của các gamepad kết nối, hãy sử dụng UserInputService:GetConnectedGamepads() .

Vì chức năng này chỉ được kích hoạt ở địa phương, nó chỉ có thể được sử dụng trong một LocalScript .

Xem thêm:

Tham Số

gamepadNum: Enum.UserInputType

The Enum.UserInputType corresponding with the gamepad in question.


Lợi Nhuận

Một dàn đề từ InputObjects đại diện cho trạng thái hiện tại của tất cả các lựa chọn có sẵn cho gamepad đó.

GetImageForKeyCode

ContentId

Phương thức này nhận Enum.KeyCode yêu cầu và trả lại hình ảnh được liên kết cho thiết bị gamepad hiện đang kết nối (chỉ cho Xbox, PlayStation và Windows). Điều này có nghĩa là nếu thiết bị kết n

Tham Số

keyCode: Enum.KeyCode

The Enum.KeyCode for which to fetch the attached image.


Lợi Nhuận

ContentId

ID hình ảnh đã trả lại.

Mẫu mã

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

Hàm này trả về một loạt các InputObjects được liên kết với các nút đang được nhấn.

Ma trận này có thể được lặp lại để xác định các phím đang được nhấn, bằng cách sử dụng giá trị InputObject.KeyCode.

Để kiểm tra có phải nhấn một phím cụ thể hay không, hãy sử dụng UserInputService:IsKeyDown() .

UserInputService chỉ là bên client, chức năng này chỉ có thể được sử dụng trong một LocalScript .


Lợi Nhuận

Một dàn đề tùy chỉnh InputObjects được liên kết với các phím đang được nhấn.

Mẫu mã

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

Hàm này trả về 'Amount.UserInputType' liên quan đến cuộc gọi gần đây nhất của người dùng.

Ví dụ, nếu đã có người nhấn vào ô dấu của người dùng trước đó, Enum.UserInputType đã trở lại sẽ là 'Keyboard' .

Sự kiện UserInputService.LastInputTypeChanged có thể được sử dụng để theo dõi khi Enum.UserInputType cuối cùng đã được sử dụng bởi người dùng thay đổi.

UserInputService chỉ là bên client, chức năng này chỉ có thể được sử dụng trong một LocalScript .


Lợi Nhuận

The Enum.UserInputType associates with the user's most recent input.

Mẫu mã

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

Hàm này trả về một dàn InputObjects tương ứng với các nút chuột hiện đang bị nhấn xuống.

Các nút chuột được theo dõi bởi chức năng này bao gồm:


<tr>
<td>Nút chuột1</td>
<td>Nút chuột trái.</td>
</tr>
<tr>
<td>Nút chuột 2</td>
<td>Nút chuột phải.</td>
</tr>
<tr>
<td>nút chuột3</td>
<td>Nút chuột giữa.</td>
</tr>
TênMô tả

Nếu người dùng không đang nhấn bất kỳ nút chuột nào khi chức năng được gọi, nó sẽ trả lại một danh sách rỗ trống.

UserInputService chỉ là bên client, chức năng này chỉ có thể được sử dụng trong một LocalScript .


Lợi Nhuận

Một dàn bộ InputObjects tương ứng với các nút chuột hiện đang bị giữ.

Mẫu mã

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

Hàm này trả lại sự thay đổi, ở pixel, của vị trí của người chơi's Mouse trong khung hình được hiển thị cuối cùng như một Vector2 . Hàm này chỉ hoạt động nếu

Độ nhạy của chuột, được xác định trong cài đặt của khách hàng và UserInputService.MouseDeltaSensitivity, sẽ ảnh hưởng đến kết quả.

UserInputService chỉ là bên client, chức năng này chỉ có thể được sử dụng trong một LocalScript .


Lợi Nhuận

Thay đổi trong chuyển động của chuột.

Mẫu mã

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

Hàm này trả về một Vector2 đại diện vị trí màn hình hiện tại của người chơi Mouse trong pixel so với góc trên cùng bên trái. Điều này không đếm vào khoảng cách GUI trong đầu vào.

Nếu điểm chuột của máy chủ đang nằm ngoài màn hình hoặc thiết bị của người chơi không có chuột, giá trị đã được quy định sẽ bị xóa sổ.

UserInputService chỉ là bên client, chức năng này chỉ có thể được sử dụng trong một LocalScript .


Lợi Nhuận

Một Vector2 đại diện vị trí màn hình hiện tại của chuột, trong pixel.

Mẫu mã

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

Hàm này trả về một loạt các gamepad UserInputTypes đã kết nối và bật cho GUI navigation. This list is in descending order of priority, meaning it can be iterated over to determine which gamepad should have navigation control.

Whether a connected gamepad is a navigation gamepad only determines which gamepad(s) control the navigation GUIs. This does not affect navigation điều khiển.

UserInputService chỉ là bên client, chức năng này chỉ có thể được sử dụng trong một LocalScript .

Xem thêm:


Lợi Nhuận

Một dàn bộ UserInputTypes có thể được sử dụng cho điều hướng GUI, theo thứ tự ưu tiên.

GetStringForKeyCode

GetStringForKeyCode trả về một chuỗi đại diện cho một chìa khóa mà người dùng nên nhấn để nhập một Enum.KeyCode đã được cấu hình, giữa các phím trên bàn phím của họ. Đối với các mã khóa yêu cầu một modifier để đư

Khi sử dụng Roblox với bố trí bàn phím không QWERTY, các mã khóa được map đế


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

Ví dụ về QWERTY Keyboard


<tbody>
<tr>
<td><code>Enum.KeyCode.Q</code></td>
<td><code>Q.</code></td>
</tr>
<tr>
<td><code>Enum.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> vì <code>@</code> được viết bằng <kbd>Shift</kbd><kbd>2</kbd></td>
</tr>
</tbody>
Mã nguồnTrả Giá Trị

Ví dụ trên AZERTY Keyboard


<tbody>
<tr>
<td><code>Enum.KeyCode.Q</code></td>
<td><code>A</code></td>
</tr>
<tr>
<td><code>Enum.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>
Mã nguồnTrả Giá Trị

Sử dụng Gamepad

GetStringForKeyCode() trả lại mã map chuỗi cho Enum.KeyCode cho gamepad đã kết nối mới nhất. Nếu điều khiển kết nối không được hỗ trợ, hàm trả lại mã chuỗi mặc định cho yêu cầu mã khóa yêu cầu.

ví dụ dưới đây cho bạn thấy cách bạn có thể map tùy chỉnh assets for 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

Bản điều khiển trò chơi

Các mã chìa khóa của bàn hướng không có sự khác biệt nào dựa trên thiết bị. Enum.KeyCode.ButtonSelect có một hành vi khác nhau nhỏ trong một số trường hợp. Sử dụng cả hai mảng PlayStation để đảm bảo người dùng thấy các nút đúng.


<tbody>
<tr>
<td><code>Enum.KeyCode.ButtonA</code></td>
<td><code>ButtonCross</code></td>
<td><code>ButtonA.</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.ButtonB</code></td>
<td><code>Vòng tròn nút</code></td>
<td><code>ButtonB.</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.ButtonX</code></td>
<td><code>ButtonSquare</code></td>
<td><code>ButtonX</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.ButtonY.</code></td>
<td><code>ButtonTriangle</code></td>
<td><code>ButtonY.</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.ButtonL1</code></td>
<td><code>ButtonL1</code></td>
<td><code>ButtonLB</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.ButtonL2</code></td>
<td><code>ButtonL2</code></td>
<td><code>ButtonLT</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.ButtonL3</code></td>
<td><code>ButtonL3</code></td>
<td><code>ButtonLS</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.ButtonR1</code></td>
<td><code>ButtonR1</code></td>
<td><code>ButtonRB</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.ButtonR2</code></td>
<td><code>ButtonR2</code></td>
<td><code>ButtonRT.</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.ButtonR3</code></td>
<td><code>ButtonR3</code></td>
<td><code>ButtonRS</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.ButtonStart.</code></td>
<td><code>Cài đặt nút</code></td>
<td><code>Khu bắt đầu nút</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.ButtonSelect</code></td>
<td><code>ButtonTouchpad</code> và <code>ButtonShare</code></td>
<td><code>ButtonSelect</code></td>
</tr>
</tbody>
Mã nguồnGiá trị trả lại PlayStationGiá trị trả lại Xbox

Hình ảnh hệ thống cho KeyCodes

Khi sử dụng một Enum.KeyCode có thể được biểu diễn tốt hơn như một hình ảnh, chẳng hạn như cho một ImageLabel ở một UI người dùng, bạn có thể sử dụng các biểu tượ


<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>Enum.KeyCode.ButtonA</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>Enum.KeyCode.ButtonB</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>PadLeft.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>PadRight của Code열</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>Pad mã thông báo hệ thống</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>PadDown Của Code Hóa.</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>ENSEMBLE.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>ENSEMBLE.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>ENSEMBLE.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>Tab键Code.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>ENSEMBLE.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>ENSEMBLE.KEYCODE.PERIOD</code></td>
<td>
<img src="../../../assets/scripting/controls/period.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/期间.png</code></td>
</tr>
<tr>
<td><code>Danh sách.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>
Mã nguồnHình ảnhID Tài Sản

Tham Số

keyCode: Enum.KeyCode

Lợi Nhuận

GetSupportedGamepadKeyCodes

Hàm này trả về một loạt các KeyCodes mà gamepad được kết nối với các hỗ trợ Enum.UserInputType được cho phép.

Hàm này có thể được sử dụng để xác định các KeyCodes được hỗ trợ và không hỗ trợ bởi một gamepad kết nối. Để xác định nếu một KeyCodes cụ thể được hỗ trợ, hãy sử dụng UserInputService:GamepadSupports() .

Nếu gọi trên một gamepad không tồn tại hoặc không kết nối, hàm này sẽ trả lại một danh sách trống.

UserInputService chỉ là bên client, chức năng này chỉ có thể được sử dụng trong một LocalScript .

Xem thêm:

Tham Số

gamepadNum: Enum.UserInputType

The Enum.UserInputType of the gamepad.


Lợi Nhuận

Một mat阵 của KeyCodes được hỗ trợ bởi gamepad đã được cung cấp.

Mẫu mã

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

Hành funzione này kiểm tra xem một nút cụ thể đã được nhấn trên một gamepad cụ thể. Nó trả lại true nếu gamepadbutton đã được nhấn, nếu không nó trả lại false.

Các loại dữ liệu người dùng hợp lệ

Gamepad được chỉ định nên là một trong những giá trị trong danh sách thuộc tính UserInputType sau đây:


<tr>
<td>枚</td>
</tr>
Tên

Mã KeyCodes hợp lệ

Nút đó nên là một trong những giá trị KeyCodes được liệt kê dưới đây:


<tr>
<td>ButtonX</td>
</tr>
<tr>
<td>Button.KeyCode.X</td>
</tr>
<tr>
<td>enum.KeyCode.ButtonA</td>
</tr>
<tr>
<td>枚</td>
</tr>
<tr>
<td>Enum.KeyCode.ButtonR1</td>
</tr>
<tr>
<td>Enum.KeyCode.ButtonL1</td>
</tr>
<tr>
<td>Enum.KeyCode.ButtonR2</td>
</tr>
<tr>
<td>Enum.KeyCode.ButtonL2</td>
</tr>
<tr>
<td>Enum.KeyCode.ButtonR3</td>
</tr>
<tr>
<td>Enum.KeyCode.ButtonL3</td>
</tr>
<tr>
<td>按鈕開始</td>
</tr>
<tr>
<td>Enum.KeyCode.ButtonChọn</td>
</tr>
<tr>
<td>PadTrái.KeyCode.DPadLeft</td>
</tr>
<tr>
<td>PadRight</td>
</tr>
<tr>
<td>Pad mã.</td>
</tr>
<tr>
<td>PadDown Của KeyCode</td>
</tr>
Tên

Điều này có thể được sử dụng để kiểm tra có phải nút cụ thể, chẳng hạn như A, đang bị giữ. Ví dụ:


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

UserInputService chỉ là bên client, chức năng này chỉ có thể được sử dụng trong một LocalScript .

Xem thêm:

Tham Số

gamepadNum: Enum.UserInputType

The Enum.UserInputType of the given gamepad.

gamepadKeyCode: Enum.KeyCode

The Enum.KeyCode of the specified button.


Lợi Nhuận

Whether the specified gamepad button on the given gamepad is pressed.

Mẫu mã

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

Hàm này trả về có phải người dùng đang giữ nút liên quan đến Enum.KeyCode đã được cung cấp không. Nó trả về true nếu nút đó được nhấn hoặc false nếu nó không được nhấn.

Điều này có thể được sử dụng để kiểm tra xem một chìa khóa cụ thể, chẳng hạn như dấu câu trống, đang được nhấn. Ví dụ:


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

Để lấy danh sách tất cả các nút đã được nhấn bởi người dùng, hãy sử dụng chức năng UserInputService:GetKeysPressed().

UserInputService chỉ là bên client, chức năng này chỉ có thể được sử dụng trong một LocalScript .

Xem thêm:

Tham Số

keyCode: Enum.KeyCode

The Enum.KeyCode of the chìa khóa.


Lợi Nhuận

Có phải chìa khóa đó đang bị giữ.

Mẫu mã

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

Hàm này nhận một nút chuột Enum.UserInputType và trả lại một hệ số để cho biết có phải bị nhấn hiện tại hay không.

Nút chuột kiểm tra phụ thuộc vào giá trị Enum.UserInputType được truyền cho chức năng như một đại diện. Ví dụ:


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

UserInputService chỉ là bên client, chức năng này chỉ có thể được sử dụng trong một LocalScript ".

Tham Số

mouseButton: Enum.UserInputType

The Enum.UserInputType of the mouse button.


Lợi Nhuận

Có phải nút chuột đã được giữ không.

Mẫu mã

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

Hàm này trả lại true nếu gamepad được cho phép điều khiển Navigation và Selection Enum.UserInputType .

Nếu bạn muốn thiết lập một gamepad điều hướng, bạn có thể sử dụng UserInputService:SetNavigationGamepad() . Bạn cũng có thể sử dụng UserInputService:GetNavigationGamepads() để lấy một danh sách của tất cả các gamepad.

Ví dụ, mã dưới đây kiểm tra xem gamepad1 có phải là gamepad điều hướng không:


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

Một danh sách các gamepad kết nối, независимо от việc lưu hướng, có thể được lấy lại bằng cách sử dụng`UserInput/GetConnectedGamepads.

UserInputService chỉ là bên client, chức năng này chỉ có thể được sử dụng trong một LocalScript .

Xem thêm:

Tham Số

gamepadEnum: Enum.UserInputType

The Enum.UserInputType of the specified gamepad.


Lợi Nhuận

Whether the specified gamepad is a gamepad hướng dẫn.

RecenterUserHeadCFrame

void

Hành động này tập trung vào CFrame của VR headset lên mối quan hệ hiện tại của headset đang được mặc bởi người dùng. Điều này có nghĩa là mối quan hệ hiện tại của tai ngheđược đặt thành Datatype.CFrame.new().

Sử dụng chức năng này để di chuyển CFrame đến trung tâm của khu vực chơi nếu nó có vẻ như đang ở một khoảng cách lạ.

Điều này hoạt động tương tự như chức năng VRService , VRService:RecenterUserHeadCFrame() .

UserInputService chỉ là bên client, chức năng này chỉ có thể được sử dụng trong một LocalScript .


Lợi Nhuận

void

Mẫu mã

UserInputService:RecenterUserHeadCFrame

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

SetNavigationGamepad

void

Hàm SetNavigationGamepad đặt liệu có thể di chuyển navigator GUI. Một gamepad mà cho phép di chuyển navigator GUI là một gamepad Enum.UserInputType .

Nếu đã bật một lập luận là true, Gamepad có thể di chuyển navigator GUI. Nếu lập luận là false, Gamepad không thể di chuyển navigator GUI.

Nếu bạn muốn kiểm tra xem Gamepad được đặt là một gamepad điều hướng, bạn có thể sử dụng chức năng UserInputService:IsNavigationGamepad() . Bạn cũng có thể sử dụng chức năng UserInputService:GetNavigationGamepads() để lấy một danh sách các gamepad dẫn đường.

UserInputService chỉ là bên client, chức năng này chỉ có thể được sử dụng trong một LocalScript .

Xem thêm:

Tham Số

gamepadEnum: Enum.UserInputType

The Enum.UserInputType of the specified gamepad.

enabled: bool

Có phải gamepad được chỉ định có thể di chuyển navigator GUI.


Lợi Nhuận

void

Mẫu mã

UserInputService:SetNavigationGamepad

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

Sự Kiện

DeviceAccelerationChanged

Sự kiện TheDeviceAccelerationChanged bắt lửa khi một người di chuyển một thiết bị có cảm biến tốc độ.

Một accelerometer là một thành phần được tìm thấy trên hầu hết các thiết bị di động đo tốc độ (thay đổi trong tốc độ).

Để xác định có phải thiết bị của người dùng có một cảm biến tốc độ không, xem UserInputService.AccelerometerEnabled .

Sự kiện này có thể được sử dụng để theo dõi chuyển động của một thiết bị có cảm biến tốc độ. Một ví dụ sử dụng bao gồm di chuyển nhân vật người chơi khi một thiết bị di động tốc độ.

Ngoài ra, sự kiện này có thể được sử dụng cùng với UserInputService:GetDeviceAcceleration() để xác định chuyển động hiện tại của thiết bị nếu thiết bị có thiết bị cảm biến.

Sự kiện này chỉ kích hoạt địa phương - có nghĩa là chỉ người chơi cuộn dây di chuyển mới có thể sử dụng sự kiện và nó chỉ hoạt động trong một LocalScript .

Tham Số

acceleration: InputObject

Một InputObject, với một UserInputType của 'Accelerometer' và một 1> Class.InputObject.Position|Position1> hiển thị sức mạnh của trọng lực trên mỗi trục trục lực địa phương.


Mẫu mã

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

Sự kiện UserInputService.DeviceGravityChanged xảy ra khi trọng lực thiết bị Vector3 thay đổi trên một thiết bị có thiết bị hạ gục.

Vectơ trọng lực của một thiết bị diễn tả sức trọng trên mỗi trục X, Y và Z của thiết bị. Khi trọng lực không bao giờ thay đổi, sức trọng nó áp dụng trên mỗi trục thay đổi khi thiết bị quay và thay đổi hướng. Giá trị trọng lực được áp dụng trên mỗi trục

Một accelerometer là một thành phần được tìm thấy trên hầu hết các thiết bị di động đo tốc độ (thay đổi trong tốc độ).

Sự kiện này có thể được sử dụng để xác định hướng thế giới thực của lực hút bụi trên thiết bị của người dùng. Điều này thậm chí có thể được sử dụng để simulat hướng thế giới thực của lực hút bụi trên thiết bị của người dùng trong trò chơi, chẳng hạn như trên các

Để kiểm tra có phải người dùng đang sử dụng thiết bị có cảm ứng tốc độ kích thước thực hiện không, xem UserInputService.AccelerometerEnabled . Nếu thiết bị có cảm ứng tốc độ kích thước, bạn có thể sử dụng chức năng Class.UserInputService:GetDeviceGravity()</

Tham Số

gravity: InputObject

Một InputObject, với một InputObject.Position đặt tính cho thấy sức hút trên mỗi trục thiết bị địa phương. Vị trí này có thể được sử dụng như một hướng để xác định hướng của hướng tương đối đối với thiết bị.


Mẫu mã

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

Sự kiện DeviceRotationChanged bắt đầu khi một người quay một thiết bị có cảm biến hồi chuyển.

Một bộ vi mạch là một thành phần được tìm thấy trong hầu hết các thiết bị di động để phát hiện hướng và tốc độ quay.

Sự kiện hữu ích khi theo dõi hướng của thiết bị và cách thay đổi khi người dùng quay thiết bị của họ. Để xác định hướng của thiết bị hiện tại, bạn có thể sử dụng chức năng UserInputService:GetDeviceRotation().

Để kiểm tra có phải thiết bị của người dùng có một cảm biến quả cầu được kích hoạt, và sự kiện này sẽ bắt lửa, xem UserInputService.GyroscopeEnabled .

Sự kiện này chỉ bắt đầu khi cửa sổ client Roblox đang tập trung. Ví dụ, các lựa chọn sẽ không được bắt đầu khi cửa sổ được tối ưu hóa.

Tham Số

rotation: InputObject

Một InputObject cung cấp thông tin về sự quay của thiết bị. InputObject.Position đại diện cho sự quay mới của một Vector3 positional giá trị và 1> Class.InputObj.Delta1> đạ

cframe: CFrame

Một CFrame đại diện cho hướng hiện tại của thiết bị.


Mẫu mã

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

Sự kiện GamepadConnected bắt đầu khi một gamepad được kết nối với client.

Vì một trò chơi Roblox hỗ trợ nhiều người điều khiển, sự kiện này hữu ích khi kết hợp với sự kiện UserInputService.GamepadDisconnected để theo dõi các người điều khiển/gamepad đang hoạt động. Bạn cũng có thể sử dụng Class.UserInputService

Ví dụ sau đây cho thấy một ví dụ sử dụng của một trình theo dõi khi một gamepad được kết nối với máy chủ.


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

Nếu bạn muốn xem các thiết bị đang kết nối, bạn có thể sử dụng chức năng UserInputService:GetConnectedGamepads() .

Vì sự kiện này chỉ được kích hoạt ở địa phương, nó chỉ có thể được sử dụng trong một LocalScript .

Xem thêm:

Tham Số

gamepadNum: Enum.UserInputType

The Enum.UserInputType of the connected gamepad.


GamepadDisconnected

Sự kiện GamepadDisconnected bắt đầu khi một gamepad được kết nối lại.

Vì một trò chơi Roblox hỗ trợ nhiều người điều khiển, sự kiện này hữu ích khi kết hợp với sự kiện UserInputService.GamepadConnected để theo dõi các người điều khiển/gamepad đang hoạt động. Bạn cũng có thể sử dụng Class.UserInputService

Ví dụ sau đây cho thấy một ví dụ sử dụng của một trình theo dõi khi một gamepad được kết nối từ máy chủ.


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

Vì sự kiện này chỉ được kích hoạt ở địa phương, nó chỉ có thể được sử dụng trong một LocalScript .

Xem thêm:

Tham Số

gamepadNum: Enum.UserInputType

The Enum.UserInputType of the disconnected gamepad.


InputBegan

Sự kiện InputBegan bắt đầu khi một người bắt đầu tương tác thông qua một thiết bị Human-Computer Interface (chuột, nút chạm, nút bàn phím, v.v.);

Nó có thể được sử dụng để theo dõi sự bắt đầu của sự tương tác người dùng, chẳng hạn như khi một người dùng đầu tiên tương tác với một thành phần GUI, một gamepad, v.v. Nó không bắt chuyển động của bánh xe chuột.

Sự kiện này có thể được sử dụng cùng với UserInputService.InputChangedUserInputService.InputEnded để theo dõi khi người dùng nhập, thay đổi và kết thúc.

Sự kiện này chỉ bắt đầu khi cửa sổ client Roblox đang tập trung. Ví dụ, các lựa chọn sẽ không được bắt đầu khi cửa sổ được tối ưu hóa.

Vì sự kiện này chỉ được kích hoạt ở địa phương, nó chỉ có thể được sử dụng trong một LocalScript .

Tham Số

Một InputObject ví dụ / trường hợp, chứa thông tin về nhập của người dùng.

gameProcessedEvent: bool

Chỉ ra có phải game engine nội tại quan sát vào nhập này và hành động vào nó. Thông thường điều này tham khảo vào quá trình xử lý UI, vì vậy nếu một nút được chạm hoặc nhấp từ nhập này, gameProcessedEvent sẽ là true .


Mẫu mã

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

Sự kiện ChangeInput được kích hoạt khi một người thay đổi cách họ tương tác qua một thiết bị Human-Computer Interface ( nút chuột xuống, màn hình bắt đầu, nút bàn phím xuống, v.v.v).

Để lignp qua các sự kiện được xử lý tự động bởi Roblox, như cuộn dịch trong một ScrollingFrame, kiểm tra gameProcessedEvent argument là sai. Điều này có thể được sử dụng cùng với Class.UserInput

Sự kiện này chỉ bắt đầu khi cửa sổ client Roblox đang tập trung. Ví dụ, các lựa chọn sẽ không được bắt đầu khi cửa sổ được tối ưu hóa.

Vì sự kiện này chỉ được kích hoạt ở địa phương, nó chỉ có thể được sử dụng trong một LocalScript .

Tham Số

Một InputObject ví dụ / trường hợp, chứa thông tin về nhập của người dùng.

gameProcessedEvent: bool

Chỉ ra có phải game engine nội tại quan sát vào nhập này và hành động vào nó. Thông thường điều này tham khảo vào quá trình xử lý UI, vì vậy nếu một nút được chạm hoặc nhấp từ nhập này, gameProcessedEvent sẽ là true .


Mẫu mã

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

Sự kiện Kết thúc đầu vào xảy ra khi một người người dùng dừng tương tác thông qua các thiết bị trên của hệ thống máy chủ ( nút chuột, chạm bắt đầu, nhấn bàn phím, v.v. ) . Điều này hữu ích khi theo dõi khi một người phát hành một nút trên của hệ thống máy chủ ( nút chuộ

Sự kiện này có thể được sử dụng cùng với UserInputService.InputBeganUserInputService.InputChanged để theo dõi khi người dùng nhập, thay đổi và kết thúc.

Sự kiện này chỉ bắt đầu khi cửa sổ client Roblox đang tập trung. Ví dụ, các lựa chọn sẽ không được bắt đầu khi cửa sổ được tối ưu hóa.

Vì sự kiện này chỉ được kích hoạt ở địa phương, nó chỉ có thể được sử dụng trong một LocalScript .

Tham Số

Một InputObject ví dụ / trường hợp, which contains information about the user input.

gameProcessedEvent: bool

Chỉ ra có phải game engine nội tại quan sát vào nhập này và hành động vào nó. Thông thường điều này tham khảo vào quá trình xử lý UI, vì vậy nếu một nút được chạm hoặc nhấp từ nhập này, gameProcessedEvent sẽ là true .


Mẫu mã

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

Sự kiện UserInputService JumpRequest được kích hoạt khi có yêu cầu nhảy từ khách hàng, ví dụ như khi khách hàng nhấn vào nút nhảy hoặc nút nhảy trên thiết bị di động.

Sự kiện này bắt đầu khi người dùng thử làm cho nhân vật của họ Player.Character nhảy. Hành vi mặc định đáp lại một yêu cầu nhảy bằng cách thiết lập giá trị Humanoid.Jump của người người chơiđể làm cho nhân vật của người người chơinhả

Sự kiện này có thể được sử dụng để theo dõi mỗi lần một người chơi muốn nhảy. Thay vì sử dụng nó để làm cho một người chơi nhảy, nó nên được sử dụng để thay đổi hành vi nhảy mặc định - chẳng hạn như vô hiệu hóa nhảy.

Ví dụ, mã dưới đây in "Jump" mỗi khi người chơi gửi một yêu cầu nhảy.


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

Vì sự kiện này phát nhiều lần cho một yêu cầu nhảy một lần, debounce được đề xuất.

Nếu bạn muốn kết nối các nút hoặc chìa khóa khác với các hành động khác, hãy xem xét sử dụng các sự kiện như UserInputService:GetKeysPressed()UserInputService.InputBegan hoặc ContextActionService .

Vì sự kiện này chỉ được kích hoạt ở địa phương, nó chỉ có thể được sử dụng trong một LocalScript .


Mẫu mã

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

Sự kiện UserInputService.LastInputTypeChanged xảy ra khi client thay đổi cách họ tương tác qua một thiết bị HMI. ( ví dụ, từ MouseMovement đến MouseWheel hoặc từ Thumbstick1 đến Thumbstick2).

Để nhận giá trị của loại nhập cuối cùng, bất kể nó đã thay đổi, bạn có thể sử dụng chức năng UserInputService:GetLastInputType() .

Vì sự kiện này chỉ được kích hoạt ở địa phương, nó chỉ có thể được sử dụng trong một LocalScript .

Tham Số

lastInputType: Enum.UserInputType

Một Enum.UserInputType để biểu thị đánh máycuối cùng của nó.


Mẫu mã

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

Hành động điều khiển bắt đầu khi người dùng thực hiện một hành động điều khiển cụ thể. Ví dụ, cuộn chuột chuột.

Tham Số

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

TextBoxFocusReleased

Sự kiện TextBoxFocusRelease khi một khách hàng mất tập trung vào một TextBox - thường là khi một khách hàng dừng nhập nội dung vào TextBox bằng cách nhấn lại hoặc nhấp vào một vị trí khác trên màn hình.

Ví dụ, mã dưới đây in tên của TextBox bị mất tập trung khi sự kiện bắt đầu.


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

Nó có thể được sử dụng cùng với UserInputService.TextBoxFocused để theo dõi khi một TextBox thắng và mất tập trung.

Vì sự kiện này chỉ được kích hoạt ở địa phương, nó chỉ có thể được sử dụng trong một LocalScript .

Xem thêm:

Tham Số

textboxReleased: TextBox

Các TextBox đã mất tập trung.


Mẫu mã

TextBoxFocusReleased

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

TextBoxFocused

Sự kiện TextBoxFocused bắt đầu khi một người nhấp vào một TextBox - thường khi một client nhấp vào một hộp văn bản để bắt đầu nhập văn bản. Điều này cũng bắt đầu khi một hộp văn bản tập trung sử dụng TextBox:CaptureFocus() .

Ví dụ, mã dưới đây in tên TextBox tập trung khi sự kiện bắt đầu.


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

Nó có thể được sử dụng cùng với UserInputService.FocusReleased để theo dõi khi một hộp chữ nhận và mất tập trung.

Vì sự kiện này chỉ được kích hoạt ở địa phương, nó chỉ có thể được sử dụng trong một LocalScript .

Xem thêm:

Tham Số

textboxFocused: TextBox

Các TextBox đã nhận được sự tập trung.


Mẫu mã

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

Sự kiện TouchEnded bắt đầu khi một người thả ngón tay của họ khỏi màn hình của một thiết bị TouchEnabled, kết thúc dòng chạy của dòng chạy của thiết bị bằng cách thiết bị.

Sự kiện này có thể được sử dụng để xác định khi một người dừng chạm vào màn hình của thiết bị của họ. Nó có thể được kết hợp với UserInputService.TouchStarted để xác định khi một người bắt đầu và dừng chạm vào màn hình.

Ví dụ, mã dưới đây in vị trí màn hình mà người dùng dừng chạm vào.


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

Ở đây, touch input object là cùng một đối tượng nhập màn hình cảm ứng trong suốt cuộc sống của touch. Vì vậy, so sánh InputObjects khi họ là đối tượng touch là hợp lệ để xác định nếu đó là ngón tay cùng.

Để kiểm tra có phải thiết bị của người dùng đã bật Cảm ứng không, và sự kiện cảm ứng sẽ được tác thành, xem UserInputService.TouchEnabled .

Sự kiện này chỉ bắt đầu khi cửa sổ client Roblox đang tập trung. Ví dụ, các lựa chọn sẽ không được bắt đầu khi cửa sổ được tối ưu hóa.

Vì sự kiện này chỉ được kích hoạt ở địa phương, nó chỉ có thể được sử dụng trong một LocalScript .

Xem thêm:

Tham Số

Một InputObject ví dụ / trường hợp, chứa thông tin về nhập của người dùng.

gameProcessedEvent: bool

Chỉ ra có phải game engine nội tại quan sát vào nhập này và hành động vào nó. Thông thường điều này tham khảo vào quá trình xử lý UI, vì vậy nếu một nút được chạm hoặc nhấp từ nhập này, gameProcessedEvent sẽ là true .


Mẫu mã

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

Bắt đầu khi một người giữ ít nhất một ngón tay trên một vị trí màn hình của một thiết bị TouchEnabled.

Sự kiện này có thể được sử dụng để xác định khi một người giữ ngón tay của họ dưới một trong những thành phần trong trò chơi GUI hoặc yếu tố.

Ví dụ bên dưới in state của long press khi người dùng giữ ít nhất một ngón tay trong một khoảng thời gian ngắn trên cùng một vị trí màn hình. Các trạng thái có thể bao gồm: Bắt đầu ,


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)

Để kiểm tra có phải thiết bị của người dùng đã bật Cảm ứng không, và sự kiện cảm ứng sẽ được tác thành, xem UserInputService.TouchEnabled .

Nó có thể được kết hợp với UserInputService.TouchStartedUserInputService.TouchEnded để xác định khi mà một người bắt đầu và kết thúc chạm vào màn hình.

Sự kiện này chỉ bắt đầu khi cửa sổ client Roblox đang tập trung. Ví dụ, các lựa chọn sẽ không được bắt đầu khi cửa sổ được tối ưu hóa.

Vì sự kiện này chỉ được kích hoạt ở địa phương, nó chỉ có thể được sử dụng trong một LocalScript .

Xem thêm:

Tham Số

touchPositions: Array

Một dàn Vector2 đối tượng, chỉ thị vị trí của ngón tay liên quan đến chuyển động.

The Enum.UserInputState of the gesture.

gameProcessedEvent: bool

Chỉ ra có phải game engine nội tại quan sát vào nhập này và hành động vào nó. Thông thường điều này tham khảo vào quá trình xử lý UI, vì vậy nếu một nút được chạm hoặc nhấp từ nhập này, gameProcessedEvent sẽ là true .


Mẫu mã

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

Sự kiện TouchMoved bắt đầu khi một người di chuyển ngón tay của họ trên một thiết bị TouchEnabled.

Sự kiện này có thể được sử dụng để xác định khi một người di chuyển ngón tay của họ trên màn hình của một thiết bị TouchEnabled. Nó có thể hữu ích để theo dõi có người di chuyển ngón tay của họ trên màn hình, cũng như nơi người di chuyển ngón tay của họ.

Mã dưới đây in "Touch moved from" vị trí Vector2 trước "đến" vị trí Vector2 mới của người dùng trên một thiết bị TouchEnabled.


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)

Nó có thể được kết hợp với UserInputService.TouchStartedUserInputService.TouchEnded để xác định khi mà một người bắt đầu chạm vào màn hình, bằng cách di chuyển ngón tay của họ khi chạm vào màn hình và khi họ dừng chạm vào màn hình.

Để kiểm tra có phải thiết bị của người dùng đã bật Cảm ứng không, và sự kiện cảm ứng sẽ được tác thành, xem UserInputService.TouchEnabled .

Sự kiện này chỉ bắt đầu khi cửa sổ client Roblox đang tập trung. Ví dụ, các lựa chọn sẽ không được bắt đầu khi cửa sổ được tối ưu hóa.

Vì sự kiện này chỉ được kích hoạt ở địa phương, nó chỉ có thể được sử dụng trong một LocalScript .

Xem thêm:

Tham Số

Một InputObject ví dụ / trường hợp, chứa thông tin về nhập của người dùng.

gameProcessedEvent: bool

Chỉ ra có phải game engine nội tại quan sát vào nhập này và hành động vào nó. Thông thường điều này tham khảo vào quá trình xử lý UI, vì vậy nếu một nút được chạm hoặc nhấp từ nhập này, gameProcessedEvent sẽ là true .


Mẫu mã

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

Sự kiện TouchPan bắt đầu khi một người dùng kéo ít nhất một ngón tay vào một thiết bị TouchEnabled .

Sự kiện này có thể được sử dụng để xác định khi một người dịch ngón tay của họ trên màn hình của một thiết bị TouchEnabled - chẳng hạn như để quay Camera trong một tập lệnh máy chủ tùy chỉnh.

Các câu chuyện dưới đây in "Tốc độ di chuyển" đi kèm với tốc độ của người dùng khi người dùng kéo ngón tay của họ lên màn hình.


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

Xem một số chức năng hữu ích khác của UserInputService ở đây UserInputService.TouchRotate .

Sự kiện này chỉ bắt đầu khi cửa sổ client Roblox đang tập trung. Ví dụ, các lựa chọn sẽ không được bắt đầu khi cửa sổ được tối ưu hóa.

Vì sự kiện này chỉ được kích hoạt ở địa phương, nó chỉ có thể được sử dụng trong một LocalScript .

Xem thêm:

Tham Số

touchPositions: Array

Một dàn đối tượng Vector2 , cho thị trường của các ngón tay (ví dụ như ngón tay) có liên quan đến cử chỉ.

totalTranslation: Vector2

Kích thước của cử chỉ ngón tay từ đầu đến cuối (in pixel).

velocity: Vector2

Tốc độ của ngón tay vào màn hình (in pixels) mỗi giây.

The Enum.UserInputState of the gesture.

gameProcessedEvent: bool

Chỉ ra có phải game engine nội tại quan sát vào nhập này và hành động vào nó. Thông thường điều này tham khảo vào quá trình xử lý UI, vì vậy nếu một nút được chạm hoặc nhấp từ nhập này, gameProcessedEvent sẽ là true .


Mẫu mã

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

Được kích hoạt khi một người đặt và di chuyển hai ngón tay trên màn hình của thiết bị TouchEnabled .

Ví ví dụ / trường hợp, các câu chuyện dưới đây in ra bao nhiêu kích thước thu nhỏ của máy ảnh kể từ khi bắt đầu của 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)

Để kiểm tra có phải thiết bị của người dùng đã bật Cảm ứng không, và sự kiện cảm ứng sẽ được tác thành, xem UserInputService.TouchEnabled .

Sự kiện này chỉ bắt đầu khi cửa sổ client Roblox đang trong tập trung. Ví dụ, các lựa chọn sẽ không được bắt khi cửa sổ được tối ưu hóa. Tương tự như vậy, sự kiện này chỉ bắt đầu ở nơi địa phương, chỉ có thể được sử dụng trong một LocalScript .

Xem thêm:

Tham Số

touchPositions: Array

Một mat阵 của Vector2s, đại diện vị trí màn hình, trong pixel, của ngón tay liên quan đến cú động ping.

scale: number

Độ lớn của cúi từ đầu đến cuối (in pixel) chia bởi vị trí cúi xuất phát.

velocity: number

Tốc độ của hành động nhấn chuột (in pixel) mỗi giây.

The Enum.UserInputState of the gesture.

gameProcessedEvent: bool

Chỉ ra có phải game engine nội tại quan sát vào nhập này và hành động vào nó. Thông thường điều này tham khảo vào quá trình xử lý UI, vì vậy nếu một nút được chạm hoặc nhấp từ nhập này, gameProcessedEvent sẽ là true .


Mẫu mã

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

Sự kiện TouchRotate bắt đầu khi một người quay hai ngón tay trên một thiết bị TouchEnabled .

Ví dụ, mã sau đây in ra bao nhiêu máy ảnh đã quay kể từ khi bắt đầu chuyển động cảm ứng.


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

Để kiểm tra có phải thiết bị của người dùng đã bật Cảm ứng không, và sự kiện cảm ứng sẽ được tác thành, xem UserInputService.TouchEnabled .

Sự kiện này chỉ bắt đầu khi cửa sổ client Roblox đang tập trung. Ví dụ, các lựa chọn sẽ không được bắt đầu khi cửa sổ được tối ưu hóa.

Vì sự kiện này chỉ được kích hoạt ở địa phương, nó chỉ có thể được sử dụng trong một LocalScript .

Các kịch bản trình duyệt web điều khiển máy ảnh của người dùng trên một thiết bị di động sử dụng mã hoạt động tương tự như sự kiện này. Tốt nhất cho sự kiện này là sử dụng nó khi tạo một hệ thống máy ảnh di động để vượt qua các kịch bản trình duyệt web mặc định.

Xem thêm:

Tham Số

touchPositions: Array

Một dàn Vector2s , cho thấy vị trí của ngón tay liên quan đến cử chỉ.

rotation: number

Số độ nào mà thẻ đã quay kể từ khi bắt đầu thẻ.

velocity: number

Sự thay đổi về mức độ quay (theo độ) chia bởi thời gian thay đổi (theo giây).

The Enum.UserInputState of the gesture.

gameProcessedEvent: bool

Chỉ ra có phải game engine nội tại quan sát vào nhập này và hành động vào nó. Thông thường điều này tham khảo vào quá trình xử lý UI, vì vậy nếu một nút được chạm hoặc nhấp từ nhập này, gameProcessedEvent sẽ là true .


Mẫu mã

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

Sự kiện TouchStarted bắt đầu khi một người đặt ngón tay của họ trên một thiết bị TouchEnabled, bắt đầu nhập hệ thống cảm ứng với thiết bị.

Sự kiện này có thể được sử dụng để xác định khi một người bắt đầu chạm vào màn hình của thiết bị của họ. Nó có thể được kết hợp với UserInputService.TouchEnded để xác định khi một người bắt đầu và dừng chạm vào màn hình.

Ở đây, touch input object là cùng một đối tượng nhập màn hình cảm ứng trong suốt cuộc sống của touch. Vì vậy, so sánh InputObjects khi họ là đối tượng touch là hợp lệ để xác định nếu đó là ngón tay cùng.

Để kiểm tra có phải thiết bị của người dùng đã bật Cảm ứng không, và sự kiện cảm ứng sẽ được tác thành, xem UserInputService.TouchEnabled .

Sự kiện này chỉ bắt đầu khi cửa sổ client Roblox đang tập trung. Ví dụ, các lựa chọn sẽ không được bắt đầu khi cửa sổ được tối ưu hóa.

Vì sự kiện này chỉ được kích hoạt ở địa phương, nó chỉ có thể được sử dụng trong một LocalScript .

Xem thêm:

Tham Số

Một InputObject ví dụ / trường hợp, chứa thông tin về nhập của người dùng.

gameProcessedEvent: bool

Chỉ ra có phải game engine nội tại quan sát vào nhập này và hành động vào nó. Thông thường điều này tham khảo vào quá trình xử lý UI, vì vậy nếu một nút được chạm hoặc nhấp từ nhập này, gameProcessedEvent sẽ là true .


Mẫu mã

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

Sự kiện TouchSwipe được kích hoạt khi một người dùng lau mắt của họ trên một thiết bị TouchEnabled .

Sự kiện này có thể được sử dụng để xác định khi một người dùng trượt ngón tay của họ trên màn hình của thiết bị của họ và hướng mà người dùng trượt.

Để theo dõi chính xác hơn về chuyển động của người dùng, hãy sử dụng bằng cách sử dụng UserInputService.TouchMoved

Để kiểm tra có phải thiết bị của người dùng đã bật Cảm ứng không, và sự kiện cảm ứng sẽ được tác thành, xem UserInputService.TouchEnabled .

Sự kiện này chỉ bắt đầu khi cửa sổ client Roblox đang tập trung. Ví dụ, các lựa chọn sẽ không được bắt đầu khi cửa sổ được tối ưu hóa.

Vì sự kiện này chỉ được kích hoạt ở địa phương, nó chỉ có thể được sử dụng trong một LocalScript .

Xem thêm:

Tham Số

swipeDirection: Enum.SwipeDirection

Một Enum.SwipeDirection, cho biết hướng mà người dùng đã swipe.

numberOfTouches: number

Số lần chạm (ví dụ như ngón tay) liên quan đến hành động.

gameProcessedEvent: bool

Chỉ ra có phải game engine nội tại quan sát vào nhập này và hành động vào nó. Thông thường điều này tham khảo vào quá trình xử lý UI, vì vậy nếu một nút được chạm hoặc nhấp từ nhập này, gameProcessedEvent sẽ là true .


Mẫu mã

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

Sự kiện TouchTap bắt đầu khi người dùng chạm vào ngón tay của họ trên màn hình của thiết bị TouchEnabled nào đó.

Sự kiện này sẽ bắt lửa bất kể người dùng có chạm/nhấn vào thế giới trò chơi hay một thành phần GUI. Nếu bạn đang tìm kiếm một sự kiện chỉ khi người dùng chạm/nhấn vào thế giới trò chơi, hãy sử dụng Class.UserInputService.TouchTapIn

Để kiểm tra có phải thiết bị của người dùng đã bật Cảm ứng không, và sự kiện cảm ứng sẽ được tác thành, xem UserInputService.TouchEnabled .

Sự kiện này chỉ bắt đầu khi cửa sổ client Roblox đang tập trung. Ví dụ, các lựa chọn sẽ không được bắt đầu khi cửa sổ được tối ưu hóa.

Vì sự kiện này chỉ được kích hoạt ở địa phương, nó chỉ có thể được sử dụng trong một LocalScript .

Tham Số

touchPositions: Array

Một dàn Vector2 đối tượng, chỉ thị vị trí của ngón tay liên quan đến cử chỉ nhấn.

gameProcessedEvent: bool

Chỉ ra có phải game engine nội tại quan sát vào nhập này và hành động vào nó. Thông thường điều này tham khảo vào quá trình xử lý UI, vì vậy nếu một nút được chạm hoặc nhấp từ nhập này, gameProcessedEvent sẽ là true .


Mẫu mã

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

Sự kiện TouchTapInWorld bắt đầu khi người dùng chạm vào ngón tay của họ trên màn hình trên một thiết bị TouchEnabled . Nó được kích hoạt khi người dùng nhấp vào thế giới trong trò chơi.

Sự kiện này có thể được sử dụng để xác định khi một người nhấp vào màn hình và không nhấp vào một thành phần GUI. Nếu người nhấp vào một thành phần GUI, GUI sẽ bắt đầu hoạt động thay vì TouchTapInWorld.

Để kiểm tra có phải thiết bị của người dùng đã bật Cảm ứng không, và sự kiện cảm ứng sẽ được tác thành, xem UserInputService.TouchEnabled .

Sự kiện này chỉ bắt đầu khi cửa sổ client Roblox đang tập trung. Ví dụ, các lựa chọn sẽ không được bắt đầu khi cửa sổ được tối ưu hóa.

Vì nó chỉ được kích hoạt ở địa phương, nó chỉ có thể được sử dụng trong một LocalScript .

Xem thêm:

Tham Số

position: Vector2

Một Vector2 để chỉ vị trí của màn hình cảm ứng.

processedByUI: bool

Whether the user tapped a GUI element.


Mẫu mã

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

Sự kiện UserInputService WindowFocusRelease khi cửa sổ của client Roblox thua tập trung - thường là khi client Roblox được tối ưu hóa bởi người dùng.

Ví dụ, mã dưới đây in "Window focus released" mỗi khi client Roblox mất tập trung.


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

Sự kiện này có thể được sử dụng cùng với UserInputService.WindowFocused để theo dõi apakah client Roblox đang tập trung chủ động trên màn hình của người dùng.

Vì nó chỉ được kích hoạt ở địa phương, nó chỉ có thể được sử dụng trong một LocalScript .


Mẫu mã

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

Sự kiện UserInputService WindowFocused bắt đầu khi cửa sổ của client Roblox nhận được sự tập trung - thường là khi client Roblox đang tối ưu hóa/mở rộng trên màn hình người dùng.

Ví dụ, mã dưới đây in "Window focused" mỗi khi client Roblox nhận được sự tập trung.


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

Sự kiện này có thể được sử dụng cùng với UserInputService.WindowFocusReleased để theo dõi apakah client Roblox đang tập trung chủ động trên màn hình của người dùng.

Vì sự kiện này chỉ được kích hoạt ở địa phương, nó chỉ có thể được sử dụng trong một LocalScript .


Mẫu mã

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)