UserInputService

Pokaż przestarzałe

*Ta zawartość została przetłumaczona przy użyciu narzędzi AI (w wersji beta) i może zawierać błędy. Aby wyświetlić tę stronę w języku angielskim, kliknij tutaj.

Brak możliwości tworzenia
Usługa
Bez replikacji

UserInputService to usługa służąca do wykrywania i kopiowania różnych rodzajów danych dostępnych na urządzenieużytkownika.

Głównym celem tego usługi jest umożliwienie współpracy z wieloma formami dostępnych wejść, takich jak gamepady, ekrany dotykowe i klawiatury. Umożliwia to LocalScript wykonanie różnych akcji w zależności od urządzenia i, w zamian, zapewnić najlepszy doświadczenie dla użytkownika końcowego.

Niektóre użycia tego usługi obejmują wykrywanie wejścia użytkownika, gdy interagują z interfejsami użytkownika, narzędziami i innymi instancjami gry. Aby wykryć wejście użytkownika, usługa musi szukać wydarzeń, takich jak gdy użytkownik dotyka ekran

Ponieważ ten serwis jest tylko stroną klienta, będzie działać tylko wtedy, gdy zostanie użyty w LocalScript lub ModuleScript wymagającym LocalScript . Ponieważ UserInputService jest stroną klienta, użytkownicy w grze mogą wykryć tylko własny wpis - a nie wpis innych.

Zobacz również ContextActionService, usługę, która umożliwia związanie funkcji z wieloma wejściami użytkownika.

Przykłady kodu

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)

Podsumowanie

Właściwości

  • Tylko do odczytu
    Bez replikacji
    Odczyt równoległy

    Opisuje czy urządzenie użytkownika ma akcelerometr.

  • Tylko do odczytu
    Bez replikacji
    Odczyt równoległy

    Opisuje czy urządzenie używane przez użytkownika ma dostępny gamepad.

  • Tylko do odczytu
    Bez replikacji
    Odczyt równoległy

    Opisuje czy urządzenie użytkownika ma giroskop.

  • Tylko do odczytu
    Bez replikacji
    Odczyt równoległy

    Opisuje czy urządzenie użytkownika ma dostępną klawiaturę.

  • Określa, czy można swobodnie poruszać myszką użytkownika lub czy jest zablokowana.

  • Bez replikacji
    Odczyt równoległy

    Skala wynik wyjścia użytkownika z Mouse .

  • Tylko do odczytu
    Bez replikacji
    Odczyt równoległy

    Opisuje czy urządzenie użytkownika ma dostępny mysz.

  • MouseIcon:ContentId
    Odczyt równoległy

    ID treści używanej jako ikona myszy użytkownika.

  • Odczyt równoległy

    Określa, czy ikona Mouse jest widoczna.

  • Tylko do odczytu
    Bez replikacji
    Odczyt równoległy

    Określa pozycję klawiatury na ekranie.

  • Tylko do odczytu
    Bez replikacji
    Odczyt równoległy

    Określa rozmiar klawiatury na ekranie.

  • Tylko do odczytu
    Bez replikacji
    Odczyt równoległy

    Opisuje, czy klawiatura na ekranie jest obecnie widoczna na ekranie użytkownika.

  • Tylko do odczytu
    Bez replikacji
    Odczyt równoległy

    Opisuje, czy urządzenie użytkownika ma dostępny ekran dotykowy.

  • Tylko do odczytu
    Bez replikacji
    Odczyt równoległy

    Wskazuje, czy użytkownik używa wirtualnej rzeczywistości zestaw słuchawkowy.

Metody

Zdarzenia

Właściwości

AccelerometerEnabled

Tylko do odczytu
Bez replikacji
Odczyt równoległy

Ta właściwość opisuje czy urządzenie użytkownika ma akcelerometr

Przyśpieszyciel jest komponentem znajdującym się w większości urządzeń mobilnych, które mierzy przyspieszenie (zwiększenie prędkości).

Na przykład poniższy kod pokazuje, jak sprawdzić, czy urządzenie użytkownika ma akcelerometr.


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

Jeśli urządzenie ma włączony akcelerometr, możesz uzyskać jego bieżące akceleracje, używając funkcji UserInputService:GetDeviceAcceleration() lub śledź, gdy akceleracja urządzenia zmienia się za pomocą wydarzenia UserInputService.DeviceAccelerationChanged.

Ponieważ UserInputService jest tylko stroną klienta, ta właściwość może być używana tylko w LocalScript .

Przykłady kodu

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

Tylko do odczytu
Bez replikacji
Odczyt równoległy

Ten właściwość opisuje, czy urządzenie używane przez użytkownika ma dostępny gamepad. Jeśli gamepady są dostępne, możesz użyć UserInputService:GetConnectedGamepads() , aby odzyskać listę połączonych gamepadów.

Ponieważ UserInputService jest tylko stroną klienta, ta właściwość może być używana tylko w LocalScript .

Zobacz również:

Przykłady kodu

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

Tylko do odczytu
Bez replikacji
Odczyt równoległy

Ta właściwość opisuje czy urządzenie użytkownika ma giroskop.

Gyroskop jest komponentem znajdującym się w większości urządzeń mobilnych, które wykrywają kierunek i prędkość obrotową.

Jeśli urządzenie użytkownika ma giroskop, możesz użyć go w swojej grze, używając funkcji UserInputService:GetDeviceRotation() i wydarzenia 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

Ponieważ UserInputService jest tylko stroną klienta, ta właściwość może być używana tylko w LocalScript .

Przykłady kodu

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

Tylko do odczytu
Bez replikacji
Odczyt równoległy

Ten parametr opisuje czy urządzenie użytkownika ma dostępną klawiaturę. Ten parametr jest true, gdy urządzenie użytkownika ma dostępną klawiaturę, i false, gdy nie ma.

Można go użyć do określenia, czy użytkownik ma dostępną klawiaturę - co może być ważne, jeśli chcesz sprawdzić, czy możesz użyć UserInputService:IsKeyDown() lub UserInputService:GetKeysPressed() do sprawdzenia klawiatury.

Ponieważ UserInputService jest tylko stroną klienta, ta właściwość może być używana tylko w LocalScript .

Przykłady kodu

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

Odczyt równoległy

Ta właściwość ustawia, jak zachowuje się myszka użytkownika w zależności od Enum.MouseBehaviorENSEM. Domyślną wartością jest Enum.MouseBehavior.Default.

Można ustawić na trzy wartości:

  1. Domyślny : Myszka porusza się swobodnie po ekranie użytkownika.
  2. LockCenter : Myszka jest zablokowana i nie może się poruszać z centrum ekranu użytkownika.
  3. LockCurrentPosition : Mysz jest zablokowany i nie może się poruszać z, jego obecna pozycja na ekranie użytkownika w czasie zablokowania.

Wartość tego właściwości nie wpływa na czułość śledzenia myszy. Na przykład, GetMouseDelta wwraca tę samą pozycję ekranu w pikselach bez względu na to, czy mysz jest zablokowany czy może swobodnie poruszać się po ekranie użytkownika. W wynikdomyślne skrypty,

To właściwość jest ignorowana, jeśli GuiButton z Modal włączone jest GuiButton.Visible chyba, że przycisk myszy prawego gracza jest niedostępny.

Uwaga, że jeśli myszka jest zablokowana, UserInputService.InputChanged nadal zostanie wykonany, gdy gracz porusza myszką i będzie przepływał po Delta, którego próbował poruszyć myszka. Ponadto, jeśli gracz zostanie wyrzucony z gry, myszka zostanie wymusowo odblokowana.

Ponieważ UserInputService jest tylko stroną klienta, ta właściwość może być używana tylko w LocalScript .

Przykłady kodu

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

Bez replikacji
Odczyt równoległy

To właściwość określa czułość Mouse użytkownika.

Czułość określa stopień, w jakim przetłumaczenie ruchu myszy fizycznej na ruch myszy w grze. Można go używać do dostosowania, jak bardzo wydarzenia śledzenia ruchu myszy, takie jak GetMouseDelta , są ruchami myszy.

Ta właściwość nie wpływa na ruch ikony ikona. Nie wpływa również na ustawienie czułości kamerze znalezione w zakładce Ustawienia menu źródłowego Ustawienia, które również dostosowuje czułość ruchu myszy.

Ta właściwość ma maksymalną wartość 10 i minimalną wartość 0. Mniejsza wartość odpowiada mniejszej czułości, a wyższa wartość odpowiada wyższej czułości.

Gdy wrażliwość wynosi 0, zdarzenia śledzące ruch mysznadal zostaną uruchomione, ale wszystkie parametry i właściwości wskazujące na zmianę pozycji kursora zwrócą Vector2.new() lub Datatype. Vector3|Vector3.

Przykłady kodu

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

Tylko do odczytu
Bez replikacji
Odczyt równoległy

