UserInputService
*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.
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
-- 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
Opisuje czy urządzenie użytkownika ma akcelerometr.
Opisuje czy urządzenie używane przez użytkownika ma dostępny gamepad.
Opisuje czy urządzenie użytkownika ma giroskop.
Opisuje czy urządzenie użytkownika ma dostępną klawiaturę.
Określa, czy można swobodnie poruszać myszką użytkownika lub czy jest zablokowana.
Skala wynik wyjścia użytkownika z Mouse .
Opisuje czy urządzenie użytkownika ma dostępny mysz.
ID treści używanej jako ikona myszy użytkownika.
Określa, czy ikona Mouse jest widoczna.
Określa pozycję klawiatury na ekranie.
Określa rozmiar klawiatury na ekranie.
Opisuje, czy klawiatura na ekranie jest obecnie widoczna na ekranie użytkownika.
Opisuje, czy urządzenie użytkownika ma dostępny ekran dotykowy.
Wskazuje, czy użytkownik używa wirtualnej rzeczywistości zestaw słuchawkowy.
Metody
Wyjaśnia, czy dany Enum.UserInputType gamepad wspiera przycisk odpowiadający danej Enum.KeyCode.
Zwraca Enum.UserInputType grypady, które są obecnie połączone.
Zwraca InputObject, które opisuje bieżące przyspieszenie urządzenie.
Zwraca InputObject opisujący obecny wektor grawitacji urządzenie.
Zwraca InputObject i CFrame, opisując obecny wkręt obrotowy urządzenie.
Zwraca obecnie TextBox na którym kliencie jest obecnie skupiony.
Powoduje, czy gra z podanym Enum.UserInputType "gamepadNum" jest połączona.
Zwraca InputObjects dla wszystkich dostępnych wskaźników w grze, reprezentując ostatni stan wejścia każdego wskaźnika.
Zwraca obraz dla wymaganego Enum.KeyCode .
Zwraca InputObjects związane z naciskiem keys
Zwraca Enum.UserInputType związany z najnowszym wejściem użytkownika.
Zwraca InputObjects arkusz, odpowiadający za obecnie przytrzymywane przyciski myszy.
Powoduje zmianę, w pikselach, pozycji gracza Mouse w ostatnim renderowanym klatce. Działa tylko wtedy, gdy myszka jest zablokowana.
Powoduje powrót do obecnej lokalizacji ekranu gracza Mouse w stosunku do górnego lewego kąta ekranu.
Zwraca gamepads z połączonym i włączonym dla nawigacji GUI w odwrotnej kolejności priorytetu.
Zwraca strunę reprezentującą klucz, który użytkownik powinien nacisnąć, aby wprowadzić dany Enum.KeyCode .
Zwraca KeyCodes, która jest matrycą popierającą grępad z podanym Enum.UserInputType .
Określa, czy na szczególnym gamepadzie naciśnięty jest określony przycisk.
Wyjaśnia, czy dany key jest obecnie zatrzymany.
Wyświetla, czy przycisk mouse button jest obecnie zatrzymany.
Wróщает prawdę, jeśli Enum.UserInputType danej grze można kontrolować za pomocą GUIs .
Odnosi CFrame VR-头set do bieżącej orientacji noszonego przez użytkownika VR-头set.
Ustawia, czy Gamepad navigator może być przesunięty.
Zdarzenia
Wystrzelony, gdy użytkownik porusza urządzenie, które ma akcelerometr. Używany do śledzenia ruchu urządzenia w świecie rzeczywistej w graRoblox.
Wystrzelony, gdy siła grawitacji zmienia się na urządzeniu, które ma włączony akcelerometr - takim jak urządzenie mobilne.
Wystrzelony, gdy użytkownik obraca urządzenie, które ma giroskop.
Wystrzela się, gdy konsola gier jest połączona z klientem. Przekazuje liczbę „gamepadNum” konsoli gier, która była połączona.
Wystrzela, gdy dostęp do gry z konsole zostanie odłączony od klienta. Przekazuje Enum.UserInputType z gry, która była odłączona.
Wystrzelony, gdy użytkownik zacznie interagować za pośrednictwem urządzenia interfejsu człowiek-komputer - takiego jak myszka lub gamepad.
Wystrzelony, gdy użytkownik zmienia sposób interakcji za pośrednictwem urządzenieinterfejsu człowiek-komputer.
Wystąpi, gdy użytkownik przestanie interagować za pośrednictwem urządzenieinterfejsu człowiek-komputer.
Wystąpi, gdy klient wysyłał prośbę o skok ich postaci.
Wystąpi, gdy zmieni się Enum.UserInputType klienta.
- PointerAction(wheel : number,pan : Vector2,pinch : number,gameProcessedEvent : bool):RBXScriptSignal
Występuje, gdy użytkownik wykonuje określoną akcję wskazującą (koło, pęknięcie, panełko).
Zainicjowano, gdy klient traci skupienie na TextBox .
Wystrzelony, gdy klient skupi się na TextBox .
Wystrzelony, gdy użytkownik uwolnił palcę z ekranu na urządzeniu Włączonej ekranu - takiego jak ekran urządzeniemobilnego.
- TouchLongPress(touchPositions : Array,state : Enum.UserInputState,gameProcessedEvent : bool):RBXScriptSignal
Wystrzelony, gdy użytkownik trzyma co najmniej jeden palec przez krótką ilość czasu na tej samej pozycji ekranu na urządzeniu TouchEnabled - takim jak ekran urządzeniemobilnego.
Wystrzelony, gdy użytkownik porusza palcem na urządzeniu Włączonej dotyku - takim jak ekran Apple iPad lub iPhone lub Google Android phone.
- TouchPan(touchPositions : Array,totalTranslation : Vector2,velocity : Vector2,state : Enum.UserInputState,gameProcessedEvent : bool):RBXScriptSignal
Wystrzelony, gdy użytkownik przeciągnie co najmniej jeden palec na TouchEnabled urządzeniu - takim jak ekran urządzeniemobilnego.
- TouchPinch(touchPositions : Array,scale : number,velocity : number,state : Enum.UserInputState,gameProcessedEvent : bool):RBXScriptSignal
Wystrzelony, gdy użytkownik dotyka palcami na TouchEnabled urządzeniu - takim jak ekran urządzeniemobilnego.
- TouchRotate(touchPositions : Array,rotation : number,velocity : number,state : Enum.UserInputState,gameProcessedEvent : bool):RBXScriptSignal
Wyst?puje, gdy u?ywaczka obejmuje dwa palce na TouchEnabled ur?dzeniu - takim jak ekran ur?dzenia urządzenie.
Wystrzelony, gdy użytkownik położył palcę na urządzeniu Włączone - takim jak ekran Apple iPad lub iPhone lub telefon Google Android.
- TouchSwipe(swipeDirection : Enum.SwipeDirection,numberOfTouches : number,gameProcessedEvent : bool):RBXScriptSignal
Wystrzelony, gdy użytkownik przesuwa palcem na urządzeniu TouchEnabled - takim jak ekran urządzeniemobilnego.
Wystrzelony, gdy użytkownik dotka palcem na TouchEnabled urządzeniu - takim jak ekran urządzeniemobilnego.
Wyst?puje, gdy u?yto? u?ytkownik na ?wiecie gry na TouchEnabled ur?dzeniu - takim jak ekran ur?dzenia urządzenie.
Wystrzela, gdy okno klienta Roblox traci fokus na ekranie użytkownika.
Wystrzela, gdy okno klienta Roblox zyska fokus na ekranie użytkownika.
Właściwości
AccelerometerEnabled
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.AccelerometerEnabledif accelerometerEnabled thenprint("Accelerometer enabled!")elseprint("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
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
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
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
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
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.GyroscopeEnabledif gyroIsEnabled thenprint("Gyroscope is enabled!")elseprint("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
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
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
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
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:
- Domyślny : Myszka porusza się swobodnie po ekranie użytkownika.
- LockCenter : Myszka jest zablokowana i nie może się poruszać z centrum ekranu użytkownika.
- 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
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
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
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
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
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 thenprint("The user's device has an available mouse!")elseprint("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
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
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
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
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
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
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
local UserInputService = game:GetService("UserInputService")
print(UserInputService.OnScreenKeyboardPosition)
OnScreenKeyboardSize
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
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
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 thenprint("The user's device has a touchscreen!")elseprint("The user's device does not have a touchscreen!")end
Zobacz również:
Przykłady kodu
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
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.VREnabledif isUsingVR thenprint("User is using a VR headset!")elseprint("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
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
The Enum.UserInputType of the gamepad.
Przycisk Enum.KeyCode z kodem kluczowym KeyCode.
Zwroty
Czy dany gamepad wspiera przycisk odpowiadający Enum.KeyCode .
Przykłady kodu
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
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
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
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:
- Właściwość Delta opisuje ilość rotacji, która ostatnio się wydarzyła
- CFrame jest obecną rotacją urządzeniew stosunku do jego domyślnej ramek referencyjnych.
Przykłady kodu
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
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
ENSEGMENT 2 z grą na pakcie w sprawie.
Zwroty
Czy gamepad związany z Enum.UserInputType jest połączony.
Przykłady kodu
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
Menu.UserInputType korespondujące z gamepadem w grze.
Zwroty
Materiały InputObjects reprezentujące aktualny stan wszystkich dostępnych wejść dla danej gry.
GetImageForKeyCode
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
ENSEGMENT.PLIK dla którego należy uzyskać związany obraz.
Zwroty
Zwrócony identyfikator zasobu obrazu.
Przykłady kodu
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
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
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>
Nazwa | Opis |
---|
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
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
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)
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
Przykłady kodu
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ż:
- UserInputService:SetNavigationGamepad() , aby włączyć lub wyłączyć gamepad dla nawigacji GUI
- UserInputService:IsNavigationGamepad() , aby sprawdzić, czy jest włączone sterowanie dla interfejsu użytkownika
- UserInputService:GetConnectedGamepads() , aby zwrócić wszystkie gamepady połączone bez względu na sterowanie interfejsem użytkownika
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.Parentlocal mapKey = Enum.KeyCode.MtextLabel.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 kluczowy | Wartość 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 kluczowy | Wartość 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.Parentlocal key = Enum.KeyCode.ButtonAlocal mappings = {ButtonA = "rbxasset://BUTTON_A_ASSET", -- Replace with the desired ButtonA assetButtonCross = "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 kluczowy | Wartość PlayStation | Wartość 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 kluczowy | Obraz | Identyfikator zasobu |
---|
Parametry
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
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
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.ButtonAlocal gamepad = Enum.UserInputType.Gamepad1local isButtonHeld = UserInputService:IsGamepadButtonDown(gamepad, button)
Ponieważ UserInputService jest tylko stroną klienta, ta funkcja może być używana tylko w LocalScript .
Zobacz również:
- UserInputService:IsKeyDown() - podobna metoda z innym użyciem: sprawdzić, czy dany key na keyboard jest naciśnięty.
Parametry
ENSEGMENT 2 z danej gry.
The Enum.KeyCode of the specified button.
Zwroty
Czy przycisk padu na podanych gamepadach jest naciskany.
Przykłady kodu
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ż:
- Enum.UserInputType.IsGamepadButtonDown - podobne wydarzenie z innym użyciem: Sprawdzić, czy dany button na gamepad jest naciskany.
Parametry
The Enum.KeyCode of the klucz.
Zwroty
Czy klucz podany jest w dół.
Przykłady kodu
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
The Enum.UserInputType of the mouse button.
Zwroty
Czy przycisk myszy jest obecnie zatrzymany.
Przykłady kodu
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) thenprint("Gamepad is a navigation gamepad!")elseprint("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
ENSEGMENT 2 z określonej gry.
Zwroty
Czy określony gamepad jest gamepadem do nawigacji.
RecenterUserHeadCFrame
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
Przykłady kodu
local UserInputService = game:GetService("UserInputService")
UserInputService:RecenterUserHeadCFrame()
SetNavigationGamepad
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
ENSEGMENT 2 z określonej gry.
Czy określona gryszka może poruszać nawigatorem GUI.
Zwroty
Przykłady kodu
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
Class.InputObject z UserInputType i Accelerometer , który pokazuje siłę grawitacji na każdym lokalnym urządzeniu osi.
Przykłady kodu
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
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
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
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
Class.InputObject dostarczający informacji o rotacji urządzenie. InputObject.Position reprezentuje nową rotację a Vector3 reprezentuje zmianę rotacji w pozycji 1> Datatype.Vector31> .
Przykłady kodu
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
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
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
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.
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
-- 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.
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
-- 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.
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
-- 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
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
A Enum.UserInputType wskazujący na ostatni wpisywaćwejścia.
Przykłady kodu
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
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
Przykłady kodu
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
Class.Toolbar, który uzyskał fokus.
Przykłady kodu
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.
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
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
The Enum.UserInputState of the gesture.
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
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.
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
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
Materiały Vector2 , które określają położenie dotyków (na przykład palców) zaangażowanych w gest.
Rozmiar rękawiczki od początku do końca (w pikselach).
Prędkość panierania (w pikselach) na sekundę.
The Enum.UserInputState of the gesture.
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
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
Materiały Vector2s, które określają pozycję ekranu, w pikselach, palców zaangażowanych w gest puknięcia.
Magnitudo pęknięcia od początku do końca (w pikselach) dzielona przez pozycje pęknięcia początkowego.
Prędkość gestu pęknięcia (w pikselach) na sekundę.
The Enum.UserInputState of the gesture.
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
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
Liczba stopni, które gest obrócił od początku gestu.
Zmiana w obrotach (w stopniach) dzielona przez czas zmiany (w sekundach).
The Enum.UserInputState of the gesture.
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
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.
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
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
Menu.SwipeDirection, pokazujące kierunek, w którym użytkownik przesunął się.
Liczba dotyków (takich jak palce) zaangażowanych w gest.
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
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
Materiały Vector2 , które określają położenie palców zaangażowanych w gest dotykania.
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
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
Czy użytkownik kliknął element GUI.
Przykłady kodu
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
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)
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
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)
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)