Ten parametr opisuje czy urządzenie użytkownika ma dostępny dla niego mysz. Ten parametr jest true, gdy urządzenie użytkownika ma dostępny dla niego mysz, i false, gdy nie ma.


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

Ważne jest, aby sprawdzić to przed użyciem funkcji myszy UserInputService takich jak UserInputService:GetMouseLocation() .

Ponieważ UserInputService jest tylko stroną klienta, ta właściwość może być używana tylko w LocalScript .

Zobacz również:

Przykłady kodu

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
Odczyt równoległy

Właściwość Ikona Myszy określa obraz używany jako wskaźnik. Jeśli pusty, używa się domyślną strzałkę. Podczas gdy kurser położony nad pewnymi obiektami UI, takimi jak ImageButton , TextButton lub 1> Class.ProximityProm

Aby całkowicie ukryć kursor, nie używaj nie używaj przejrzystego obrazu. Zamiast tego ustaw UserInputService.MouseIconEnabled na false.

Przykłady kodu

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

Odczyt równoległy

Ten parametr określa, czy ikona Mouse jest widoczna, gdy true ikona myszki jest widoczna, gdy false nie jest.

Na przykład kod snippet poniżej ukrywa ikona.


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

Ponieważ UserInputService jest tylko stroną klienta, ta właściwość może być używana tylko w LocalScript .

Przykłady kodu

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

Tylko do odczytu
Bez replikacji
Odczyt równoległy

Ta właściwość opisuje pozycję klawiatury na ekranie w pikselach. Pozycja klawiatury jest Vector2.new(0, 0) , gdy jest niewidoczna.

Ponieważ UserInputService jest tylko stroną klienta, ta właściwość może być używana tylko w LocalScript lub Script z ustawieniem 2>Class.BaseScript.RunContext|RunContext2> na 5>Ennum.RunContext.Client5>.

Zobacz również OnScreenKeyboardVisible i OnScreenKeyboardSize .

Przykłady kodu

UserInputService.OnScreenKeyboardPosition

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

OnScreenKeyboardSize

Tylko do odczytu
Bez replikacji
Odczyt równoległy

Ten właściwość opisuje rozmiar klawiatury na ekranie w pikselach. Rozmiar klawiatury jest Vector2.new(0, 0) , gdy nie jest widoczna.

Ponieważ UserInputService jest tylko stroną klienta, ta właściwość może być używana tylko w LocalScript lub Script z ustawieniem 2>Class.BaseScript.RunContext|RunContext2> na 5>Ennum.RunContext.Client5>.

Zobacz również OnScreenKeyboardVisible i OnScreenKeyboardPosition .

OnScreenKeyboardVisible

Tylko do odczytu
Bez replikacji
Odczyt równoległy

Ta właściwość opisuje, czy klawiatura na ekranie jest obecnie widoczna na ekranie użytkownika.

Ponieważ UserInputService jest tylko stroną klienta, ta właściwość może być używana tylko w LocalScript lub Script z ustawieniem 2>Class.BaseScript.RunContext|RunContext2> na 5>Ennum.RunContext.Client5>.

Zobacz również OnScreenKeyboardSize i OnScreenKeyboardPosition.

TouchEnabled

Tylko do odczytu
Bez replikacji
Odczyt równoległy

Ta właściwość opisuje, czy aktualny urząd użytkownika ma dostępny ekran dotykowy.

Właściwość jest używana do określenia, czy urządzenie użytkownika ma ekran dotykowy, a więc czy zdarzenia dotyku będą się wiązać. Jeśli włączone jest Umożliw dotyku , możesz używać wydarzeń UmożliwujUruchomienie ekranu , takich jak UserInputService.TouchStarted i UserInputService.TouchEnded,

Poniżej kod drukuje, czy urządzenie użytkownika ma ekran dotykowy.


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

Zobacz również:

Przykłady kodu

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

Tylko do odczytu
Bez replikacji
Odczyt równoległy

To właściwość opisuje, czy użytkownik używa urządzeniewirtualnej rzeczywistości (VR).

Jeśli urządzenie VR jest włączone, możesz z nim interagować poprzez funkcje, takie jak UserInputService:GetUserCFrame() . Możesz również reagować na ruch urządzenia VR poprzez wydarzenie UserInputService.UserCFrameChanged.


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

Ponieważ UserInputService jest tylko stroną klienta, ta właściwość może być używana tylko w LocalScript .

Zobacz również:

Przykłady kodu

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

Metody

GamepadSupports

Funkcja ta weryfikuje, czy Enum.UserInputType dostarcza graczom odpowiednią grę, która jest zgodna z Enum.KeyCode . Ta funkcja jest używana do określenia poprawnych wejść do gry.

Aby określić, które Enum.UserInputType pady gry są połączone, użyj UserInputService:GetConnectedGamepads() .

Ponieważ UserInputService jest tylko stroną klienta, ta funkcja może być używana tylko w LocalScript .

Zobacz również:

Parametry

gamepadNum: Enum.UserInputType

The Enum.UserInputType of the gamepad.

gamepadKeyCode: Enum.KeyCode

Przycisk Enum.KeyCode z kodem kluczowym KeyCode.


Zwroty

Czy dany gamepad wspiera przycisk odpowiadający Enum.KeyCode .

Przykłady kodu

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

Funkcja ta zwraca Enum.UserInputType arkusze gry, które są obecnie połączone. Jeśli żadne arkusze gry nie są połączone, to arkusze gry będą puste. Dodatkowo, zwraca tylko obiekty Enum.UserInputType jako gry. Na instancjaten wydarzenie zwróci obiekt połączonych Gamepad1, ale nie obiektu klawiatury.

Na przykład poniższy kod snippet'u odzyskuje połączone pady gry i zapisuje je w zmiennej nazyjącej się connectedGamepads .


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

Aby sprawdzić, czy podłączono określoną grę, użyj UserInputService:GetGamepadConnected() .

Ponieważ UserInputService jest tylko stroną klienta, ta funkcja może być używana tylko w LocalScript .

Zobacz również:


Zwroty

Materiały UserInputTypes odpowiadające na gamepady połączone z urządzeniem użytkownika.

Przykłady kodu

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

Funkcja GetDeviceAcceleration określa obecną akcelerację urządzenieużytkownika. Wynika z niego InputObject, który opisuje obecną akcelerację urządzenie.

Aby to działało, urządzenie użytkownika musi mieć włączony akcelerometr. Aby sprawdzić, czy użytkownik ma włączony akcelerometr, można sprawdzić właściwość UserInputService.AccelerometerEnabled.

Jeśli chcesz śledzić, gdy zmiana akceleracji urządzenieużytkownika zostanie zamiast tego zatrzymana, możesz użyć wydarzenia UserInputService.DeviceAccelerationChanged.

Ponieważ działa tylko lokalnie, można go używać tylko w LocalScript .


Zwroty

Przykłady kodu

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

Funkcja ta zwraca InputObject opisując obecny wektor grawitacji urządzenie.

ベクトル重力 jest determinowany przez orientację urządzenia w stosunku do rzeczywistego świata siły grawitacji. Na instancja, jeśli urządzenie jest całkowicie proste (portret), rベクトル重力 jest Vector3.new(0, 0, -9.18) . Je

Funkcja ta może być używana do włączenia urządzenia użytkownika do wpływu lub kontroli grawitacji w grze lub ruchu w grze obiektów takich jak kulki.

Grawitacja jest śledzona tylko dla graczy, którzy używają urządzenia z włączonym giroskopem - takiego jak urządzenie mobilne.

Aby sprawdzić, czy urządzenie użytkownika ma włączony giroskop, sprawdź wartość UserInputService.GyroscopeEnabled . Jeśli urządzenie ma włączony giroskop, możesz również użyć wydarzenia UserInputService.DeviceGravityChanged, aby śledzić, kiedy siła grawitacji na urządzeniu użytkownika zmienia się.

Ponieważ UserInputService jest tylko stroną klienta, ta funkcja może być używana tylko w LocalScript .


Zwroty

Przykłady kodu

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

Funkcja ta zwraca InputObject i CFrame opisujące obecny wkręt obrotowy urządzenie.

To jest uruchomione za pomocą InputObject. Właściwość Pozycja w obiekcie wejściowym jest Enum.InputType.Gyroscope, która śledzi całą rotację w każdym lokalnym urządzeniu osi.

Rotacja urządzenia może być śledzona tylko na urządzeniach z gyroscope .

Ponieważ funkcja ta działa lokalnie, można ją używać tylko w LocalScript .


Zwroty

Template zawierający dwa właściwości:

  1. Właściwość Delta opisuje ilość rotacji, która ostatnio się wydarzyła
  2. CFrame jest obecną rotacją urządzeniew stosunku do jego domyślnej ramek referencyjnych.

Przykłady kodu

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

Funkcja ta zwraca TextBox, na który kliент jest obecnie skupiony. A TextBox może być ręcznie wybrany przez użytkownika lub wybór może być zmuszony używając funkcji TextBox:CaptureFocus(). Jeśli nie zostanie wybrany żaden TextBox, funkcja ta zwraca nie.

Ponieważ UserInputService jest tylko stroną klienta, ta funkcja może być używana tylko w LocalScript .

Zobacz również:


Zwroty

Przykłady kodu

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

Funkcja ta zwraca, czy Enum.UserInputType jest połączony z klientem.

Można użyć tego, aby sprawdzić, czy określony gamepad, tak jak 'Gamepad1' jest połączony z urządzeniem klienta.

Aby odzyskać listę wszystkich połączonych gamepadów, użyj UserInputService:GetConnectedGamepads() .

Ponieważ UserInputService jest tylko stroną klienta, ta funkcja może być używana tylko w LocalScript .

Zobacz również:

Parametry

gamepadNum: Enum.UserInputType

ENSEGMENT 2 z grą na pakcie w sprawie.


Zwroty

Czy gamepad związany z Enum.UserInputType jest połączony.

Przykłady kodu

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

Funkcja ta zwraca InputObjects dla wszystkich dostępnych wejść na danej Enum.UserInputType grze, reprezentując ostatni stan wejścia każdego wejścia.

Aby znaleźć UserInputTypes połączone pady do gry, użyj UserInputService:GetConnectedGamepads().

Ponieważ ta funkcja działa tylko lokalnie, można ją używać tylko w LocalScript .

Zobacz również:

Parametry

gamepadNum: Enum.UserInputType

Menu.UserInputType korespondujące z gamepadem w grze.


Zwroty

Materiały InputObjects reprezentujące aktualny stan wszystkich dostępnych wejść dla danej gry.

GetImageForKeyCode

ContentId

Ten metodę wziąć Enum.KeyCode i zwrócić związany obraz dla aktualnie połączonego urządzenia gamepad (ograniczony do Xbox, PlayStation i Windows). Oznacza to, że jeśli połączony controller jest kontrolerem Xbox, użytkownik widzi zasoby Xbox. Podobnie, jeśli połączony urządzenie jest kontrolerem Play

Parametry

keyCode: Enum.KeyCode

ENSEGMENT.PLIK dla którego należy uzyskać związany obraz.


Zwroty

ContentId

Zwrócony identyfikator zasobu obrazu.

Przykłady kodu

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

Funkcja ta zwraca InputObjects związane z klawiszami, które są obecnie naciskane.

Ta lista może być przetwarzana poprzez, aby określić, które klawisze są obecnie naciskane, używając wartości InputObject.KeyCode.

Aby sprawdzić, czy określony klucz jest naciskany, użyj UserInputService:IsKeyDown() .

Ponieważ UserInputService jest tylko stroną klienta, ta funkcja może być używana tylko w LocalScript .


Zwroty

Materiały InputObjects związane z klawiszami, które są obecnie naciskane.

Przykłady kodu

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

Funkcja ta zwraca 'enum.userinputtype' związany z najnowszym wejściem użytkownika.

Na przykład, jeśli poprzedni wpis użytkownika nacisnął przestrzeń, Enum.UserInputType zwróciłaby być Klawiatura.

Wydarzenie UserInputService.LastInputTypeChanged można użyć do śledzenia, kiedy ostatni Enum.UserInputType użyty przez użytkownika zmienił się.

Ponieważ UserInputService jest tylko stroną klienta, ta funkcja może być używana tylko w LocalScript .


Zwroty

Menu.UserInputType związany z najnowszym wejściem użytkownika.

Przykłady kodu

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

Funkcja ta zwraca InputObjects Arrays odpowiadające za przyciski myszy obecnie naciskane.

Przyciski myszy, które są śledzone przez tę funkcję, obejmują:


<tr>
<td>Przycisk myszy1</td>
<td>Lewy przycisk myszy.</td>
</tr>
<tr>
<td>Przycisk myszy2</td>
<td>Prawy przycisk myszy.</td>
</tr>
<tr>
<td>Przycisk myszy3</td>
<td>Przycisk środkowy myszy.</td>
</tr>
NazwaOpis

Jeśli użytkownik nie nacisnął żadnego przyciska myszy, gdy funkcja jest wzywana, to zwraca pustą matrycę.

Ponieważ UserInputService jest tylko stroną klienta, ta funkcja może być używana tylko w LocalScript .


Zwroty

Materiały InputObjects odpowiadające za obecnie przytrzymywane przyciski myszy.

Przykłady kodu

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

Funkcja ta powoduje, że zmiana, w pikselach, pozycji gracza Mouse w ostatnim renderowanym klatce jako Vector2 . Ta funkcja działa tylko wtedy, gdy myszy były zablokowane za pomocą właściwości UserInputService.MouseBehavior. Jeśli my

Czułość myszy, zdeterminowana w ustawieniach klienta i UserInputService.MouseDeltaSensitivity, wpłynie na wynik.

Ponieważ UserInputService jest tylko stroną klienta, ta funkcja może być używana tylko w LocalScript .


Zwroty

Zmień ruch myszy.

Przykłady kodu

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

Funkcja ta zwraca Vector2 reprezentując obecną lokalizację ekranu gracza Mouse w pikselach w odniesieniu do lewego górnego rogu. Nie uwzględnia to wkładu GUI w zapisie.

Jeśli położenie kursora jest offscreen lub urządzenie gracza nie ma mysz, wartość zwrócona będzie nieokreślona.

Ponieważ UserInputService jest tylko stroną klienta, ta funkcja może być używana tylko w LocalScript .


Zwroty

A Vector2 przedstawiający obecną lokalizację ekranu myszy, w pikselach.

Przykłady kodu

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

Funkcja ta zwraca maszynę UserInputTypes, która jest połączona i włączona do GUI. Lista ta jest w odwrotnej kolejności priorytetu, co oznacza, że można ją przeszukiwać, aby określić, która maszyna ma kontrolę nad nawigacją.

Czy połączony gamepad jest gamepadem sterowania tylko określa, która z gamepadów steruje interfejsami użytkownika. Nie wpływa to na elementy sterująceinterfejsami użytkownika.

Ponieważ UserInputService jest tylko stroną klienta, ta funkcja może być używana tylko w LocalScript .

Zobacz również:


Zwroty

Materiały UserInputTypes, które można używać do nawigacji GUI, w odwrotnej kolejności priorytetu.

GetStringForKeyCode

GetStringForKeyCode zwraca strungę reprezentującą klucz, którego użytkownik powinien nacisnąć, aby wprowadzić dany Enum.KeyCode , uwzględniając jego układ klawiatury. Dla kodów kluczowych, które wymagają pewnego modyfikatora do przesłania, ta funkcja zwraca klucz do naciskania wraz z modyfikatorem. Widoczne przykłady poniżej

Gdy używasz Roblox z niezgodną z QWERTY układem klawiatury, kody kluczowe są mapowane na równivalentne pozycje QWERTY. Na przy


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

Przykłady na klawiaturze QWERTY


<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> ponieważ <code>@</code> jest wpisywany z <kbd>Shift</kbd><kbd>2</kbd></td>
</tr>
</tbody>
Kod kluczowyWartość zwrotu

Przykłady na klawaturze AZERTY


<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>
Kod kluczowyWartość zwrotu

Użyj gamepadu

GetStringForKeyCode() zwraca mapę liter dla Enum.KeyCode dla najnowszej gry. Jeśli połączony kontroler nie jest wspierany, funkcja zwraca domyślną konwersję liter dla wymaganego kodu kluczowego.

Poniższy przykład pokazuje, jak można mapować niestandardowe zasoby dla 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

Mapy Gamepad

Kody kluczowych płytki kierunkowej nie mają żadnych różnic w zależności od urządzenie. Enum.KeyCode.ButtonSelect ma nieco inny zachowanie w niektórych przypadkach. Użyj obu kodów PlayStation, aby upewnić się, że użytkownicy widzą poprawne przyciski.


<tbody>
<tr>
<td><code>Enum.KeyCode.ButtonA</code></td>
<td><code>PrzyciskowyCross</code></td>
<td><code>PrzyciskA</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.ButtonB</code></td>
<td><code>Krąg Przycisków</code></td>
<td><code>Przycisk B</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.ButtonX</code></td>
<td><code>Kwadrat Przycisków</code></td>
<td><code>Przycisk X</code></td>
</tr>
<tr>
<td><code>Enum.KeyCode.ButtonY</code></td>
<td><code>Prójkąt Przyciskowy</code></td>
<td><code>Przycisk Y</code></td>
</tr>
<tr>
<td><code>enum.keycode.ButtonL1</code></td>
<td><code>Przycisk L1</code></td>
<td><code>Przycisk LB</code></td>
</tr>
<tr>
<td><code>enum.KeyCode.ButtonL2</code></td>
<td><code>Przycisk L2</code></td>
<td><code>PrzyciskLT</code></td>
</tr>
<tr>
<td><code>enum.KeyCode.ButtonL3</code></td>
<td><code>Przycisk L3</code></td>
<td><code>PrzyciskiLS</code></td>
</tr>
<tr>
<td><code>enum.keycode.buttonr1</code></td>
<td><code>Przycisk R1</code></td>
<td><code>Przycisk RB</code></td>
</tr>
<tr>
<td><code>enum.KeyCode.ButtonR2</code></td>
<td><code>Przycisk R2</code></td>
<td><code>PrzyciskRT</code></td>
</tr>
<tr>
<td><code>enum.KeyCode.ButtonR3</code></td>
<td><code>PrzyciskR3</code></td>
<td><code>Przycisk RS</code></td>
</tr>
<tr>
<td><code>enum.keycode.buttonStart</code></td>
<td><code>OpcjePrzycisków</code></td>
<td><code>Przycisk Startowy</code></td>
</tr>
<tr>
<td><code>enum.keycode.buttonSelect</code></td>
<td><code>Touchpad przycisku</code> i <code>Udostępnij przyciski</code></td>
<td><code>Przycisk Select</code></td>
</tr>
</tbody>
Kod kluczowyWartość PlayStationWartość zwrotu Xbox

Obrazy systemu dla KeyCodes

Kiedy używasz Enum.KeyCode, który może być lepiej przedstawiony jako obraz, tak jak dla ImageLabel w interfejsie użytkownika, możesz użyć następujących ikonek dziedzictwa. Jest jednak rekomendowane, aby użyć Class.UserInputService:GetImageForKeyCode()|GetImageForKey


<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>enum.KeyCode.DPadLeft</code></td>
<td>
<img src="../../../assets/scripting/controls/dpadLeft.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/dpadLeft.png</code></td>
</tr>
<tr>
<td><code>enum.KeyCode.DPadRight</code></td>
<td>
<img src="../../../assets/scripting/controls/dpadRight.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/dpadRight.png</code></td>
</tr>
<tr>
<td><code>enum.KeyCode.DPadUp</code></td>
<td>
<img src="../../../assets/scripting/controls/dpadUp.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/dpadUp.png</code></td>
</tr>
<tr>
<td><code>enum.KeyCode.DPadDown</code></td>
<td>
<img src="../../../assets/scripting/controls/dpadDown.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/dpadDown.png</code></td>
</tr>
<tr>
<td><code>enum.keycode.buttonSelect</code></td>
<td>
<img src="../../../assets/scripting/controls/xboxView.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/xboxView.png</code></td>
</tr>
<tr>
<td><code>enum.keycode.buttonStart</code></td>
<td>
<img src="../../../assets/scripting/controls/xboxmenu.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/xboxmenu.png</code></td>
</tr>
<tr>
<td><code>enum.keycode.ButtonL1</code></td>
<td>
<img src="../../../assets/scripting/controls/xboxLB.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/xboxLB.png</code></td>
</tr>
<tr>
<td><code>enum.keycode.buttonr1</code></td>
<td>
<img src="../../../assets/scripting/controls/xboxRB.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/xboxRB.png</code></td>
</tr>
<tr>
<td><code>enum.KeyCode.ButtonL2</code></td>
<td>
<img src="../../../assets/scripting/controls/xboxLT.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/xboxLT.png</code></td>
</tr>
<tr>
<td><code>enum.KeyCode.ButtonR2</code></td>
<td>
<img src="../../../assets/scripting/controls/xboxRT.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/xboxRT.png</code></td>
</tr>
<tr>
<td><code>enum.KeyCode.ButtonL3</code></td>
<td>
<img src="../../../assets/scripting/controls/xboxLS.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/xboxLS.png</code></td>
</tr>
<tr>
<td><code>enum.KeyCode.ButtonR3</code></td>
<td>
<img src="../../../assets/scripting/controls/xboxRS.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/xboxRS.png</code></td>
</tr>
<tr>
<td><code>enum.keycode.thumbstick1</code></td>
<td>
<img src="../../../assets/scripting/controls/xboxLSDirectional.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/xboxLSDirectional.png</code></td>
</tr>
<tr>
<td><code>enum.keycode.thumbstick2</code></td>
<td>
<img src="../../../assets/scripting/controls/xboxRSDirectional.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/xboxRSDirectional.png</code></td>
</tr>
<tr>
<td><code>Kod kluczowy.</code></td>
<td>
<img src="../../../assets/scripting/controls/backspace.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/backspace.png</code></td>
</tr>
<tr>
<td><code>enum.keycode.return</code></td>
<td>
<img src="../../../assets/scripting/controls/return.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/return.png</code></td>
</tr>
<tr>
<td><code>enum.KeyCode.LeftShift</code></td>
<td>
<img src="../../../assets/scripting/controls/shift.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/shift.png</code></td>
</tr>
<tr>
<td><code>enum.KeyCode.RightShift</code></td>
<td>
<img src="../../../assets/scripting/controls/shift.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/shift.png</code></td>
</tr>
<tr>
<td><code>Tablica kluczowa</code></td>
<td>
<img src="../../../assets/scripting/controls/tab.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/tab.png</code></td>
</tr>
<tr>
<td><code>enum.keycode.apostrophe</code></td>
<td>
<img src="../../../assets/scripting/controls/apostrophe.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/apostrophe.png</code></td>
</tr>
<tr>
<td><code>enum.keycode.comma</code></td>
<td>
<img src="../../../assets/scripting/controls/comma.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/comma.png</code></td>
</tr>
<tr>
<td><code>enum.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>Kod kлюczowy dla okresu czasowego</code></td>
<td>
<img src="../../../assets/scripting/controls/period.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/ периоd.png</code></td>
</tr>
<tr>
<td><code>enum.keycode.space</code></td>
<td>
<img src="../../../assets/scripting/controls/spacebar.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/spacebar.png</code></td>
</tr>
</tbody>
Kod kluczowyObrazIdentyfikator zasobu

Parametry

keyCode: Enum.KeyCode

Zwroty

GetSupportedGamepadKeyCodes

Funkcja ta zwraca KeyCodes, która jest matrycą poprzeć dla danej Enum.UserInputType matrycy wspieranej.

Funkcja ta może być używana do określenia, które KeyCodes są wspierane i nie wspierane przez połączoną grę. Aby określić, czy określony KeyCodes jest wspierany, użyj UserInputService:GamepadSupports() .

Jeśli wezwano nieistniejący lub niezwiązany gamepad, ta funkcja zwróci pustą matrycę.

Ponieważ UserInputService jest tylko stroną klienta, ta funkcja może być używana tylko w LocalScript .

Zobacz również:

Parametry

gamepadNum: Enum.UserInputType

The Enum.UserInputType of the gamepad.


Zwroty

Materiały KeyCode|Kod kluczowy|Kod kłamstwa|Kod kłamstwa|Kod kłamstwa|Kod kłamstwa|Kod kłamstwa|Kod kłamstwa|Kod kłamstwa|Kod kłamstwa|Kod kłamstwa|Kod kłamstwa|Kod kłamstwa|Kod kłamstwa|Kod kłamstwa|Kod kłamstwa|Kod kłamstwa|Kod kłamstwa|Kod kłamstwa|Kod kłamstwa|Kod kłamstwa|Kod kłamstwa|Kod kłamstwa|Kod kłamstwa|Kod kłamstwa|Kod

Przykłady kodu

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

Funkcja ta sprawdza, czy na określonym gamepadzie jest naciśnięty określony przycisk. Wynika true , jeśli gamepad ma określony przycisk naciśnięty, w innym przypadku zwraca fałszywy.

Poprawne UserInputTypy

Wymaganym panelem powinno być jeden z następujących wartości typu UserInputType:


<tr>
<td>enum.userinput type.gamepad1-8</td>
</tr>
Nazwa

Poprawne kluczowe kody

Określony przycisk powinien być jedną z wartości wymienionych w następującej tabeli KeyCodes:


<tr>
<td>Lista kluczowa.KeyCode.ButtonX</td>
</tr>
<tr>
<td>enum.keycode.buttonY</td>
</tr>
<tr>
<td>Lista kluczowa.Kodeks.PrzyciskA</td>
</tr>
<tr>
<td>Lista kluczowa.</td>
</tr>
<tr>
<td>enum.keycode.ButtonR1</td>
</tr>
<tr>
<td>Lista kluczowa.KeyCode.ButtonL1</td>
</tr>
<tr>
<td>enum.keycode.ButtonR2</td>
</tr>
<tr>
<td>enum.keycode.ButtonL2</td>
</tr>
<tr>
<td>Lista kluczowa.KeyCode.ButtonR3</td>
</tr>
<tr>
<td>Lista kluczowa.KeyCode.ButtonL3</td>
</tr>
<tr>
<td>Lista kluczowa.KeyCode.ButtonStart</td>
</tr>
<tr>
<td>enum.keycode.ButtonSelect</td>
</tr>
<tr>
<td>PadLeft</td>
</tr>
<tr>
<td>PadRight</td>
</tr>
<tr>
<td>PadUp</td>
</tr>
<tr>
<td>PadDown</td>
</tr>
Nazwa

Można użyć tego do sprawdzenia, czy określony przycisk, takich jak A, jest zatrzymany. Na przykład:


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

Ponieważ UserInputService jest tylko stroną klienta, ta funkcja może być używana tylko w LocalScript .

Zobacz również:

Parametry

gamepadNum: Enum.UserInputType

ENSEGMENT 2 z danej gry.

gamepadKeyCode: Enum.KeyCode

The Enum.KeyCode of the specified button.


Zwroty

Czy przycisk padu na podanych gamepadach jest naciskany.

Przykłady kodu

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

Funkcja ta weryfikuje, czy użytkownik przytrzymał klucz związany z Enum.KeyCode . Weryfikuje true , jeśli klucz podany jest lub false , jeśli nie jest.

Można użyć tego do sprawdzenia, czy określony klucz, takich jak przestrzeń koszyka, jest naciskany. Na przykład:


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

Aby odzyskać listę wszystkich kluczy naciśniętych przez użytkownika, użyj funkcji UserInputService:GetKeysPressed().

Ponieważ UserInputService jest tylko stroną klienta, ta funkcja może być używana tylko w LocalScript .

Zobacz również:

Parametry

keyCode: Enum.KeyCode

The Enum.KeyCode of the klucz.


Zwroty

Czy klucz podany jest w dół.

Przykłady kodu

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

Ta funkcja używa przycisku myszy Enum.UserInputType i zwraca bułkę, która wskazuje, czy jest ona teraz naciśnięta.

Przycisk myszy zależy od wartości Enum.UserInputType przekazanej funkcji jako argumentu. Na przykład:


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

Ponieważ UserInputService jest tylko stroną klienta, ta funkcja może być używana tylko w LocalScript ".

Parametry

mouseButton: Enum.UserInputType

The Enum.UserInputType of the mouse button.


Zwroty

Czy przycisk myszy jest obecnie zatrzymany.

Przykłady kodu

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

Funkcja ta zwraca true jeśli określony Enum.UserInputType gamepad jest dozwolony do kontroli Navigacji i Wyboru GUIs.

Jeśli chcesz ustawić grę na sterowaniu, możesz użyć UserInputService:SetNavigationGamepad() . Możesz również użyć UserInputService:GetNavigationGamepads() , aby uzyskać listę wszystkich gier sterowych.

Na przykład kod poniżej sprawdza, czy gamepad1 jest jako grypad kierunkowy:


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

Lista wszystkich połączonych gryszkód jest dostępna w wyświetlanych przez użytkownika wierszach.

Ponieważ UserInputService jest tylko stroną klienta, ta funkcja może być używana tylko w LocalScript .

Zobacz również:

Parametry

gamepadEnum: Enum.UserInputType

ENSEGMENT 2 z określonej gry.


Zwroty

Czy określony gamepad jest gamepadem do nawigacji.

RecenterUserHeadCFrame

void

Funkcja ta przesuwa CFrame VR-头set do bieżącej orientacji głowicy użytkownika. Oznacza to, że ​​aktualna orientacja zestaw słuchawkowyjest ustawiona na CFrame.new() .

Użyj funkcji, aby przenieść kamerę CFrame w centrum obszaru gry, jeśli wydaje się być w dziwnym odchyleniu.

Zachowuje się identycznie z funkcją VRService , VRService:RecenterUserHeadCFrame() .

Ponieważ UserInputService jest tylko stroną klienta, ta funkcja może być używana tylko w LocalScript .


Zwroty

void

Przykłady kodu

UserInputService:RecenterUserHeadCFrame

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

SetNavigationGamepad

void

Funkcja SetNavigationGamepad ustawia, czy określony Enum.UserInputType gamepad może przesuwać nawigator GUI. Gamepad, który jest dozwolony do przesuwania nawigatora GUI, jest uważany za nawigator gamepad.

Jeśli argument włączony zostanie przekazany jako true, Gamepad może przesunąć nawigator GUI. Jeśli argument jest false, Gamepad nie może przesunąć nawigatora GUI.

Jeśli chcesz sprawdzić, czy określony Gamepad jest ustawiony jako Gamepad do gry w nawigacji, możesz użyć funkcji UserInputService:IsNavigationGamepad(). Możesz również użyć funkcji UserInputService:GetNavigationGamepads() do odzyskania listy wszystkich gamepadów do gry w nawigacji.

Ponieważ UserInputService jest tylko stroną klienta, ta funkcja może być używana tylko w LocalScript .

Zobacz również:

Parametry

gamepadEnum: Enum.UserInputType

ENSEGMENT 2 z określonej gry.

enabled: bool

Czy określona gryszka może poruszać nawigatorem GUI.


Zwroty

void

Przykłady kodu

UserInputService:SetNavigationGamepad

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

Zdarzenia

DeviceAccelerationChanged

Wydarzenie AccelerationChanged pojawia się, gdy użytkownik porusza urządzenie, które ma akcelerometr.

Przyśpieszyciel jest komponentem znajdującym się w większości urządzeń mobilnych, które mierzy przyspieszenie (zwiększenie prędkości).

Aby określić, czy urządzenie użytkownika ma włączony akcelerometr, zobacz UserInputService.AccelerometerEnabled.

Ten wątek można używać do śledzenia ruchu urządzenia, które ma akcelerometr. Przykładowe użycie obejmuje przesuwanie postaci gracza, gdy urządzenie mobilne przyspiesza.

Dodatkowo ten wydarzenie można użyć wraz z UserInputService:GetDeviceAcceleration(), aby określić obecny ruch urządzenia użytkownika, jeśli urządzenie ma akcelerometr.

Ten wątek tylko działa lokalnie, co oznacza, że tylko gracz, który porusza swoje urządzenie, może używać wątku i będzie działać tylko w LocalScript .

Parametry

acceleration: InputObject

Class.InputObject z UserInputType i Accelerometer , który pokazuje siłę grawitacji na każdym lokalnym urządzeniu osi.


Przykłady kodu

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

Wydarzenie UserInputService.DeviceGravityChanged aktywuje się, gdy kiedykolwiek zmieni się grawitacja urządzenieVector3 na urządzeniu, które ma akcelerometr.

Wektor grawitacji urządzenia представляет siłą grawitacji na każdym z osi X, Y i Z. Podczas gdy grawitacja nigdy się nie zmienia, siła, którą wykonuje na każdym osi, zmienia się, gdy urządzenie się kręci i zmienia orientację. Wartość siły na każdym osi jest jednostkową wartość wahać od -1 do 1.

Przyśpieszyciel jest komponentem znajdującym się w większości urządzeń mobilnych, które mierzy przyspieszenie (zwiększenie prędkości).

Ten wątek można użyć do określenia kierunku w rzeczywistym świecie siły grawitacji na urządzenieużytkownika. Można nawet użyć tego, aby symulować siłę grawitacji na urządzeniu użytkownika w grze, takiej jak na obiektach w grze (zobacz przykład poniżej).

Aby sprawdzić, czy urządzenie użytkownika ma włączony akcelerometr, zobacz UserInputService.AccelerometerEnabled. Jeśli urządzenie ma włączony akcelerometr, możesz użyć funkcji UserInputService:GetDeviceGravity(), aby uzyskać bieżącą siłę grawitacji na urządzeniu użytkownika.

Parametry

gravity: InputObject

Class.InputObject z własnością InputObject.Position, która pokazuje siłę grawitacji na każdym lokalnym urządzeniu osi. Ta pozycja może być używana jako kierunek do określenia kierunku grawitacji w stosunku do urządzenie.


Przykłady kodu

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

Wydarzenie DeviceRotationChanged występuje, gdy użytkownik obraca urządzenie, które ma giroskop.

Gyroskop jest komponentem znajdującym się w większości urządzeń mobilnych, które wykrywają kierunek i prędkość obrotową.

Wydarzenie jest przydatne do śledzenia orientacji urządzenia i jak zmiany użytkownika obracają ich urządzenie. Aby określić obecną rotację urządzenia, możesz użyć funkcji UserInputService:GetDeviceRotation().

Aby sprawdzić, czy urządzenie użytkownika ma włączone giroskop i czy to wydarzenie zostanie uruchomione, zobacz UserInputService.GyroscopeEnabled.

Ten wążystać tylko się uruchomi, gdy okno klienta Roblox będzie skupione. Na przykład, wejścia nie zostaną złapane, gdy okno zostanie zminimalizowane.

Parametry

rotation: InputObject

Class.InputObject dostarczający informacji o rotacji urządzenie. InputObject.Position reprezentuje nową rotację a Vector3 reprezentuje zmianę rotacji w pozycji 1> Datatype.Vector31> .

cframe: CFrame

A CFrame reprezentujący obecną orientację urządzenie.


Przykłady kodu

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

Wydarzenie GamepadConnected zostaje uruchomione, gdy gamepad jest połączony z klientem.

Ponieważ gra na Roblox wspiera wiele kontrolerów, ten ewent jest użyteczny, gdy jest towarzyszony z wydarzeniem UserInputService.GamepadDisconnected, aby śledzić, które kontrolery/gamepady są aktywne. Możesz również użyć UserInputService:GetConnectedGamepads(), aby znaleźć poprawny gamepad do użycia.

Poniższy przykład pokazuje przykład użycia śledzenia, gdy konsola gier jest połączona z klientem.


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

Jeśli chcesz zobaczyć, które urządzenia są połączone, możesz użyć funkcji UserInputService:GetConnectedGamepads().

Ponieważ ten wątek działa lokalnie, można go używać tylko w LocalScript .

Zobacz również:

Parametry

gamepadNum: Enum.UserInputType

ENSEGMENT 2 z grą na konsoli.


GamepadDisconnected

Wydarzenie GamepadDisconnected występuje, gdy gra jest odłączona.

Ponieważ gra na Roblox wspiera wiele kontrolerów, ten ewent jest użyteczny, gdy jest towarzyszony z wydarzeniem UserInputService.GamepadConnected, aby śledzić, które kontrolery/gry są aktywne. Możesz również użyć UserInputService:GetConnectedGamepads(), aby znaleźć poprawny gamepad do użycia.

Poniższy przykład pokazuje przykład użycia śledzenia, gdy Gamepad jest odłączony od klienta.


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

Ponieważ ten wątek działa lokalnie, można go używać tylko w LocalScript .

Zobacz również:

Parametry

gamepadNum: Enum.UserInputType

Menu.NazwaUzywatele of the disconnected gamepad.


InputBegan

Wydarzenie StartBegan uruchomione, gdy użytkownik zacznie interagować za pośrednictwem urządzenia interfejsu człowiek-komputer (przycisk myszy, dotknięcie początku, klawiatura do klawiatury, itp.).

Można go używać do śledzenia początku interakcji użytkownika, takich jak gdy użytkownik po raz pierwszy wchodzi w interakcję z elementem GUI, gamepadem itp. Nie kryje ruchów kółka myszy.

Ten ewent może być używany wraz z UserInputService.InputChanged i UserInputService.InputEnded, aby śledzić, gdy użytkownik wpisuje, zmienia i kończy.

Ten wążystać tylko się uruchomi, gdy okno klienta Roblox będzie skupione. Na przykład, wejścia nie zostaną złapane, gdy okno zostanie zminimalizowane.

Ponieważ ten wątek tylko działa lokalnie, można go używać tylko w LocalScript .

Parametry

Przykład InputObject instancja, zawierający informacje o wejściu użytkownika.

gameProcessedEvent: bool

Wskazuje, czy silnik gry wewnętrznie obserwował ten wpis i działał na nim. Zazwyczaj odnosi się to do przetwarzania interfejsu użytkownika, więc jeśli przycisk został dotknięty lub kliknięty z tego wpisu, gameProcessedEvent będzie true . To samo dotyczy również wydarzeń wejścia połączonych za pośrednictwem


Przykłady kodu

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

Wydarzenie zmienionej ilości wejść wyzwala się, gdy użytkownik zmienia sposób interakcji za pośrednictwem urządzenia interfejsu człowiek-komputer (przycisk myszy, dotykaj początku, naciśnij klawisz, itp.).

Aby ignorować wydarzenia, które są automatycznie przetwarzane przez Roblox, takie jak przewijanie się w ScrollingFrame , sprawdź argument gейmProcessingEvent . Ten wątek może być używany wraz z UserInputService.InputBegan i 1> Class.UserInputService.InputEnded1>, aby śledzi

Ten wążystać tylko się uruchomi, gdy okno klienta Roblox będzie skupione. Na przykład, wejścia nie zostaną złapane, gdy okno zostanie zminimalizowane.

Ponieważ ten wątek tylko działa lokalnie, można go używać tylko w LocalScript .

Parametry

Przykład InputObject instancja, zawierający informacje o wejściu użytkownika.

gameProcessedEvent: bool

Wskazuje, czy silnik gry wewnętrznie obserwował ten wpis i działał na nim. Zazwyczaj odnosi się to do przetwarzania interfejsu użytkownika, więc jeśli przycisk został dotknięty lub kliknięty z tego wpisu, gameProcessedEvent będzie true . To samo dotyczy również wydarzeń wejścia połączonych za pośrednictwem


Przykłady kodu

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

Wydarzenie InputEnded występuje, gdy użytkownik przestaje interagować za pośrednictwem urządzenia interfejsu człowiek-komputer (przycisk myszy, dotykaj początek, klawiatura, itp). Jest to użyteczne, gdy śledzisz, gdy użytkownik uwalnia klucz klawiatury, przycisk myszy, dotykaj ekranu, itp.

Ten wydarzenie można używać wraz z UserInputService.InputBegan i UserInputService.InputChanged, aby śledzić, gdy użytkownik wpisuje, zmienia i kończy.

Ten wążystać tylko się uruchomi, gdy okno klienta Roblox będzie skupione. Na przykład, wejścia nie zostaną złapane, gdy okno zostanie zminimalizowane.

Ponieważ ten wątek tylko działa lokalnie, można go używać tylko w LocalScript .

Parametry

Przykład InputObject instancja, zawierający informacje o wejściu użytkownika.

gameProcessedEvent: bool

Wskazuje, czy silnik gry wewnętrznie obserwował ten wpis i działał na nim. Zazwyczaj odnosi się to do przetwarzania interfejsu użytkownika, więc jeśli przycisk został dotknięty lub kliknięty z tego wpisu, gameProcessedEvent będzie true . To samo dotyczy również wydarzeń wejścia połączonych za pośrednictwem


Przykłady kodu

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

Wydarzenie UserInputService JumpRequest pojawia się, gdy istnieje prośba o skok z klienta, na przykład gdy klient naciśnie Spacebar lub przycisk Skocz w urządzeniu mobilnym.

Ten wążek zachowuje się, gdy użytkownik próbuje wykonać swój Player.Character skok. Domyślne zachowanie reaguje na wążąż wążąż wążąż wążąż wążąż wążąż wążąż wążąż wążąż wążąż wążąż wążąż wążąż wążąż wążąż wążąż wążąż wążąż wążąż wążąż wążą

Wydarzenie można używać do śledzenia za każdym razem, gdy gracz chce skakać. Zamiast używania go do skakania, powinno być używane do zmiany zachowania skoku domyślnego - takiego jak wyłączenie skaczania.

Na przykład poniższy kod drukuje "Jump" za każdym razem, gdy gracz wysyłał prośbao skok.


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

Ponieważ ten wątek wydarza się wiele razy dla jednej prośbao skok, zaleca się użycie zatrzymania.

Jeśli chcesz połączyć klucze lub przyciski z innymi działaniami, rozważaj używanie wydarzeń, takich jak UserInputService:GetKeysPressed() i UserInputService.InputBegan lub ContextActionService.

Ponieważ ten wątek tylko działa lokalnie, można go używać tylko w LocalScript .


Przykłady kodu

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

Wydarzenie UserInputService.LastInputTypeChanged aktywuje się, gdy klienci zmieniają sposób interakcji za pośrednictwem urządzenieinterfejsu człowiek-komputer. (tj. od MouseMovement do MouseWheel lub od Thumbstick1 do Thumbstick2).

Aby uzyskać wartość ostatniego wpisywać, niezależnie od tego, czy się zmienił, możesz użyć funkcji UserInputService:GetLastInputType().

Ponieważ ten wątek tylko działa lokalnie, można go używać tylko w LocalScript .

Parametry

lastInputType: Enum.UserInputType

A Enum.UserInputType wskazujący na ostatni wpisywaćwejścia.


Przykłady kodu

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

Akcja Pointera uruchamia się, gdy użytkownik wykonuje określoną akcjikursora. W szczególności, przesuwanie kursora.

Parametry

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

TextBoxFocusReleased

Wydarzenie TextBoxFocusRelease zostanie wywołane, gdy klient traci skupienie na TextBox - zwykle, gdy klient przeniesie tekst do tekstu, naciskając Return lub klikając / dotykając gdzie indziej na ekranie.

Na przykład kod poniżej drukuje nazwę TextBox, która traci fokus, gdy wydarza się wydarzenie.


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

Można go używać obok UserInputService.TextBoxFocused, aby śledzić, kiedy TextBox zyskuje i traci fokus.

Ponieważ ten wątek tylko działa lokalnie, można go używać tylko w LocalScript .

Zobacz również:

Parametry

textboxReleased: TextBox

The TextBox which lost focus.


Przykłady kodu

TextBoxFocusReleased

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

TextBoxFocused

Wydarzenie TextBoxFocused działa, gdy zdobywa skupienie na TextBox - zwykle, gdy kliент klika / dotyka na tekst, aby rozpocząć wpisywanie tekstu. To również działa, jeśli tekstowa skupia się za pomocą TextBox:CaptureFocus().

Na przykład poniższy kod drukuje nazwę pola tekstowego skupionego, gdy wydarza się wydarzenie.


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

Można go używać obok UserInputService.FocusReleased , aby śledzić, gdy tekstowa skrzynka dostaje i traci fokus.

Ponieważ ten wątek tylko działa lokalnie, można go używać tylko w LocalScript .

Zobacz również:

Parametry

textboxFocused: TextBox

Class.Toolbar, który uzyskał fokus.


Przykłady kodu

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

Wydarzenie TouchEnded wyrzuca się, gdy użytkownik uwolnił swój palec z ekranu urządzenieTouchEnabled, kończąc w ten sposób wpisywanie dotacji za pomocą urządzenie.

Ten ewent może być używany do określenia, kiedy użytkownik przestaje dotykać ekranu swojego urządzenie. Można go połączyć z UserInputService.TouchStarted , aby określić, kiedy użytkownik zacznie i zakończy dotykanie ekranu.

Na przykład poniższy kod drukuje pozycję ekranu, gdzie użytkownik przestaje dotykać ekranu.


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

Przedmiot obiektu dotykowego jest tym samym obiektem dotykowym przez całe życie dotyku. Więc porównanie InputObjects gdy są obiektami dotykowymi jest ważne, aby określić, czy jest to ten sam palec.

Aby sprawdzić, czy urządzenie użytkownika jest TouchEnabled, i że wydarzenia dotyczyące dotyku zostaną uruchomione, zobacz UserInputService.TouchEnabled .

Ten wążystać tylko się uruchomi, gdy okno klienta Roblox będzie skupione. Na przykład, wejścia nie zostaną złapane, gdy okno zostanie zminimalizowane.

Ponieważ ten wątek tylko działa lokalnie, można go używać tylko w LocalScript .

Zobacz również:

Parametry

Przykład InputObject instancja, zawierający informacje o wejściu użytkownika.

gameProcessedEvent: bool

Wskazuje, czy silnik gry wewnętrznie obserwował ten wpis i działał na nim. Zazwyczaj odnosi się to do przetwarzania interfejsu użytkownika, więc jeśli przycisk został dotknięty lub kliknięty z tego wpisu, gameProcessedEvent będzie true . To samo dotyczy również wydarzeń wejścia połączonych za pośrednictwem


Przykłady kodu

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

Wystrzelony, gdy użytkownik trzyma co najmniej jeden palec przez krótką ilość czasu na tej samej pozycji urządzenieTouchEnabled.

Ten wskaźnik można użyć do określenia, kiedy użytkownik przytrzyma palc na w grze GUI lub element.

Poniższy przykład drukuje state długiego nacięcia, gdy użytkownik przytrzymuje co najmniej jeden palec przez krótką ilość czasu na tej samej pozycji ekranu. Możliwe stanowiska to: Zacznij, Zmień, 1> Koniec1>, 4> Anuluj


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)

Aby sprawdzić, czy urządzenie użytkownika jest TouchEnabled, i że wydarzenia dotyczyące dotyku będą się uruchomić, zobacz UserInputService.TouchEnabled .

Można go połączyć z UserInputService.TouchStarted i UserInputService.TouchEnded, aby określić, kiedy użytkownik zacznie i zakończy dotykanie ekranu.

Ten wążystać tylko się uruchomi, gdy okno klienta Roblox będzie skupione. Na przykład, wejścia nie zostaną złapane, gdy okno zostanie zminimalizowane.

Ponieważ ten wątek tylko działa lokalnie, można go używać tylko w LocalScript .

Zobacz również:

Parametry

touchPositions: Array

Materiały Vector2 , które określają położenie palców zaangażowanych w gest.

The Enum.UserInputState of the gesture.

gameProcessedEvent: bool

Wskazuje, czy silnik gry wewnętrznie obserwował ten wpis i działał na nim. Zazwyczaj odnosi się to do przetwarzania interfejsu użytkownika, więc jeśli przycisk został dotknięty lub kliknięty z tego wpisu, gameProcessedEvent będzie true . To samo dotyczy również wydarzeń wejścia połączonych za pośrednictwem


Przykłady kodu

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

Wydarzenie TouchMoved zostanie uruchomione, gdy użytkownik porusza palcem na urządzenieTouchEnabled.

Ten ewent może być używany do określenia, kiedy użytkownik porusza palcem, gdy dotyka ekranu urządzenieZaufaj. Może być przydatny, aby śledzić, czy użytkownik porusza palcem na ekranie, a także gdzie użytkownik porusza palcem.

Kod poniżej drukuje " dotykaną z" poprzedniego położenia Vector2 "do" nowej pozycji Vector2 użytkownika na TouchEnabled urządzenie.


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)

Można go połączyć z UserInputService.TouchStarted i UserInputService.TouchEnded, aby określić, kiedy użytkownik zaczyna dotykać ekranu, jak jego palce się poruszają podczas dotykania ekranu i kiedy przestaje dotykać ekranu.

Aby sprawdzić, czy urządzenie użytkownika jest TouchEnabled, i że wydarzenia dotyczyące dotyku zostaną uruchomione, zobacz UserInputService.TouchEnabled .

Ten wążystać tylko się uruchomi, gdy okno klienta Roblox będzie skupione. Na przykład, wejścia nie zostaną złapane, gdy okno zostanie zminimalizowane.

Ponieważ ten wątek tylko działa lokalnie, można go używać tylko w LocalScript .

Zobacz również:

Parametry

Przykład InputObject instancja, zawierający informacje o wejściu użytkownika.

gameProcessedEvent: bool

Wskazuje, czy silnik gry wewnętrznie obserwował ten wpis i działał na nim. Zazwyczaj odnosi się to do przetwarzania interfejsu użytkownika, więc jeśli przycisk został dotknięty lub kliknięty z tego wpisu, gameProcessedEvent będzie true . To samo dotyczy również wydarzeń wejścia połączonych za pośrednictwem


Przykłady kodu

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

Wydarzenie TouchPan włącza się, gdy użytkownik przeciągnie co najmniej jeden palec na TouchEnabled urządzenie.

Ten ewent może być używany do określenia czasu, w którym użytkownik przesuwa palcem po ekranie urządzenia TouchEnabled - tak, aby obrócić Camera w niestandardowym skrypcie kamery.

Poniżej snippet drukuje "Prędkość przesuwania dotyku" następna prędkość dotyku użytkownika, gdy użytkownik przesuwa palcą na ekranie.


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

Spójrz na inną użyteczną funkcję UserInputService tutaj UserInputService.TouchRotate .

Ten wążystać tylko się uruchomi, gdy okno klienta Roblox będzie skupione. Na przykład, wejścia nie zostaną złapane, gdy okno zostanie zminimalizowane.

Ponieważ ten wątek tylko działa lokalnie, można go używać tylko w LocalScript .

Zobacz również:

Parametry

touchPositions: Array

Materiały Vector2 , które określają położenie dotyków (na przykład palców) zaangażowanych w gest.

totalTranslation: Vector2

Rozmiar rękawiczki od początku do końca (w pikselach).

velocity: Vector2

Prędkość panierania (w pikselach) na sekundę.

The Enum.UserInputState of the gesture.

gameProcessedEvent: bool

Wskazuje, czy silnik gry wewnętrznie obserwował ten wpis i działał na nim. Zazwyczaj odnosi się to do przetwarzania interfejsu użytkownika, więc jeśli przycisk został dotknięty lub kliknięty z tego wpisu, gameProcessedEvent będzie true . To samo dotyczy również wydarzeń wejścia połączonych za pośrednictwem


Przykłady kodu

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

Wystrzelony, gdy użytkownik położy i poruszy dwa palce na ekranie urządzenieTouchEnabled .

Na instancjaponiższy kawałek kodu pokazuje, jak zmieniła się skala skalowania kamery od początku dotknięcia.


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

Aby sprawdzić, czy urządzenie użytkownika jest TouchEnabled, i że wydarzenia dotyczyące dotyku zostaną uruchomione, zobacz UserInputService.TouchEnabled .

Ten ewent zostanie wywołany tylko gdy okno klienta Roblox jest w centrum uwagi. Na przykład, wejścia nie zostaną złapane, gdy okno zostanie zminimalizowane. Ten ewent zostanie wywołany tylko lokalnie, może być używany tylko w LocalScript .

Zobacz również:

Parametry

touchPositions: Array

Materiały Vector2s, które określają pozycję ekranu, w pikselach, palców zaangażowanych w gest puknięcia.

scale: number

Magnitudo pęknięcia od początku do końca (w pikselach) dzielona przez pozycje pęknięcia początkowego.

velocity: number

Prędkość gestu pęknięcia (w pikselach) na sekundę.

The Enum.UserInputState of the gesture.

gameProcessedEvent: bool

Wskazuje, czy silnik gry wewnętrznie obserwował ten wpis i działał na nim. Zazwyczaj odnosi się to do przetwarzania interfejsu użytkownika, więc jeśli przycisk został dotknięty lub kliknięty z tego wpisu, gameProcessedEvent będzie true . To samo dotyczy również wydarzeń wejścia połączonych za pośrednictwem


Przykłady kodu

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

Wydarzenie TouchRotate aktywuje się, gdy użytkownik obraca dwa palce na urządzenieTouchEnabled .

Na przykład poniższy kod drukuje, ile kamera się obróciła od początku rotacji dotykowej.


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

Aby sprawdzić, czy urządzenie użytkownika jest TouchEnabled, i że wydarzenia dotyczyące dotyku zostaną uruchomione, zobacz UserInputService.TouchEnabled .

Ten wążystać tylko się uruchomi, gdy okno klienta Roblox będzie skupione. Na przykład, wejścia nie zostaną złapane, gdy okno zostanie zminimalizowane.

Ponieważ ten wątek tylko działa lokalnie, można go używać tylko w LocalScript .

Główny skrypt, który kontroluje kamerę użytkownika na urządzeniu mobilnym, używa kodu, który działa podobnie do tego wydarzenia. Najlepiej praktyką dla tego wydarzenia jest używanie go podczas tworzenia systemu kamer mobilnych, aby przeciwstawić się domyślnym kodom rdzenia.

Zobacz również:

Parametry

touchPositions: Array

Materiały Vector2s, które określają pozycje palców zaangażowanych w gest.

rotation: number

Liczba stopni, które gest obrócił od początku gestu.

velocity: number

Zmiana w obrotach (w stopniach) dzielona przez czas zmiany (w sekundach).

The Enum.UserInputState of the gesture.

gameProcessedEvent: bool

Wskazuje, czy silnik gry wewnętrznie obserwował ten wpis i działał na nim. Zazwyczaj odnosi się to do przetwarzania interfejsu użytkownika, więc jeśli przycisk został dotknięty lub kliknięty z tego wpisu, gameProcessedEvent będzie true . To samo dotyczy również wydarzeń wejścia połączonych za pośrednictwem


Przykłady kodu

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

Wydarzenie TouchStarted występuje, gdy użytkownik położy palcę na TouchEnabled urządzenie, zaczynając odpowiadać na dotyk z urządzenie.

Ten ewent może być używany do określenia, kiedy użytkownik zacznie dotykać ekranu swojego urządzenie. Można go połączyć z UserInputService.TouchEnded , aby określić, kiedy użytkownik zacznie i zakończy dotykanie ekranu.

Przedmiot obiektu dotykowego jest tym samym obiektem dotykowym przez całe życie dotyku. Więc porównanie InputObjects gdy są obiektami dotykowymi jest ważne, aby określić, czy jest to ten sam palec.

Aby sprawdzić, czy urządzenie użytkownika jest TouchEnabled, i że wydarzenia dotyczyące dotyku zostaną uruchomione, zobacz UserInputService.TouchEnabled .

Ten wążystać tylko się uruchomi, gdy okno klienta Roblox będzie skupione. Na przykład, wejścia nie zostaną złapane, gdy okno zostanie zminimalizowane.

Ponieważ ten wątek tylko działa lokalnie, można go używać tylko w LocalScript .

Zobacz również:

Parametry

Przykład InputObject instancja, zawierający informacje o wejściu użytkownika.

gameProcessedEvent: bool

Wskazuje, czy silnik gry wewnętrznie obserwował ten wpis i działał na nim. Zazwyczaj odnosi się to do przetwarzania interfejsu użytkownika, więc jeśli przycisk został dotknięty lub kliknięty z tego wpisu, gameProcessedEvent będzie true . To samo dotyczy również wydarzeń wejścia połączonych za pośrednictwem


Przykłady kodu

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

Wydarzenie TouchSwipe występuje, gdy użytkownik przesuwa palcem na urządzenieTouchEnabled .

Ten wątek można użyć do określenia, kiedy użytkownik przesuwa palcem na ekranie swojego urządzenia i kierunku, w którym przesuwa się użytkownik.

Dla bardziej precyzyjnej lokalizacji ruchu wejścia dotykowego użyj używając UserInputService.TouchMoved

Aby sprawdzić, czy urządzenie użytkownika jest TouchEnabled, i że wydarzenia dotyczyące dotyku zostaną uruchomione, zobacz UserInputService.TouchEnabled .

Ten wążystać tylko się uruchomi, gdy okno klienta Roblox będzie skupione. Na przykład, wejścia nie zostaną złapane, gdy okno zostanie zminimalizowane.

Ponieważ ten wątek tylko działa lokalnie, można go używać tylko w LocalScript .

Zobacz również:

Parametry

swipeDirection: Enum.SwipeDirection

Menu.SwipeDirection, pokazujące kierunek, w którym użytkownik przesunął się.

numberOfTouches: number

Liczba dotyków (takich jak palce) zaangażowanych w gest.

gameProcessedEvent: bool

Wskazuje, czy silnik gry wewnętrznie obserwował ten wpis i działał na nim. Zazwyczaj odnosi się to do przetwarzania interfejsu użytkownika, więc jeśli przycisk został dotknięty lub kliknięty z tego wpisu, gameProcessedEvent będzie true . To samo dotyczy również wydarzeń wejścia połączonych za pośrednictwem


Przykłady kodu

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

Wydarzenie TouchTap występuje, gdy użytkownik dotyka/ dotyka palca na ekranie na urządzenieTouchEnabled .

Ten ewent będzie się ściągać bez względu na to, czy użytkownik dotyka/ dotyka świata gry lub elementu GUI. Jeśli szukasz wydarzenia, które tylko się ściąga, gdy użytkownik dotyka/ dotyka świata gry, użyj UserInputService.TouchTapInWorld.

Aby sprawdzić, czy urządzenie użytkownika jest TouchEnabled, i że wydarzenia dotyczyące dotyku zostaną uruchomione, zobacz UserInputService.TouchEnabled .

Ten wążystać tylko się uruchomi, gdy okno klienta Roblox będzie skupione. Na przykład, wejścia nie zostaną złapane, gdy okno zostanie zminimalizowane.

Ponieważ ten wątek tylko działa lokalnie, można go używać tylko w LocalScript .

Parametry

touchPositions: Array

Materiały Vector2 , które określają położenie palców zaangażowanych w gest dotykania.

gameProcessedEvent: bool

Wskazuje, czy silnik gry wewnętrznie obserwował ten wpis i działał na nim. Zazwyczaj odnosi się to do przetwarzania interfejsu użytkownika, więc jeśli przycisk został dotknięty lub kliknięty z tego wpisu, gameProcessedEvent będzie true . To samo dotyczy również wydarzeń wejścia połączonych za pośrednictwem


Przykłady kodu

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

Wydarzenie TouchTapInWorld pojawia się, gdy użytkownik dotyka/ dotyka swojego palca na ekranie na urządzenieTouchEnabled. Jest ono uruchomione, gdy użytkownik dotyka w grze.

Ten ewent może być używany do określenia, kiedy użytkownik dotyka ekranu i nie dotyka elementu GUI. Jeśli użytkownik dotyka elementu GUI, UserInputService.TouchTap zostanie wywołany zamiast TouchTapInWorld.

Aby sprawdzić, czy urządzenie użytkownika jest TouchEnabled, i że wydarzenia dotyczyące dotyku zostaną uruchomione, zobacz UserInputService.TouchEnabled .

Ten wążystać tylko się uruchomi, gdy okno klienta Roblox będzie skupione. Na przykład, wejścia nie zostaną złapane, gdy okno zostanie zminimalizowane.

Ponieważ działa tylko lokalnie, można go używać tylko w LocalScript .

Zobacz również:

Parametry

position: Vector2

A Vector2 wskazujący na pozycję dotyku.

processedByUI: bool

Czy użytkownik kliknął element GUI.


Przykłady kodu

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

Wydarzenie UserInputService WindowFocusRelease zostanie uruchomione, gdy okno klienta Roblox traci fokus - zwykle, gdy okno klienta Roblox jest maksymalnie zminimalizowane przez użytkownika.

Na przykład kod poniżej wydrukuje „Window focus released” za każdym razem, gdy kliент Roblox traci fokus.


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

Ten ewent może być używany obok UserInputService.WindowFocused, aby śledzić, czy kliент Roblox jest aktywnie skupiony na ekranie użytkownika.

Ponieważ działa tylko lokalnie, można go używać tylko w LocalScript .


Przykłady kodu

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

Wydarzenie UserInputService WindowFocused uruchomione jest, gdy okno klienta Roblox zyska fokus - zwykle, gdy okno klienta Roblox jest maksymalnie otwarte na ekranie użytkownika.

Na przykład kod poniżej drukuje „Window focused” za każdym razem, gdy kliент Roblox zyskuje skupienie.


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

Ten wydarzenie można używać wraz z UserInputService.WindowFocusReleased , aby śledzić, czy kliент Roblox jest aktywnie skupiony na ekranie użytkownika.

Ponieważ ten wątek tylko działa lokalnie, można go używać tylko w LocalScript .


Przykłady kodu

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)