UserInputService

แสดงที่เลิกใช้งานแล้ว

*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่

ไม่สามารถสร้าง
บริการ
ไม่ซ้ำ

UserInputService เป็นบริการที่ใช้เพื่อตรวจจับและการจับกุมประเภทต่างๆของการป้อนข้อมูลที่มีอยู่ในอุปกรณ์ของผู้ใช้

วัตถุประสงค์หลักของบริการนี้คือเพื่อให้ประสบการณ์สามารถร่วมมือกับหลากหลายของตัวเลือกที่มีอยู่ เช่นเกมแพด หน้าจอแตะ และคีย์บอร์ด มันช่วยให้ LocalScript ทำงานต่

การใช้งานบางอย่างของบริการนี้รวมถึงการตรวจจับการป้อนข้อมูลของผู้ใช้เมื่อพวกเขาใช้งานกับ GUIs เครื่องมือ และอื่น ๆ

เนื่องจากบริการนี้เป็นบริการข้างเครื่องคอมพิวเตอร์เท่านั้นจึงจะทำงานได้เฉพาะเมื่อใช้ใน LocalScript หรือ ModuleScript ที่ต้องการโดย LocalScript

ดูเพิ่มเติมที่ ContextActionService บริการที่ช่วยให้คุณสามารถผูกฟังก์ชันไปยังหลายการป้อนของผู้ใช้

ตัวอย่างโค้ด

UserInputService

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

สรุป

คุณสมบัติ

  • อ่านอย่างเดียว
    ไม่ซ้ำ
    อ่านพร้อมๆ กัน

    อธิบายว่ามีเครื่องวัดความเร่งหรือไม่

  • อ่านอย่างเดียว
    ไม่ซ้ำ
    อ่านพร้อมๆ กัน

    อธิบายว่าอุปกรณ์ที่ใช้โดยผู้ใช้มี gamepad ที่มีอยู่หรือไม่

  • อ่านอย่างเดียว
    ไม่ซ้ำ
    อ่านพร้อมๆ กัน

    อธิบายว่ามีเครื่องวัดแรงโน้มถ่วงหรือไม่

  • อ่านอย่างเดียว
    ไม่ซ้ำ
    อ่านพร้อมๆ กัน

    อธิบายว่ามีเครื่องแป้นพิมพ์หรือไม่

  • อ่านพร้อมๆ กัน

    กำหนดว่าผู้ใช้สามารถเคลื่อนไหวเมาส์ได้อย่างอิสระหรือไม่ได้ล็อค

  • ไม่ซ้ำ
    อ่านพร้อมๆ กัน

    ปรับปรุงการออกมาของดีลตา (เปลี่ยนแปลง) ของผู้ใช้ Mouse

  • อ่านอย่างเดียว
    ไม่ซ้ำ
    อ่านพร้อมๆ กัน

    อธิบายว่ามีเครื่องมือเมาส์หรือไม่

  • MouseIcon:ContentId
    อ่านพร้อมๆ กัน

    รหัสเนื้อหาของรูปภาพที่ใช้เป็นไอคอนผู้ใช้

  • อ่านพร้อมๆ กัน

    กำหนดว่าไอคอน Mouse มองเห็นได้หรือไม่

  • อ่านอย่างเดียว
    ไม่ซ้ำ
    อ่านพร้อมๆ กัน

    กำหนดตำแหน่งของคีย์บอร์ดบนหน้าจอ

  • อ่านอย่างเดียว
    ไม่ซ้ำ
    อ่านพร้อมๆ กัน

    กำหนดขนาดของคีย์บอร์ดบนหน้าจอ

  • อ่านอย่างเดียว
    ไม่ซ้ำ
    อ่านพร้อมๆ กัน

    อธิบายว่าคีย์บอร์ดบนหน้าจอมีประสิทธิภาพหรือไม่

  • อ่านอย่างเดียว
    ไม่ซ้ำ
    อ่านพร้อมๆ กัน

    อธิบายว่ามีหน้าจอแสดงผลแบบสัมผัสหรือไม่

  • อ่านอย่างเดียว
    ไม่ซ้ำ
    อ่านพร้อมๆ กัน

    เฮดเซ็ท

วิธีการ

  • GamepadSupports(gamepadNum : Enum.UserInputType,gamepadKeyCode : Enum.KeyCode):bool

    กลับว่าว่า Enum.UserInputType รองเท้าเกมสนับสนุนปุ่มที่ตรงกับ Enum.KeyCode หรือไม่

  • กลับรายการ Enum.UserInputType ของเกมแพดพร้างที่เชื่อมต่ออยู่ในขณะนี้

  • กลับมาเป็น InputObject ที่อธิบายความเร่งปัจจุบันของอุปกรณ์

  • กลับมาที่ InputObject ที่อธิบายเวกเตอร์แรงโน้มถ่วงของอุปกรณ์

  • กลับมาที่ InputObject และ CFrame ซึ่งอธิบายเกี่ยวกับเวกเตอร์การหมุนปัจจุบันของอุปกรณ์

  • กลับไปที่ปัจจุบัน TextBox ที่ลูกค้ากำลังมุ่งเน้นอยู่

  • กลับว่าเกมพาดกับ Enum.UserInputType ''gamepadNum'' เชื่อมต่ออยู่หรือไม่

  • กลับรายการ InputObjects สำหรับทุกการป้อนข้อมูลที่มีอยู่ในแผงเกมที่ให้, การป้อนข้อมูลแต่ละครั้งจะแทนที่สถานะการป้อนข้อมูลสุดท้ายของแต่ละการป้อนข้อมูล

  • GetImageForKeyCode(keyCode : Enum.KeyCode):ContentId

    ส่งคืนภาพสำหรับ Enum.KeyCode ที่ร้องขอ

  • กลับรายการ InputObjects ที่เกี่ยวข้องกับ keys ที่กดลงในขณะนี้

  • กลับ Enum.UserInputType ที่เกี่ยวข้องกับการป้อนข้อมูลล่าสุดของผู้ใช้

  • กลับรายการ InputObjects ที่ตรงกับปุ่มเมาส์ที่กดไว้ในขณะนี้

  • กลับค่าเปลี่ยน, ในพิกเซล, ของตําแหน่งผู้เล่น's Mouse ในเฟรมเรนเดอร์ล่าสุด ทํางานได้เฉพาะถ้าเมาส์ถูกล็อค

  • กลับตำแหน่งหน้าจอปัจจุบันของผู้เล่น Mouse ที่อยู่ด้านบนซ้ายของหน้าจอ

  • กลับรายการ gamepads ที่เชื่อมต่อและเปิดใช้งานสำหรับการนำทาง GUI ในลำดับความสำคัญ

  • กลับสตริงที่แสดงให้เห็นเป็นกุญแจที่ผู้ใช้ควรกดเพื่อป้อน Enum.KeyCode ที่กำหนด

  • กลับรายการ KeyCodes ที่ gamepad ที่เกี่ยวข้องกับ keyCodes ที่ให้สนับสนุน Enum.UserInputType

  • กำหนดว่าปุ่มบางปุ่มจะถูกกดบนแพดพิงเกมบางแห่ง

  • กลับว่ามีการกด key ที่ให้ไว้หรือไม่

  • กลับว่าปุ่ม mouse button ที่ให้ไว้นั้นปัจจุบันยังคงถูกกดค้างหรือไม่

  • กลับ true หากเกมพาด Enum.UserInputType ที่กำหนดไว้สามารถควบคุมการนำทางได้

  • เรียบเรียง Datatype.CFrame ของหมวก VR ของผู้ใช้ให้เป็นตำแหน่งปัจจุบันของหมวก VR ที่สวมใส่โดยผู้ใช้

  • SetNavigationGamepad(gamepadEnum : Enum.UserInputType,enabled : bool):void

    ตั้งค่าว่า Gamepad นามสกุลผู้ใช้สามารถเคลื่อนย้ายผู้ใช้ได้หรือไม่ Errors: Error: Class.GuiObject|Gui Severity: major ---

อีเวนต์

  • เริ่มต้นเมื่อผู้ใช้ย้ายอุปกรณ์ที่มีเครื่องวัดความเร่ง ใช้เพื่อติดตามการเคลื่อนไหวของอุปกรณ์ในโลกแห่งความเป็นจริงภายในเกม Roblox

  • เกิดขึ้นเมื่อแรงโน้มถ่วงเปลี่ยนแปลงในอุปกรณ์ที่มีเครื่องวัดความเร่งที่เปิดใช้งาน - เช่นอุปกรณ์มือถือ

  • จะยิงเมื่อผู้ใช้หมุนได้อุปกรณ์ที่มีเครื่องวัดความเร่ง

  • เกิดขึ้นเมื่อ gamepad ถูกเชื่อมต่อกับเครื่องคอมพิวเตอร์ ส่งผ่าน "gamepadNum" ของ gamepad ที่เชื่อมต่อ

  • เกิดขึ้นเมื่อ gamepad ถูกขัดออกจากเครื่องคอมพิวเตอร์ ส่งผ่าน Enum.UserInputType ของ gamepad ที่ถูกขัดออก

  • InputBegan(input : InputObject,gameProcessedEvent : bool):RBXScriptSignal

    เกิดขึ้นเมื่อผู้ใช้เริ่มใช้งานผ่านอุปกรณ์ระหว่างมนุษย์และคอมพิวเตอร์ - เช่นเมาส์หรือเกมแพด

  • InputChanged(input : InputObject,gameProcessedEvent : bool):RBXScriptSignal

    จะได้รับการยิงเมื่อผู้ใช้เปลี่ยนวิธีการใช้งานผ่านอุปกรณ์ Human-Computer Interface

  • InputEnded(input : InputObject,gameProcessedEvent : bool):RBXScriptSignal

    จะเกิดขึ้นเมื่อผู้ใช้หยุดใช้งานผ่านอุปกรณ์สื่อกลางมนุษย์-คอมพิวเตอร์

  • เปิดให้บริการเมื่อลูกค้าทำคำขอให้กระโดดตัวละครของพวกเขา

  • เกิดขึ้นเมื่อ Enum.UserInputType ของลูกค้าเปลี่ยนแปลง

  • PointerAction(wheel : number,pan : Vector2,pinch : number,gameProcessedEvent : bool):RBXScriptSignal

    เกิดขึ้นเมื่อผู้ใช้ปฏิบัติการตรึงเฉพาะ (ล้อ, หมุน, หมุน)

  • ไฟร์เมื่อลูกค้าสูญเสียโฟกัสใน TextBox

  • จะได้รับการเรียกใช้เมื่อลูกค้ามุ่งเน้นไปที่ TextBox

  • TouchEnded(touch : InputObject,gameProcessedEvent : bool):RBXScriptSignal

    ปล่อยให้เมื่อผู้ใช้ปล่อยนิ้วของพวกเขาออกจากหน้าจอเมื่อใช้อุปกรณ์สัมผัส - เช่นหน้าจอของอุปกรณ์มือถือ

  • TouchLongPress(touchPositions : Array,state : Enum.UserInputState,gameProcessedEvent : bool):RBXScriptSignal

    จะได้รับการเรียกใช้เมื่อผู้ใช้ถือนิ้วหนึ่งอย่างน้อยหนึ่งนิ้วบนตำแหน่งหน้าจอเดียวกันบนอุปกรณ์สัมผัส - เช่นหน้าจอของอุปกรณ์มือถือ

  • TouchMoved(touch : InputObject,gameProcessedEvent : bool):RBXScriptSignal

    เกิดขึ้นเมื่อผู้ใช้ยกนิ้วของพวกเขาบนอุปกรณ์ที่เปิดใช้งานแสดงผล - เช่นหน้าจอของ Apple iPad หรือ iPhone หรือโทรศัพท์ Android Google

  • TouchPan(touchPositions : Array,totalTranslation : Vector2,velocity : Vector2,state : Enum.UserInputState,gameProcessedEvent : bool):RBXScriptSignal

    จะได้รับการเรียกใช้เมื่อผู้ใช้ดึงนิ้วหนึ่งหรือมากกว่าบนอุปกรณ์ TouchEnabled - เช่นหน้าจอของอุปกรณ์มือถือ

  • TouchPinch(touchPositions : Array,scale : number,velocity : number,state : Enum.UserInputState,gameProcessedEvent : bool):RBXScriptSignal

    จะได้รับการเรียกใช้เมื่อผู้ใช้กดนิ้วของพวกเขาบนอุปกรณ์ TouchEnabled เช่นหน้าจอของอุปกรณ์มือถือ

  • TouchRotate(touchPositions : Array,rotation : number,velocity : number,state : Enum.UserInputState,gameProcessedEvent : bool):RBXScriptSignal

    เกิดขึ้นเมื่อผู้ใช้หมุนสองนิ้วบนอุปกรณ์ TouchEnabled - เช่นหน้าจอของอุปกรณ์มือถือ

  • TouchStarted(touch : InputObject,gameProcessedEvent : bool):RBXScriptSignal

    จะได้รับการเปิดเมื่อผู้ใช้วางนิ้วของพวกเขาบนอุปกรณ์ที่เปิดใช้งาน - เช่นหน้าจอของ Apple iPad หรือ iPhone หรือโทรศัพท์ Android Google

  • TouchSwipe(swipeDirection : Enum.SwipeDirection,numberOfTouches : number,gameProcessedEvent : bool):RBXScriptSignal

    จะได้รับการเรียกใช้เมื่อผู้ใช้สแน็ปนิ้วของพวกเขาบนอุปกรณ์ TouchEnabled เช่นหน้าจอของอุปกรณ์มือถือ

  • TouchTap(touchPositions : Array,gameProcessedEvent : bool):RBXScriptSignal

    จะได้รับการเรียกใช้เมื่อผู้ใช้แตะนิ้วของพวกเขาบนอุปกรณ์ TouchEnabled เช่นหน้าจอของอุปกรณ์มือถือ

  • TouchTapInWorld(position : Vector2,processedByUI : bool):RBXScriptSignal

    เกิดขึ้นเมื่อผู้ใช้แตะโลกเกมบนอุปกรณ์ TouchEnabled - เช่นหน้าจอของอุปกรณ์มือถือ

  • เกิดขึ้นเมื่อหน้าต่างของลูกค้า Roblox สูญเสียโฟกัสไปยังหน้าจอของผู้ใช้

  • เปิดเมื่อหน้าต่างของลูกค้า Roblox ได้รับการโฟกัสบนหน้าจอของผู้ใช้

คุณสมบัติ

AccelerometerEnabled

อ่านอย่างเดียว
ไม่ซ้ำ
อ่านพร้อมๆ กัน

สมบัตินี้อธิบายว่ามีเครื่องวัดความเร่งหรือไม่

เครื่องวัดความเร่ง (เปลี่ยนแปลงในความเร็ว) เป็นส่วนประกอบที่พบในอุปกรณ์มือถือส่วนใหญ่ที่วัดความเร่ง (เปลี่ยนแปลงในความเร็ว)

ตัวอย่างรหัสต่อไปนี้แสดงให้เห็นวิธีการตรวจสอบว่าอุปกรณ์ของผู้ใช้มีเครื่องวัดความเร่งหรือไม่


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

หากอุปกรณ์มีเครื่องวัดความเร่งที่เปิดใช้งานได้ คุณสามารถรับความเร่งปัจจุบันของอุปกรณ์โดยใช้ฟังก์ชัน UserInputService:GetDeviceAcceleration() หรือติดตามเมื่อความเร่งของอุปกรณ์เ

เนื่องจาก UserInputService เป็นข้างล่างเท่านั้น, คุณสมบัตินี้สามารถใช้ได้ใน LocalScript เท่านั้น

ตัวอย่างโค้ด

Move a Ball using the Accelerometer

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

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

GamepadEnabled

อ่านอย่างเดียว
ไม่ซ้ำ
อ่านพร้อมๆ กัน

สมบัตินี้อธิบายว่ามีเกมแพดที่พร้อมใช้งานหรือไม่ หากมีเกมแพดที่พร้อมใช้งาน คุณสามารถใช้ UserInputService:GetConnectedGamepads() เพื่อดึงรายการเกมแพดที่เชื่อมต่อได้

เนื่องจาก UserInputService เป็นข้างล่างเท่านั้น, คุณสมบัตินี้สามารถใช้ได้ใน LocalScript เท่านั้น

ดูเพิ่มเติม:

ตัวอย่างโค้ด

How to Set the Active Gamepad for Input

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

GyroscopeEnabled

อ่านอย่างเดียว
ไม่ซ้ำ
อ่านพร้อมๆ กัน

คุณสมบัตินี้อธิบายว่ามีเครื่องวัดจุลภาคหรือไม่

เซ็นเซอร์กายโรสโกปี้เป็นส่วนประกอบที่พบในอุปกรณ์มือถือส่วนใหญ่ที่ตรวจจับการเปลี่ยนแปลงทางกายภาพและความเร็วในการหมุน

หากอุปกรณ์ของผู้ใช้มีเครื่องวัดความเร่ง คุณสามารถใช้งานในเกมของคุณโดยใช้ฟังก์ชัน UserInputService:GetDeviceRotation() และ UserInputService.DeviceRotationChanged เหตุการณ์


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

เนื่องจาก UserInputService เป็นข้างล่างเท่านั้น, คุณสมบัตินี้สามารถใช้ได้ใน LocalScript เท่านั้น

ตัวอย่างโค้ด

Create a Gyroscopic Camera

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

KeyboardEnabled

อ่านอย่างเดียว
ไม่ซ้ำ
อ่านพร้อมๆ กัน

คุณสมบัตินี้อธิบายว่ามีคีย์บอร์ดที่พร้อมใช้งานหรือไม่ คุณสมบัตินี้คือ true เมื่อมีคีย์บอร์ดที่พร้อมใช้งานแล้ว และ false เมื่อไม่มี

สามารถใช้เพื่อตรวจสอบว่าผู้ใช้มีคีย์บอร์ดที่พร้อมใช้งานหรือไม่ - ซึ่งอาจเป็นสิ่งสำคัญหากคุณต้องการตรวจสอบว่าคุณสามารถใช้ UserInputService:IsKeyDown() หรือ Class.UserInputService:GetKeysPressed()</

เนื่องจาก UserInputService เป็นข้างล่างเท่านั้น, คุณสมบัตินี้สามารถใช้ได้ใน LocalScript เท่านั้น

ตัวอย่างโค้ด

Check if Keyboard is Enabled

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

MouseBehavior

อ่านพร้อมๆ กัน

คุณสมบัตินี้กำหนดวิธีการที่เมาส์ของผู้ใช้เป็นไปตาม Enum.MouseBehavior ณะ. ค่าเริ่มต้นคือ Enum.MouseBehavior.Default

สามารถตั้งค่าได้สามค่า:

  1. ค่าเริ่มต้น : เมาส์เคลื่อนที่ได้อย่างอิสระรอบหน้าจอของผู้ใช้
  2. ล็อคเซ็นเตอร์ : เมาส์ถูกล็อคไว้ และไม่สามารถเคลื่อนที่ได้ จากศูนย์กลางของหน้าจอผู้ใช้
  3. ล็อคตำแหน่งปัจจุบัน : เมาส์ล็อคอยู่ และไม่สามารถเคลื่อนได้ ตำแหน่งปัจจุบันของผู้ใช้บนหน้าจอในเวลาล็อค

ค่านี้ไม่ส่งผลต่อความไวของเหตุการณ์ติดตามการเคลื่อนไหวของเมาส์ ตัวอย่างเช่น GetMouseDelta ส่งค่า Vector2 ที่เหมือนกั

คุณสมบัตินี้จะถูกเปลี่ยนแปลงหาก GuiButton ที่มี Modal เปิดอยู่ คือ GuiButton.Visible ยกเว้นปุ่มเมาส์ขวาของผู้เล่นไม่ได้ปิด

หมายเหตุว่าหากเมาส์ถูกล็อค UserInputService.InputChanged เกม

เนื่องจาก UserInputService เป็นข้างล่างเท่านั้น, คุณสมบัตินี้สามารถใช้ได้ใน LocalScript เท่านั้น

ตัวอย่างโค้ด

Create a Binoculars Script

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

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

MouseDeltaSensitivity

ไม่ซ้ำ
อ่านพร้อมๆ กัน

คุณสมบัตินี้กำหนดความไวของผู้ใช้ Mouse

ความไวส่งผลกับระดับที่สมบูรณ์แบบที่การเคลื่อนไหวของเมาส์ทางกายสามารถแปลเป็นการเคลื่อนไหวของเมาส์ในเกม ความไวนี้สามารถปรับได้โดยใช้เครื่องมือติดตามการเคลื่อนไหวของเ

สิ่งนี้ไม่ส่งผลต่อการเคลื่อนไหวของไอคอนเมาส์ นอกจากนี้ยังไม่ส่งผลต่อการตั้งค่า ความไวของกล้อง ที่พบในแท็บ การตั้งค่า ของเมนู การตั้งค่า ของลูกค้า

ค่านี้มีมูลค่าสูงสุด 10 และมีมูลค่าต่ำสุด 0 ค่านี้เทียบเคียงกับความไวต่ำและค่านี้สูงขึ้น สำหรับความไวสูง

เมื่อความไวเป็น 0 เหตุการณ์ที่ติดตามการเคลื่อนไหวของเมาส์จะยังคงไฟ แต่ค่าปรับและโปรไฟล์ที่แสดงถึงการเป

ตัวอย่างโค้ด

Create a Binoculars Script

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

MouseEnabled

อ่านอย่างเดียว
ไม่ซ้ำ
อ่านพร้อมๆ กัน

คุณสมบัตินี้อธิบายว่ามีเมาส์ที่พร้อมให้ใช้บนอุปกรณ์ของผู้ใช้หรือไม่ คุณสมบัตินี้จะเป็น true เมื่ออุปกรณ์ของผู้ใช้มีเมาส์ที่พร้อมใช้งาน และ false เมื่อมันไม่


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

มีความสำคัญที่จะตรวจสอบสิ่งนี้ก่อนที่จะใช้งาน UserInputService หน้าเมาส์เช่น UserInputService:GetMouseLocation()

เนื่องจาก UserInputService เป็นข้างล่างเท่านั้น, คุณสมบัตินี้สามารถใช้ได้ใน LocalScript เท่านั้น

ดูเพิ่มเติม:

ตัวอย่างโค้ด

Create a Binoculars Script

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

MouseIcon

ContentId
อ่านพร้อมๆ กัน

สมบัติ ไอคอนเมาส์ ระบุไอเมจที่ใช้เป็นตัวชี้ หากว่างเปล่าจะใช้ลูกศรเริ่มต้น โดยปกติจะใช้ลูกศรเริ่มต้นเป็น Class

เพื่อซ่อนตัวเลือกทั้งหมด อย่าใช้ ไม่ใช้ รูปภาพโปร่งใส. แทนที่, ตั้งค่า UserInputService.MouseIconEnabled เป็น false

ตัวอย่างโค้ด

UserInputService.MouseIcon

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

MouseIconEnabled

อ่านพร้อมๆ กัน

สมบัตินี้กำหนดว่ามีข้อมูล Mouse ไอคอนมอเตอร์เมาส์มองเห็นได้เมื่อ true ไอคอนมอเตอร์เมาส์มองเห็นได้เมื่อ false ไม่มี

เช่นเดียวกับตัวอย่างโค้ดด้านล่าง ซึ่งซ่อนไอคอนของเมาส์


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

เนื่องจาก UserInputService เป็นข้างล่างเท่านั้น, คุณสมบัตินี้สามารถใช้ได้ใน LocalScript เท่านั้น

ตัวอย่างโค้ด

Hide Mouse During Keyboard Input

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

OnScreenKeyboardPosition

อ่านอย่างเดียว
ไม่ซ้ำ
อ่านพร้อมๆ กัน

สมบัตินี้อธิบายตำแหน่งของคีย์บอร์ดบนหน้าจอในพิกเซล ตำแหน่งของคีย์บอร์ดคือ Vector2.new(0, 0) เมื่อมันไม่มองเห็นได้

เนื่องจาก UserInputService เป็นเฉพาะด้านลูกค้าเท่านั้น คุณสมบัตินี้สามารถใช้ได้ใน LocalScript หรือ Script ที่มี 1> Class.BaseScript.RunContext|RunContext

ดูเพิ่มเติม OnScreenKeyboardVisible และ OnScreenKeyboardSize

ตัวอย่างโค้ด

UserInputService.OnScreenKeyboardPosition

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

OnScreenKeyboardSize

อ่านอย่างเดียว
ไม่ซ้ำ
อ่านพร้อมๆ กัน

สมบัตินี้อธิบายขนาดของคีย์บอร์ดบนหน้าจอในพิกเซล ขนาดของคีย์บอร์ดคือ Vector2.new(0, 0) เมื่อมันไม่มองเห็นได้

เนื่องจาก UserInputService เป็นเฉพาะด้านลูกค้าเท่านั้น คุณสมบัตินี้สามารถใช้ได้ใน LocalScript หรือ Script ที่มี 1> Class.BaseScript.RunContext|RunContext

ดูเพิ่มเติม OnScreenKeyboardVisible และ OnScreenKeyboardPosition

OnScreenKeyboardVisible

อ่านอย่างเดียว
ไม่ซ้ำ
อ่านพร้อมๆ กัน

คุณสมบัตินี้อธิบายว่ามีเป็นปุ่มคีย์บอร์ดบนหน้าจอหรือไม่

เนื่องจาก UserInputService เป็นเฉพาะด้านลูกค้าเท่านั้น คุณสมบัตินี้สามารถใช้ได้ใน LocalScript หรือ Script ที่มี 1> Class.BaseScript.RunContext|RunContext

ดูเพิ่มเติม OnScreenKeyboardSize และ OnScreenKeyboardPosition

TouchEnabled

อ่านอย่างเดียว
ไม่ซ้ำ
อ่านพร้อมๆ กัน

สมบัตินี้อธิบายว่ามีหน้าจอแสดงผลแบบสัมผัสหรือไม่

สมบัติสมุดใช้เพื่อกำหนดว่าอุปกรณ์ของผู้ใช้มีหน้าจอสัมผัสหรือไม่ และดังนั้นจึงกำหนดว่าเหตุการณ์สัมผัสจะเกิดขึ้นหรือไม่ หาก TouchEnabled เป็นจริง คุณส

ส่วนของโค้ดด้านล่างพิมพ์ว่ามีหน้าจอสัมผัสหรือไม่


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

ดูเพิ่มเติม:

ตัวอย่างโค้ด

Create a Custom CameraScript

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

VREnabled

อ่านอย่างเดียว
ไม่ซ้ำ
อ่านพร้อมๆ กัน

สมบัตินี้อธิบายว่าผู้ใช้กำลังใช้อุปกรณ์เสมือนความเป็นจริง (VR)

หากเปิดใช้งานอุปกรณ์ VR คุณสามารถใช้งานได้ผ่านตำแหน่งและการเคลื่อนที่ของมันผ่านผ่านระบบต่างๆเช่น UserInputService:GetUserCFrame() คุณยังสามารถตอบกลับการเคลื่อนที่ของอุปกรณ์


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

เนื่องจาก UserInputService เป็นข้างล่างเท่านั้น, คุณสมบัตินี้สามารถใช้ได้ใน LocalScript เท่านั้น

ดูเพิ่มเติม:

ตัวอย่างโค้ด

VR Head Tracking

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

วิธีการ

GamepadSupports

ฟังก์ชันนี้กลับว่าเกมพาด Enum.UserInputType ที่ให้นั้นรองรับปุ่มที่ตรงกับปุ่มที่ให้ Enum.KeyCode ด้วย ฟังก์ชันนี้ใช้เพื่อกำหนดการป้อนเกมพาดที่ถูกต้อง

เพื่อระบุว่า Enum.UserInputType แพดพิงเกมอะไรเชื่อมต่ออยู่ ใช้ UserInputService:GetConnectedGamepads()

เนื่องจาก UserInputService เป็นข้างล่างเท่านั้น, ฟังก์ชันนี้สามารถใช้ได้ใน LocalScript เท่านั้น

ดูเพิ่มเติม:

พารามิเตอร์

gamepadNum: Enum.UserInputType

The Enum.UserInputType ของ gamepad

gamepadKeyCode: Enum.KeyCode

The Enum.KeyCode ของปุ่มในคำถาม


ส่งค่ากลับ

ว่า gamepad ที่ให้สนับสนุนปุ่มที่ตรงกับ Enum.KeyCode หรือไม่

ตัวอย่างโค้ด

Binding Functions to Gamepad Controls

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

GetConnectedGamepads

ฟังก์ชันนี้จะสร้างรายการของ Enum.UserInputType เกมแพดที่เชื่อมต่ออยู่ หากไม่มีเกมแพดที่เชื่อมต่ออยู่ รายการนี้จะเป็นโมฆะ นอกจากนี้ยังเฉพาะเวลาเท่านั้น สำหรับตัว

ตัวอย่างโค้ดต่อไปนี้สามารถดึงแผงเกมที่เชื่อมต่อและเก็บไว้ในแปรที่มีชื่อว่า connectedGamepads


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

เพื่อตรวจสอบว่าเกมแพดที่เฉพาะเชื่อมต่อหรือไม่ใช้ UserInputService:GetGamepadConnected()

เนื่องจาก UserInputService เป็นข้างล่างเท่านั้น, ฟังก์ชันนี้สามารถใช้ได้ใน LocalScript เท่านั้น

ดูเพิ่มเติม:


ส่งค่ากลับ

Entity.UserInputType|UserInputTypes รายการที่ตรงกับแพดพิงเกมที่เชื่อมต่อกับอุปกรณ์ของผู้ใช้

ตัวอย่างโค้ด

How to Set the Active Gamepad for Input

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

GetDeviceAcceleration

ฟังก์ชัน GetDeviceAcceleration จะกำหนดความเร่งปัจจุบันของอุปกรณ์ของผู้ใช้ มันจะกลับมาเป็น InputObject ที่อธิบายความเร่งปัจจุบันของอุปกรณ์

เพื่อให้สิ่งนี้ทำงานได้ อุปกรณ์ของผู้ใช้ต้องมีเครื่องวัดความเร่งที่เปิดใช้งาน เพื่อตรวจสอบว่าอุปกรณ์ของผู้ใช้มีเครื่องวัดความเร่งที่เปิดใช้งานหรือไม่ คุณสามารถตรวจสอบสถานะ <

หากคุณต้องการติดตามเมื่ออุปกรณ์ของผู้ใช้เปลี่ยนแปลงเร่งในทางกลับกันคุณสามารถใช้เหตุการณ์ UserInputService.DeviceAccelerationChanged ได้

เนื่องจากมันเฉพาะกับพื้นที่โค้งของตัวเองเท่านั้น จึงสามารถใช้ได้ใน LocalScript เท่านั้น


ส่งค่ากลับ

ตัวอย่างโค้ด

Print Device Acceleration

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

GetDeviceGravity

ฟังก์ชันนี้กลับมาเป็น InputObject ที่อธิบายว่าเป็นเวกเตอร์แรงโน้มถ่วงของอุปกรณ์

เวกเตอร์แรงโน้มถ่วงจะถูกกำหนดโดยตำแหน่งที่อยู่ของอุปกรณ์เมื่อเป็นสัดส่วนกับความเป็นจริงของแรงโน้มถ่ว

ฟังก์ชันนี้อาจใช้เพื่อเปิดให้ใช้อุปกรณ์ของผู้ใช้เพื่อกระทําหรือควบคุมแรงโน้มถ่วงในเกมหรือย้ายวัตถุในเกมเช่นลูกบอล

แรงโน้มถ่วงจะถูกติดตามเฉพาะสำหรับผู้เล่นที่ใช้อุปกรณ์ที่มีเครื่องวัดแรงโน้มถ่วง - เช่นอุปกรณ์มือถือ

เพื่อตรวจสอบว่าอุปกรณ์ของผู้ใช้มีเครื่องวัดแรงโน้มถ่วงที่เปิดใช้งานหรือไม่ ตรวจสอบค่าของ UserInputService.GyroscopeEnabled หากอุปกรณ์มีเครื่องวัดแรงโน้มถ่วง

เนื่องจาก UserInputService เป็นข้างล่างเท่านั้น, ฟังก์ชันนี้สามารถใช้ได้ใน LocalScript เท่านั้น


ส่งค่ากลับ

ตัวอย่างโค้ด

Moving Objects with the Gyroscope

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

GetDeviceRotation

ฟังก์ชันนี้กลับมาเป็น InputObject และ CFrame ที่อธิบายวิธีการหมุนของอุปกรณ์

นี้จะเริ่มด้วย inputObject สมบัติของคุณคือ Position สมบัติของคุณคือ Enum.InputType.Gyroscope ที่ติดตามการหมุนทั้งหมดในแกนทุกเครื่องในทุกเครื่องในทุกเครื่องในทุกเครื่อง

การหมุนเครื่องมือเฉพาะเครื่องมือเท่านั้นที่สามารถติดตามได้บนอุปกรณ์ที่มี gyroscope

เนื่องจากสิ่งนี้จะเรียกในท้องถิ่น, มันสามารถใช้ได้ใน LocalScript เท่านั้น


ส่งค่ากลับ

ตัวแปรที่มีสองค่า:

  1. ค่าดีลตาร์ระบุจำนวนการหมุนที่เกิดขึ้นครั้งสุดท้าย
  2. CFrame คือการหมุนของอุปกรณ์ที่เกี่ยวข้องกับเฟรมอ้างอิงเริ่มต้นของมัน

ตัวอย่างโค้ด

Print Device Rotation

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

GetFocusedTextBox

ฟังก์ชันนี้จะส่งคืน TextBox ที่เป็นเรื่องโฟกัสของลูกค้า กล่องข้อความสามารถเลือกโดยผู้ใช้ได้หรือการเลือกสามารถถูกบังคับโดยใช้การใช้งาน TextBox:CaptureFocus()

เนื่องจาก UserInputService เป็นข้างล่างเท่านั้น, ฟังก์ชันนี้สามารถใช้ได้ใน LocalScript เท่านั้น

ดูเพิ่มเติม:


ส่งค่ากลับ

ตัวอย่างโค้ด

Ignore User Input When a TextBox Is Focused

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

GetGamepadConnected

ฟังก์ชันนี้กลับว่าเกมพาดกับ Enum.UserInputType ที่ให้ไว้เชื่อมต่อกับเครื่องคอมพิวเตอร์หรือไม่

นี่สามารถใช้เพื่อตรวจสอบว่า Gamepad1 เชื่อมต่อกับอุปกรณ์ของลูกค้าหรือไม่

เพื่อดึงรายการของแพดพิงทั้งหมดที่เชื่อมต่อได้ใช้ UserInputService:GetConnectedGamepads()

เนื่องจาก UserInputService เป็นข้างล่างเท่านั้น, ฟังก์ชันนี้สามารถใช้ได้ใน LocalScript เท่านั้น

ดูเพิ่มเติม:

พารามิเตอร์

gamepadNum: Enum.UserInputType

The Enum.UserInputType ของ gamepad ในคำถาม


ส่งค่ากลับ

ว่าเกมพาดพนับที่เกี่ยวข้องกับ Enum.UserInputType เชื่อมต่อหรือไม่

ตัวอย่างโค้ด

Check Whether a Gamepad is Connected

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

GetGamepadState

ฟังก์ชันนี้กลับรายการ InputObjects สำหรับทุกการป้อนข้อมูลที่มีอยู่ในเกมพาด Enum.UserInputType ที่ให้บริการรวมทั้งสถานะการป้อนข้อมูลแต่ละรายการ

เพื่อค้นหา UserInputTypes ของแพดพันธ์เกมที่เชื่อมต่อ, ใช้ UserInputService:GetConnectedGamepads()

เนื่องจากคุณสมบัตินี้เฉพาะกับเซิร์ฟเวอร์เท่านั้น จึงสามารถใช้ได้ใน LocalScript เท่านั้น

ดูเพิ่มเติม:

พารามิเตอร์

gamepadNum: Enum.UserInputType

Entity.UserInputType ที่ตรงกับเกมพาดในขณะนี้


ส่งค่ากลับ

Class.InputObject|InputObjects รายการที่แทนที่สถานะปัจจุบันของการป้อนข้อมูลทั้งหมดสำหรับแผ่น gamepad ที่ให้

GetImageForKeyCode

ContentId

วิธีนี้ใช้ Enum.KeyCode ที่ร้องขอและสร้างภาพที่เกี่ยวข้องสำหรับเครื่องประกบที่เชื่อมต่ออยู่ (จำกัดไว้ที่ Xbox, PlayStation และ Windows) หาก

พารามิเตอร์

keyCode: Enum.KeyCode

KeyCode สำหรับการดึงภาพที่เกี่ยวข้อง


ส่งค่ากลับ

ContentId

รหัสสินทรัพย์ภาพที่กลับมา

ตัวอย่างโค้ด

UserInputService - Get Image For KeyCode

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

GetKeysPressed

ฟังก์ชันนี้กลับรายการ InputObjects ที่เกี่ยวข้องกับกุญแจที่กดลงในขณะนี้

ตัวแปรนี้สามารถเรียกผ่านได้เพื่อระบุว่ามีการกดปุ่มอันใดอยู่ในขณะนี้โดยใช้ค่า InputObject.KeyCode

เพื่อตรวจสอบว่ามีการกดปุ่มที่เฉพาะเจาะจงหรือไม่ใช้ UserInputService:IsKeyDown()

เนื่องจาก UserInputService เป็นข้างล่างเท่านั้น, ฟังก์ชันนี้สามารถใช้ได้ใน LocalScript เท่านั้น


ส่งค่ากลับ

Class.InputObject|InputObjects รายการที่เกี่ยวข้องกับกุญแจที่กดอยู่ในขณะนี้

ตัวอย่างโค้ด

Double Jump Key Combo

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

GetLastInputType

ฟังก์ชันนี้กลับ 'Enum.UserInputType' ที่เกี่ยวข้องกับการป้อนของผู้ใช้ล่าสุด

เช่น หากการป้อนข้อมูลก่อนหน้าของผู้ใช้มีการกดปุ่ม Enum.UserInputType จะกลับมาเป็น Keyboard

กิจกรรม UserInputService.LastInputTypeChanged สามารถใช้เพื่อติดตามเมื่อ Enum.UserInputType ล่าสุดที่ใช้โดยผู้ใช้เปลี่ยนแปลง

เนื่องจาก UserInputService เป็นข้างล่างเท่านั้น, ฟังก์ชันนี้สามารถใช้ได้ใน LocalScript เท่านั้น


ส่งค่ากลับ

Menu.UserInputType ที่เกี่ยวข้องกับการป้อนข้อมูลล่าสุดของผู้ใช้

ตัวอย่างโค้ด

UserInputService:GetLastInputType

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

GetMouseButtonsPressed

ฟังก์ชันนี้กลับรายการ InputObjects ที่ตรงกับปุ่มเมาส์ที่กดลงในขณะนี้

ปุ่มเมาส์ที่ติดตามโดยหน้าฟังก์ชันนี้รวมถึง:


<tr>
<td>ปุ่มเมาส์1</td>
<td>ปุ่มเมาส์ซ้าย</td>
</tr>
<tr>
<td>ปุ่มเมาส์ 2</td>
<td>ปุ่มเมาส์ขวา</td>
</tr>
<tr>
<td>ปุ่มเมาส์3</td>
<td>ปุ่มเมาส์กลาง</td>
</tr>
ชื่อคำอธิบาย

หากผู้ใช้ไม่กดปุ่มเมาส์ใด ๆ เมื่อโค้ดได้รับการเรียกใช้ มันจะกลับมาเป็นรายการที่ว่างเปล่า

เนื่องจาก UserInputService เป็นข้างล่างเท่านั้น, ฟังก์ชันนี้สามารถใช้ได้ใน LocalScript เท่านั้น


ส่งค่ากลับ

Class.InputObject|InputObjects รายการที่เกี่ยวข้องกับปุ่มเมาส์ที่กดไว้ในขณะนี้

ตัวอย่างโค้ด

Check which MouseButtons are Pressed

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

GetMouseDelta

ฟังก์ชันนี้กลับค่าเปลี่ยน, ในพิกเซล, ของตำแหน่งของผู้เล่น's Mouse ในเฟรมเรนเดอร์ล่าสุดเป็น Vector2 ตัวนี้

ความไวของเมาส์ซึ่งกำหนดไว้ในการตั้งค่าของลูกค้าและ UserInputService.MouseDeltaSensitivity ผลการค้นหา

เนื่องจาก UserInputService เป็นข้างล่างเท่านั้น, ฟังก์ชันนี้สามารถใช้ได้ใน LocalScript เท่านั้น


ส่งค่ากลับ

เปลี่ยนแปลงการเคลื่อนที่ของเมาส์

ตัวอย่างโค้ด

Getting Mouse Delta

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

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

GetMouseLocation

ฟังก์ชันนี้กลับมาเป็น Vector2 ที่แทนที่ตำแหน่งหน้าจอปัจจุบันของผู้เล่น Mouse ในพิกเซลสัมพันธ์กับมุมด้านบนซ้าย

หากตำแหน่งของเมาส์เป็น offscreen หรืออุปกรณ์ของผู้เล่นไม่มีเมาส์ ผลที่กลับมาจะไม่ได้รับการกำหนด

เนื่องจาก UserInputService เป็นข้างล่างเท่านั้น, ฟังก์ชันนี้สามารถใช้ได้ใน LocalScript เท่านั้น


ส่งค่ากลับ

A Vector2 ที่แทนที่ตำแหน่งหน้าจอปัจจุบันของเมาส์ในพิกเซล

ตัวอย่างโค้ด

Move GUI To Mouse Location

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

GetNavigationGamepads

ฟังก์ชันนี้กลับรายการของ gamepad ที่เชื่อมต่อและเปิดใช้งานสำหรับการนำทาง GUI UserInputTypes ที่มีการเชื่อมต่อและเปิดใช้งานสำหรับการนำทาง GUI ตามลำดับความสำคัญ ซึ่งหมายความว่า

ว่าจะเป็นเกมแพดที่เชื่อมต่อหรือไม่เป็นเกมแพดที่ควบคุม GUI การนำทางเท่านั้น นี่ไม่ส่งผลต่อการควบคุมการนำทาง

เนื่องจาก UserInputService เป็นข้างล่างเท่านั้น, ฟังก์ชันนี้สามารถใช้ได้ใน LocalScript เท่านั้น

ดูเพิ่มเติม:

  • UserInputService:SetNavigationGamepad() เพื่อเปิดหรือปิด gamepad สำหรับการนำทาง GUI
  • UserInputService:IsNavigationGamepad() เพื่อตรวจสอบว่ามีการเปิดใช้งาน gamepad สำหรับการนำทาง GUI หรือไม่
  • UserInputService:GetConnectedGamepads() เพื่อส่งคืนเกมแพดทั้งหมดที่เชื่อมต่อกัน ไม่ว่าจะเป็นการควบคุมการนำทางผ่าน GUI หรือไม่

ส่งค่ากลับ

Entity.UserInputType|UserInputTypes ที่เป็นรายการที่สามารถใช้สำหรับการนำทาง GUI ในลำดับความสำคัญที่ลดลง

GetStringForKeyCode

GetStringForKeyCode กลับสตริงที่แสดงถึงกุญแจที่ผู้ใช้ควรกดเพื่อป้อน Enum.KeyCode โดยเก็บความเป็นไปของการเลี้ยงกุญแจ สำหรับรหัสกุญแจที่ต้องการบางผู้ปรับแต่ง

เมื่อใช้ Roblox ด้วยการจัดเค้าโครง QWERTY ที่ไม่ใช่ตัวอักษร Q


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

ตัวอย่างบน QWERTY Keyboard


<tbody>
<tr>
<td><code>Enum.KeyCode.Q</code></td>
<td><code>Q</code></td>
</tr>
<tr>
<td><code>คําสั่งกุญแจ.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>เรียกค่า KeyCode ที่</code></td>
<td><code>2</code> เพราะ <code>@</code> ถูกพิมพ์ด้วย <kbd>Shift</kbd><kbd>2</kbd></td>
</tr>
</tbody>
รหัสสําคัญกลับค่า

ตัวอย่างบน AZERTY Keyboard


<tbody>
<tr>
<td><code>Enum.KeyCode.Q</code></td>
<td><code>A ตัวอักษร</code></td>
</tr>
<tr>
<td><code>คําสั่งกุญแจ.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>เรียกค่า KeyCode ที่</code></td>
<td><code>É</code></td>
</tr>
</tbody>
รหัสสําคัญกลับค่า

การใช้ Gamepad

GetStringForKeyCode() ส่งค่าตัวอักษรสำหรับ Enum.KeyCode สำหรับ gamepad ที่เชื่อมต่อเกมสุดท้าย หากคอนโทรลเลอร์ไม่รองรับ ฟังก์ชันจะแปลงค่าตัวอักษรเป็นค่าเริ่มต้นสำหร

ตัวอย่างต่อไปนี้แสดงให้เห็นวิธีการที่คุณสามารถแมพปุ่มที่กําหนดเองสําหรับ ButtonA :


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

การตั้งค่า Gamepad

รหัสเครื่องหมายทิศทางไม่มีความแตกต่างใด ๆ ขึ้นอยู่กับอุปกรณ์ Enum.KeyCode.ButtonSelect มีพฤติกรรมที่แตกต่างกันเล็กน้อยในบางกรณี ใช้ทั้งหมด PlayStation มาพิมพ์เพื่อให้แน่ใจว่าผู้ใช้เห็นปุ่มที่ถู


<tbody>
<tr>
<td><code>เมนู.KeyCode.ButtonA</code></td>
<td><code>ปุ่มCross</code></td>
<td><code>ปุ่ม A</code></td>
</tr>
<tr>
<td><code>เมนู.KeyCode.ButtonB</code></td>
<td><code>วงกลมปุ่ม</code></td>
<td><code>ปุ่ม B</code></td>
</tr>
<tr>
<td><code>เมนู.KeyCode.ButtonX</code></td>
<td><code>การแสดงผลปุ่มสี่เหลี่ยม</code></td>
<td><code>ปุ่ม X</code></td>
</tr>
<tr>
<td><code>เมนู.KeyCode.ButtonY</code></td>
<td><code>ปุ่มสามเหลี่ยม</code></td>
<td><code>ปุ่ม Y</code></td>
</tr>
<tr>
<td><code>เมนู.KeyCode.ButtonL1</code></td>
<td><code>ปุ่ม L1</code></td>
<td><code>ปุ่มLB</code></td>
</tr>
<tr>
<td><code>เมนู.KeyCode.ButtonL2</code></td>
<td><code>ปุ่ม L2</code></td>
<td><code>ปุ่มLT</code></td>
</tr>
<tr>
<td><code>เมนู.KeyCode.ButtonL3</code></td>
<td><code>ปุ่มL3</code></td>
<td><code>ปุ่ม LS</code></td>
</tr>
<tr>
<td><code>เมนู.KeyCode.ButtonR1</code></td>
<td><code>ปุ่ม R1</code></td>
<td><code>ปุ่ม RB</code></td>
</tr>
<tr>
<td><code>เมนู.KeyCode.ButtonR2</code></td>
<td><code>ปุ่ม R2</code></td>
<td><code>ปุ่ม RT</code></td>
</tr>
<tr>
<td><code>เมนู.KeyCode.ButtonR3</code></td>
<td><code>ปุ่ม R3</code></td>
<td><code>ปุ่ม RS</code></td>
</tr>
<tr>
<td><code>เมนู.KeyCode.ButtonStart</code></td>
<td><code>ตัวเลือกปุ่ม</code></td>
<td><code>เริ่มปุ่ม</code></td>
</tr>
<tr>
<td><code>เมนู.KeyCode.ButtonSelect</code></td>
<td><code>ButtonTouchpad</code> และ <code>ButtonShare</code></td>
<td><code>เลือกปุ่ม</code></td>
</tr>
</tbody>
รหัสสําคัญค่าการกลับของ PlayStationมูลค่าการส่งคืน Xbox

รูประบบสำหรับ KeyCodes

เมื่อใช้ Enum.KeyCode ที่เป็นรูปภาพที่ดีกว่า เช่นสำหรับ ImageLabel ในระบบปฏิบัติการ คุณสามารถใช


<tbody>
<tr>
<td><code>เมนู.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>เมนู.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>เมนู.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>เมนู.KeyCode.ButtonB</code></td>
<td>
<img src="../../../assets/scripting/controls/xboxB.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/xboxB.png</code></td>
</tr>
<tr>
<td><code>PadLeft รหัสเรียบร้อย</code></td>
<td>
<img src="../../../assets/scripting/controls/dpadLeft.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/dpadLeft.png</code></td>
</tr>
<tr>
<td><code>PadRight รหัสรัฐบาลดาวน์โหลด</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>เครื่องมือป้อนรหัส.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>เครื่องมือปฏิบัติการ.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>เมนู.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>เมนู.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>เมนู.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>เมนู.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>เมนู.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>เมนู.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>เมนู.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>เมนู.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>เรียกค่าย่อของ keyCode</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>เรียกค่าย่อยของ 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>เค้าโค้ดระดับต้นไม้</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>คืนค่า KeyCode</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>รหัสปุ่มซ้ายของเมนู</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>รหัสปุ่มซ้ายของเมนู</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>คําสั่งกุญแจ KeyCode.Tab</code></td>
<td>
<img src="../../../assets/scripting/controls/tab.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/tab.png</code></td>
</tr>
<tr>
<td><code>รหัสเวชอักษร</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>คําสั่ง 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>คําอ้างอิงเมนู</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>รหัสช่วง .KeyCode.Period</code></td>
<td>
<img src="../../../assets/scripting/controls/period.png" width="24">
</img>
</td>
<td><code>rbxasset://textures/ui/Controls/期间.png</code></td>
</tr>
<tr>
<td><code>คําสั่งใหม่ .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>
รหัสสําคัญรูปรหัสสินทรัพย์

พารามิเตอร์

keyCode: Enum.KeyCode

ส่งค่ากลับ

GetSupportedGamepadKeyCodes

ฟังก์ชันนี้กลับรายการ KeyCodes ที่ gamepad ที่เกี่ยวข้องกับ key ให้การสนับสนุน Enum.UserInputType

ฟังก์ชันนี้สามารถใช้เพื่อระบุว่า KeyCodes ใดที่สนับสนุนและไม่สนับสนุนโดยเกมแพดที่เชื่อมต่อ เพื่อระบุว่า KeyCodes บางอย่างได้รับการสนับสนุนหรือไม่ได้รับการสนับสนุนโดยเกมแพดที่เชื่อมต่อ ใช้ Class

หากเรียกในเกมพาดที่ไม่มีอยู่หรือไม่เชื่อมต่อเกมแพด, ฟังก์ชันนี้จะกลับค่ารายการที่ว่างเปล่า

เนื่องจาก UserInputService เป็นข้างล่างเท่านั้น, ฟังก์ชันนี้สามารถใช้ได้ใน LocalScript เท่านั้น

ดูเพิ่มเติม:

พารามิเตอร์

gamepadNum: Enum.UserInputType

The Enum.UserInputType ของ gamepad


ส่งค่ากลับ

KeyCode|KeyCodes รายการที่สนับสนุนโดย gamepad ที่ระบุ

ตัวอย่างโค้ด

Binding Supported Gamepad KeyCodes

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

IsGamepadButtonDown

ฟังก์ชันนี้ตรวจสอบว่าปุ่มบางปุ่มได้ถูกกดบนแท่นเกมบางแท่นหรือไม่ มันจะกลับมาที่ true หาก gamepad มีปุ่มที่กดลงไปแล้ว, มันจะกลับมาที่ปุ่มอื่น

รายการปุ่มผู้ใช้ที่ถูกต้อง

แผงเกมที่ระบุควรเป็นหนึ่งในมูลค่ารายการ UserInputType ต่อไปนี้:


<tr>
<td>เลขที่อุปกรณ์ผู้ใช้ .UserInputType.Gamepad1-8</td>
</tr>
ชื่อ

รหัสลับที่ถูกต้อง

ปุ่มที่ระบุไว้ควรเป็นหนึ่งในมูลค่า KeyCodes ต่อไปนี้:


<tr>
<td>เรียบเรียง.KeyCode.ButtonX</td>
</tr>
<tr>
<td>เรียบเรียง.KeyCode.ButtonY</td>
</tr>
<tr>
<td>เรียบเรียง.KeyCode.ButtonA</td>
</tr>
<tr>
<td>เรียบเรียง.KeyCode.ButtonB</td>
</tr>
<tr>
<td>เรียบร้อย</td>
</tr>
<tr>
<td>เรียบเรียง.KeyCode.ButtonL1</td>
</tr>
<tr>
<td>เรียบร้อย</td>
</tr>
<tr>
<td>เรียบเรียง.KeyCode.ButtonL2</td>
</tr>
<tr>
<td>เรียบร้อย</td>
</tr>
<tr>
<td>เรียบเรียง.KeyCode.ButtonL3</td>
</tr>
<tr>
<td>เริ่มต้นด้วย .KeyCode.Button</td>
</tr>
<tr>
<td>เรียก.KeyCode.ButtonSelect</td>
</tr>
<tr>
<td>PadLeft</td>
</tr>
<tr>
<td>เรียกค่าย่อยของเรา</td>
</tr>
<tr>
<td>PadUp รหัส</td>
</tr>
<tr>
<td>PadDown รหัส</td>
</tr>
ชื่อ

นี้สามารถใช้เพื่อตรวจสอบว่าปุ่มที่กำหนดเช่น A ถูกกดลงหรือไม่ โดยเช่น:


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

เนื่องจาก UserInputService เป็นข้างล่างเท่านั้น, ฟังก์ชันนี้สามารถใช้ได้ใน LocalScript เท่านั้น

ดูเพิ่มเติม:

พารามิเตอร์

gamepadNum: Enum.UserInputType

The Enum.UserInputType ของ gamepad ที่ให้

gamepadKeyCode: Enum.KeyCode

The Enum.KeyCode ของปุ่มที่ระบุ


ส่งค่ากลับ

ว่าปุ่ม gamepad ที่ระบุไว้บน gamepad ที่ให้นั้นจะถูกกดหรือไม่

ตัวอย่างโค้ด

Special Action on Gamepad Button Combo

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

IsKeyDown

ฟังก์ชันนี้กลับมาว่าผู้ใช้กดปุ่มที่เกี่ยวข้องกับ Enum.KeyCode หรือไม่ มันกลับมา true ถ้าปุ่มที่กำหนดไว้ถูกกดหรือ false ถ้าปุ่มนั้นไม่ได้กด

คีย์เช่น เป็นต้นว่าปุ่ม space bar


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

เพื่อดึงรายการของทุกปุ่มที่กดโดยผู้ใช้ใช้ฟังก์ชัน UserInputService:GetKeysPressed()

เนื่องจาก UserInputService เป็นข้างล่างเท่านั้น, ฟังก์ชันนี้สามารถใช้ได้ใน LocalScript เท่านั้น

ดูเพิ่มเติม:

  • Enum.UserInputType.IsGamepadButtonDown - เหตุการณ์ที่คล้ายกันพร้อมการใช้งานที่แตกต่างกัน: เพื่อตรวจสอบว่า button บน gamepad ถูกกด

พารามิเตอร์

keyCode: Enum.KeyCode

The Enum.KeyCode คีย์


ส่งค่ากลับ

ว่าคีย์ที่กำหนดไว้จะถูกกดลงหรือไม่

ตัวอย่างโค้ด

Special Action on Key Combo Press

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

IsMouseButtonPressed

ฟังก์ชันนี้ใช้ปุ่มเมาส์ Enum.UserInputType และส่งคืนตัวละครที่ชี้ให้เห็นว่ามันกดได้หรือไม่ใช่ตอนนี้

ปุ่มเมาส์ที่เช็คขึ้นอยู่กับค่า Enum.UserInputType ที่ส่งให้กับฟังก์ชันเป็นตัวอ้างอิง ตัวอย่างเช่น:


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

เนื่องจาก UserInputService เป็นข้างล่างเท่านั้น, ฟังก์ชันนี้สามารถใช้ได้ใน LocalScript เท่านั้น"

พารามิเตอร์

mouseButton: Enum.UserInputType

The Enum.UserInputType ของปุ่มเมาส์


ส่งค่ากลับ

ว่าปุ่มเมาส์ที่ให้นั้นถูกกดไว้หรือไม่

ตัวอย่างโค้ด

Create a Custom CameraScript

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

IsNavigationGamepad

ฟังก์ชันนี้กลับมา true หาก gamepad ที่ระบุ Enum.UserInputType ได้รับการรับรองการควบคุมการนำทางและการเลือก GUIs โดย 1>Class.Gui1>

หากคุณต้องการตั้งค่า gamepad การนำทางคุณสามารถใช้ UserInputService:SetNavigationGamepad() . คุณยังสามารถใช้ UserInputService:GetNavigationGamepads() เพื่อรับรายการของ all เกมแพดทั้งหมด

เช่นเดียวกับโค้ดด้านล่างตรวจสอบว่า gamepad1 เป็นเกมแนวนำทาง:


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

รายการของแพดพิงเกมทั้งหมดที่เชื่อมต่อสามารถดึงได้โดยใช้ `UserInput/GetConnectedGamepads

เนื่องจาก UserInputService เป็นข้างล่างเท่านั้น, ฟังก์ชันนี้สามารถใช้ได้ใน LocalScript เท่านั้น

ดูเพิ่มเติม:

พารามิเตอร์

gamepadEnum: Enum.UserInputType

The Enum.UserInputType ของ gamepad ที่ระบุ


ส่งค่ากลับ

ว่า gamepad ที่ระบุเป็นเกมแห่งการนำทาง

RecenterUserHeadCFrame

void

ระบบนี้ให้ความสำเร็จของ CFrame ของหมวก VR ไปยังตำแหน่งปัจจุบันของหมวกที่สวมใส่โดยผู้ใช้ เฮดเซ็ทCFrame.new()

ใช้งานนี้เพื่อย้ายหมวก CFrame ไปยังศูนย์กลางของพื้นที่เล่นหากมันดูเหมือนจะอยู่ในขอบเขตที่แปลก

พฤติกรรมนี้เหมือนกับฟังก์ชัน VRService และ VRService:RecenterUserHeadCFrame()

เนื่องจาก UserInputService เป็นข้างล่างเท่านั้น, ฟังก์ชันนี้สามารถใช้ได้ใน LocalScript เท่านั้น


ส่งค่ากลับ

void

ตัวอย่างโค้ด

UserInputService:RecenterUserHeadCFrame

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

SetNavigationGamepad

void

การตั้งค่า NavigationGamepad ตั้งค่าว่า Enum.UserInputType แผงเกมส์สามารถเคลื่อนย้ายนาวิเกเตอร์ GUI ได้หรือไม่ แผงเกมส์ที่สามารถเคลื่อนย้ายนาวิเกเตอร์ GUI ได้จะถูกจัดประเภทเป็น เกมส์นาวิเก

หาก เปิดใช้งานได้อย่างเป็นทางการเป็น true ตัวอ้างจะทำให้ Gamepad สามารถเคลื่อนย้ายได้ navigator GUI หาก เป็น 1> false1> ตัวอ้างจะทำให้ Gamepad ไม่สามารถเคลื่อนย้ายได้ navigator GUI

หากคุณต้องการตรวจสอบว่า Gamepad ที่กำหนดเป็นเกมแนวนำทางหรือไม่ คุณสามารถใช้ฟังก์ชัน UserInputService:IsNavigationGamepad() ได้ นอกจากนี้คุณยังสามารถใช้ฟังก์ชัน Class.UserInputService:GetNavigationGamepads()

เนื่องจาก UserInputService เป็นข้างล่างเท่านั้น, ฟังก์ชันนี้สามารถใช้ได้ใน LocalScript เท่านั้น

ดูเพิ่มเติม:

พารามิเตอร์

gamepadEnum: Enum.UserInputType

The Enum.UserInputType ของ gamepad ที่ระบุ

enabled: bool

ว่า gamepad ที่ระบุสามารถเคลื่อนย้าย GUI Navigator ได้หรือไม่


ส่งค่ากลับ

void

ตัวอย่างโค้ด

UserInputService:SetNavigationGamepad

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

อีเวนต์

DeviceAccelerationChanged

เหตุการณ์ DeviceAccelerationChanged จะเกิดขึ้นเมื่อผู้ใช้ย้ายอุปกรณ์ที่มีเครื่องวัดความเร่ง

เครื่องวัดความเร่ง (เปลี่ยนแปลงในความเร็ว) เป็นส่วนประกอบที่พบในอุปกรณ์มือถือส่วนใหญ่ที่วัดความเร่ง (เปลี่ยนแปลงในความเร็ว)

เพื่อตรวจสอบว่าอุปกรณ์ของผู้ใช้มีเครื่องวัดความเร่งหรือไม่ให้ดูที่ UserInputService.AccelerometerEnabled

กิจกรรมนี้สามารถใช้เพื่อติดตามการเคลื่อนที่ของอุปกรณ์ที่มีเครื่องวัดความเร่ง การใช้ตัวอย่างจะรวมถึงการเคลื่อนไหวตัวละครของผู้ใช้เมื่ออุปกรณ์เคลื่อนที่ด้วยความเร็ว

นอกจากนี้ยังสามารถใช้ร่วมกับ UserInputService:GetDeviceAcceleration() เพื่อระบุการเคลื่อนที่ปัจจุบันของอุปกรณ์ของผู้ใช้หากอุปกรณ์มีเครื่องวัดความเร่ง

เหตุการณ์นี้จะเกิดขึ้นเฉพาะในพื้นที่ - ซึ่งหมายความว่าเฉพาะผู้เล่นที่มีอุปกรณ์เคลื่อนที่สามารถใช้เหตุการณ์นี้และมันจะทำงานใน LocalScript เท่านั้น

พารามิเตอร์

acceleration: InputObject

Class.InputObject ที่มี UserInputType ของ เครื่องวัดความเร่ง และ 1>Class.InputObject.Position|Position1> ที่แสดงอาการเร่งแรงบนแกนหลักของแต่ละอุปกรณ์


ตัวอย่างโค้ด

Control Players Using the Accelerometer

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

DeviceGravityChanged

กิจกรรม UserInputService.DeviceGravityChanged เกิดขึ้นเมื่อความเร็วของอุปกรณ์เปลี่ยนแปลงในอุปกรณ์ที่มีเครื่องวัดความเร่ง Vector3 เมื่ออุปกรณ์มีความเร็วเร่ง

เวกเตอร์แรงโน้มถ่วงของอุปกรณ์แสดงถึงแรงโน้มถ่วงในแต่ละแกน X, Y และ Z ของอุปกรณ์ ขณะที่แรงโน้มถ่วงไม่เคยเปลี่ยนแปลง แรงโน้มถ่วงที่อุปกรณ์แสดงจะเปลี่ยนแปลงได้เมื่ออุ

เครื่องวัดความเร่ง (เปลี่ยนแปลงในความเร็ว) เป็นส่วนประกอบที่พบในอุปกรณ์มือถือส่วนใหญ่ที่วัดความเร่ง (เปลี่ยนแปลงในความเร็ว)

เหตุการณ์นี้สามารถใช้เพื่อกำหนดทิศทางของแรงโน้มถ่วงในอุปกรณ์ของผู้ใช้ นี่แม้จะสามารถใช้เพื่อจำลองแรงโน้มถ่วงในอุปกรณ์ของผู้ใช้ภายในเกม เช่น ในวัตถุในเกม (ดูตัวอย่างด้านล่าง)

เพื่อตรวจสอบว่าอุปกรณ์ของผู้ใช้มีเครื่องวัดความเร่งที่เปิดใช้งานหรือไม่ ดู UserInputService.AccelerometerEnabled หากอุปกรณ์มีเครื่องวัดความเร่งที่เปิดใช้งานคุณสามารถใช้

พารามิเตอร์

gravity: InputObject

Class.InputObject ที่มี InputObject.Position สมบัติสมุดที่แสดงตำแหน่งแรงโน้มถ่วงบนแกนต่างๆ ของอุปกรณ์ ตำแหน่งนี้สามารถใช้เป็นทิศทางเพื่อกำหนดทิศทางแรงโน้มถ่วงเมื่อเป็นสัดส่วนก


ตัวอย่างโค้ด

Move a Ball using the Accelerometer

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

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

DeviceRotationChanged

เหตุการณ์ DeviceRotationChanged จะเกิดขึ้นเมื่อผู้ใช้หมุนอุปกรณ์ที่มีเครื่องวัดความเร่ง

เซ็นเซอร์กายโรสโกปี้เป็นส่วนประกอบที่พบในอุปกรณ์มือถือส่วนใหญ่ที่ตรวจจับการเปลี่ยนแปลงทางกายภาพและความเร็วในการหมุน

เหตุการณ์เป็นประโยชน์เมื่อติดตามการเรียงลำดับของอุปกรณ์และวิธีการเปลี่ยนแปลงเมื่อผู้ใช้หมุนอุปกรณ์ของพวกเขา เพื่อกำหนดการหมุนของอุปกรณ์ปัจจุบันคุณสามารถใช้คุณสมบัติ Class.UserInputService:GetDeviceRotation()

เพื่อตรวจสอบว่าอุปกรณ์ของผู้ใช้มีเครื่องวัดแรงโน้มถ่วงที่เปิดใช้งาน และเหตุการณ์นี้จะเกิดขึ้น ดู UserInputService.GyroscopeEnabled

เหตุการณ์นี้จะเกิดขึ้นเฉพาะเมื่อหน้าต่างของลูกค้า Roblox อยู่ในโฟกัส โดยเฉพาะอย่างยิ่งการป้อนข้อมูลจะไม่ถูกจับกุมเมื่อหน้าต่างถูกขนาดเล็ก

พารามิเตอร์

rotation: InputObject

Class.InputObject ที่ให้ข้อมูลเกี่ยวกับการหมุนของอุปกรณ์ InputObject.Position 代表新的旋转位置 Vector3 代表位置 และ 1> Class.InputObject.Delta1> 代表位置ใ

cframe: CFrame

A CFrame ที่แทนที่ตำแหน่งปัจจุบันของอุปกรณ์


ตัวอย่างโค้ด

Create a Gyroscopic Camera

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

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

GamepadConnected

เหตุการณ์ GamepadConnected จะเกิดขึ้นเมื่อเชื่อมต่อ gamepad กับเครื่องคอมพิวเตอร์

เนื่องจากเกม Roblox รองรับผู้ควบคุมหลายตัว, กิจกรรมนี้มีประโยชน์เมื่อคู่กับกิจกรรม UserInputService.GamepadDisconnected เพื่อติดตามว่าคอนโทรลเลอร์ใด/แพดพันที่ใช้งานอยู

ตัวอย่างต่อไปนี้แสดงตัวอย่างการใช้งานของการติดตามเมื่อ gamepad ถูกเชื่อมต่อกับเครื่องคอมพิวเตอร์


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

หากคุณต้องการดูว่าอุปกรณ์ใดที่เชื่อมต่ออยู่ คุณสามารถใช้คุณสมบัติ UserInputService:GetConnectedGamepads() ได้

เนื่องจากเหตุการณ์นี้เกิดขึ้นในพื้นที่ของเราเอง จึงสามารถใช้ได้ใน LocalScript เท่านั้น

ดูเพิ่มเติม:

พารามิเตอร์

gamepadNum: Enum.UserInputType

The Enum.UserInputType ของ gamepad ที่เชื่อมต่อ


GamepadDisconnected

เหตุการณ์ GamepadDisconnected จะเกิดขึ้นเมื่อเกมแพดเป็นการแยกกัน

เนื่องจากเกม Roblox รองรับผู้ควบคุมหลายตัว, กิจกรรมนี้มีประโยชน์เมื่อคู่กับกิจกรรม UserInputService.GamepadConnected เพื่อติดตามว่าคอนโทรลเลอร์ใด / เกมแพดที่ใช้งานอยู

ตัวอย่างต่อไปนี้แสดงตัวอย่างการใช้งานของการติดตามเมื่อเกมแพดถูกตัดการเชื่อมต่อจากคลายเคลม


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

เนื่องจากเหตุการณ์นี้เกิดขึ้นในพื้นที่ของเราเอง จึงสามารถใช้ได้ใน LocalScript เท่านั้น

ดูเพิ่มเติม:

พารามิเตอร์

gamepadNum: Enum.UserInputType

เมนูผู้ใช้ ของ gamepad ที่ตัดการเชื่อมต่อ


InputBegan

เหตุการณ์ InputBegan จะเกิดขึ้นเมื่อผู้ใช้เริ่มต้นใช้งานผ่านอุปกรณ์ Human-Computer Interface ต่างๆ (ปุ่มเมาส์ลง, แตะเริ่ม, ปุ่มกล้องสัมผัส, ฯลฯ)

สามารถใช้เพื่อติดตามจุดเริ่มต้นของการใช้งานของผู้ใช้ เช่นเมื่อผู้ใช้ใช้งาน GUI ครั้งแรก การเคลื่อนไหวของวงล้อเมาส์ ฯลฯ ไม่ได้จับการเคลื่อนไหวของล้อเมาส์

เหตุการณ์นี้สามารถใช้ร่วมกับ UserInputService.InputChanged และ UserInputService.InputEnded เพื่อติดตามเมื่อผู้ใช้เริ่มต้นให้ข้อมูลเริ่มต้น เปลี่ยนแปลง และจบลง

เหตุการณ์นี้จะเกิดขึ้นเฉพาะเมื่อหน้าต่างของลูกค้า Roblox อยู่ในโฟกัส โดยเฉพาะอย่างยิ่งการป้อนข้อมูลจะไม่ถูกจับกุมเมื่อหน้าต่างถูกขนาดเล็ก

เนื่องจากเหตุการณ์นี้เฉพาะกับพื้นที่โคลนเท่านั้น จึงสามารถใช้ได้ใน LocalScript เท่านั้น

พารามิเตอร์

ตัวอย่าง InputObject ซึ่งมีข้อมูลเกี่ยวกับการป้อนของผู้ใช้

gameProcessedEvent: bool

ระบุว่าเครื่องมือเกมส์สังเกตเห็นการป้อนข้อมูลนี้และดำเนินการต่อมัน โดยปกตินี่เกี่ยวข้องกับการประมวลผล UI ดังนั้นหากปุ่มถูกแตะหรือคลิกจากการป้อนข้


ตัวอย่างโค้ด

Handling InputBegan

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

InputChanged

เหตุการณ์ปุ่มเปลี่ยนแปลงเมื่อผู้ใช้เปลี่ยนวิธีการโต้ตอบผ่านอุปกรณ์ทางมนุษย์-คอมพิวเตอร์ (ปุ่มเมาส์ลง, แตะเริ่ม, ปุ่มกล้อง, ฯลฯ)

เพื่อเพิกเฉยกิจกรรมที่จัดการโดยอัตโนมัติโดย Roblox เช่นการเลื่อนเมาส์ใน ScrollingFrame ตรวจสอบว่า เกมProcessingEvent อาร์เจนต์เป็นปลอม

เหตุการณ์นี้จะเกิดขึ้นเฉพาะเมื่อหน้าต่างของลูกค้า Roblox อยู่ในโฟกัส โดยเฉพาะอย่างยิ่งการป้อนข้อมูลจะไม่ถูกจับกุมเมื่อหน้าต่างถูกขนาดเล็ก

เนื่องจากเหตุการณ์นี้เฉพาะกับพื้นที่โคลนเท่านั้น จึงสามารถใช้ได้ใน LocalScript เท่านั้น

พารามิเตอร์

ตัวอย่าง InputObject ซึ่งมีข้อมูลเกี่ยวกับการป้อนของผู้ใช้

gameProcessedEvent: bool

ระบุว่าเครื่องมือเกมส์สังเกตเห็นการป้อนข้อมูลนี้และดำเนินการต่อมัน โดยปกตินี่เกี่ยวข้องกับการประมวลผล UI ดังนั้นหากปุ่มถูกแตะหรือคลิกจากการป้อนข้


ตัวอย่างโค้ด

Handling InputChanged

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

InputEnded

เหตุการณ์ที่สิ้นสุดลงเมื่อผู้ใช้หยุดโต้ตอบผ่านอุปกรณ์ทางกุหาภาพประกายในมนุษย์-คอมพิวเตอร์อินเทอร์เฟซ (ปุ่มเมาส์ลง, เริ่มแตะ, กดปุ่มคีย์บอร์ด, ฯลฯ) นี่เป็นประโยชน์เมื่อติดต

เหตุการณ์นี้สามารถใช้ร่วมกับ UserInputService.InputBegan และ UserInputService.InputChanged เพื่อติดตามเมื่อผู้ใช้เริ่มต้นให้คำปรึกษาเปลี่ยนและจบ

เหตุการณ์นี้จะเกิดขึ้นเฉพาะเมื่อหน้าต่างของลูกค้า Roblox อยู่ในโฟกัส โดยเฉพาะอย่างยิ่งการป้อนข้อมูลจะไม่ถูกจับกุมเมื่อหน้าต่างถูกขนาดเล็ก

เนื่องจากเหตุการณ์นี้เฉพาะกับพื้นที่โคลนเท่านั้น จึงสามารถใช้ได้ใน LocalScript เท่านั้น

พารามิเตอร์

ตัวอย่าง InputObject ซึ่งมีข้อมูลเกี่ยวกับการป้อนของผู้ใช้

gameProcessedEvent: bool

ระบุว่าเครื่องมือเกมส์สังเกตเห็นการป้อนข้อมูลนี้และดำเนินการต่อมัน โดยปกตินี่เกี่ยวข้องกับการประมวลผล UI ดังนั้นหากปุ่มถูกแตะหรือคลิกจากการป้อนข้


ตัวอย่างโค้ด

Handling InputEnded

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

JumpRequest

เหตุการณ์ UserInputService JumpRequest จะเกิดขึ้นเมื่อมีคำขอกระโดดจากลูกค้า เช่นเมื่อลูกค้ากดปุ่มกระโดดหรือปุ่มกระโดดบนมือถือ

เหตุการณ์นี้จะเกิดขึ้นเมื่อผู้ใช้พยายามที่จะทำให้การกระโดดของพวกเขา Player.Character กระโดด พฤติกรรมปกติจะตอบสนองต่อคำขอกระโดดโดยการตั้งค่าคุณสมบัติของผู้เล่น

เหตุการณ์สามารถใช้เพื่อติดตามทุกครั้งที่ผู้เล่นต้องการกระโดด แทนที่จะใช้มันเพื่อทำให้ผู้เล่นกระโดด โดยการใช้มันเพื่อเปลี่ยนพฤติกรรมการกระโดดเริ่มต้น - เช่น การปิดการใช้งานการกระโดด

เช่นเดียวกับรหัสด้านล่าง จะพิมพ์ "กระโดด" ทุกครั้งที่ผู้เล่นส่งคำขอกระโดด


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

เนื่องจากเหตุการณ์นี้เกิดขึ้นหลายครั้งสำหรับคำขอกระโดดครั้งเดียว จึงแนะนำให้ใช้ debounce

หากคุณต้องการเชื่อมโยงปุ่มหรือปุ่มกับการกระทําอื่น ๆ โปรดพิจารณาการใช้งานเหตุการณ์เช่น UserInputService:GetKeysPressed() และ UserInputService.InputBegan หรือ ContextActionService

เนื่องจากเหตุการณ์นี้เฉพาะกับพื้นที่โคลนเท่านั้น จึงสามารถใช้ได้ใน LocalScript เท่านั้น


ตัวอย่างโค้ด

Disable Jumping

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

LastInputTypeChanged

เหตุการณ์ UserInputService.LastInputTypeChanged เกิดขึ้นเมื่อลูกค้าเปลี่ยนวิธีการโต้ตอบผ่านอุปกรณ์ทางมนุษย์-คอมพิวเตอร์เมื่อใดก็ตามที่ลูกค้าเปลี่ยนวิธีการโต้ตอบผ่านอุปกรณ์นี้ (เช่น จาก MouseMove

พิมพ์ไม่ว่ามันจะเปลี่ยนแปลงหรือไม่ คุณสามารถใช้คุณสมบัติ UserInputService:GetLastInputType() ได้

เนื่องจากเหตุการณ์นี้เฉพาะกับพื้นที่โคลนเท่านั้น จึงสามารถใช้ได้ใน LocalScript เท่านั้น

พารามิเตอร์

lastInputType: Enum.UserInputType

A Enum.UserInputType พิมพ์


ตัวอย่างโค้ด

Hide Mouse During Keyboard Input

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

PointerAction

PointerAction แอ็คชันโดยเฉพาะการเลื่อนล้อเมาส์

พารามิเตอร์

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

TextBoxFocusReleased

เหตุการณ์ TextBoxFocusRelease จะปล่อยเมื่อลูกค้าสูญเสียโฟกัสใน TextBox - โดยปกติเมื่อลูกค้าหยุดการป้อนข้อความใน TextBox โดยกดกลับหรือกดที่ใดก็ได้บนหน้าจอ

เช่นโค้ดด้านล่างพิมพ์ชื่อของ TextBox ที่สูญเสียโฟกัสเมื่อเหตุการณ์เกิดขึ้น


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

สามารถใช้ร่วมกับ UserInputService.TextBoxFocused เพื่อติดตามเมื่อ TextBox ได้รับการโฟกัสและสูญเสียโฟกัส

เนื่องจากเหตุการณ์นี้เฉพาะกับพื้นที่โคลนเท่านั้น จึงสามารถใช้ได้ใน LocalScript เท่านั้น

ดูเพิ่มเติม:

พารามิเตอร์

textboxReleased: TextBox

Class.Toolbar ที่สูญเสียโฟกัส


ตัวอย่างโค้ด

TextBoxFocusReleased

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

TextBoxFocused

เหตุการณ์ TextBoxFocused จะเกิดขึ้นเมื่อเกิดความสนใจใน TextBox - โดยปกติเมื่อลูกค้าคลิก/แตะที่กล่องข้อความเพื่อเริ่มการป้อนข้อความ

เช่นโค้ดด้านล่างพิมพ์ชื่อของ TextBox ที่มุ่งเมื่อเหตุการณ์เกิดขึ้น


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

สามารถใช้ร่วมกับ UserInputService.FocusReleased เพื่อติดตามเมื่อกล่องข้อความเก็บและสูญเสียโฟกัส

เนื่องจากเหตุการณ์นี้เฉพาะกับพื้นที่โคลนเท่านั้น จึงสามารถใช้ได้ใน LocalScript เท่านั้น

ดูเพิ่มเติม:

พารามิเตอร์

textboxFocused: TextBox

Class.Toolbar ที่ได้รับการโฟกัส


ตัวอย่างโค้ด

Modifying a TextBox on Focused and FocusReleased

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

TouchEnded

เหตุการณ์ TouchEnded จะเกิดขึ้นเมื่อผู้ใช้ปล่อยนิ้วของพวกเขาออกจากหน้าจอของอุปกรณ์ TouchEnabled แล้วสิ้นสุดการป้อนข้อมูลแตะด้วยอุปกรณ์

เหตุการณ์นี้สามารถใช้เพื่อกำหนดเมื่อผู้ใช้หยุดแตะหน้าจอของอุปกรณ์ของพวกเขา สามารถใช้คู่กับ UserInputService.TouchStarted เพื่อกำหนดเมื่อผู้ใช้เริ่มและหยุดแตะหน้าจอ

เช่นโค้ดด้านล่างพิมพ์ตำแหน่งหน้าจอที่ผู้ใช้หยุดแตะหน้าจอ


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

ตัววัตถุปุ่มสัมผัสเป็นตัววัตถุปุ่มสัมผัสเดียวกันตลอดชีวิตของปุ่มสัมผัส ดังนั้นการเปรียบเทียบ InputObjects เมื่อพวกเขาเป็นตัวปุ่มสัมผัสจะเป็นประโยชน์ในการกำหนดว่ามันเป็นนิ้วเดียว

เพื่อตรวจสอบว่าอุปกรณ์ของผู้ใช้เป็น TouchEnabled และเหตุการณ์การแตะจะเกิดขึ้น, ดู UserInputService.TouchEnabled .

เหตุการณ์นี้จะเกิดขึ้นเฉพาะเมื่อหน้าต่างของลูกค้า Roblox อยู่ในโฟกัส โดยเฉพาะอย่างยิ่งการป้อนข้อมูลจะไม่ถูกจับกุมเมื่อหน้าต่างถูกขนาดเล็ก

เนื่องจากเหตุการณ์นี้เฉพาะกับพื้นที่โคลนเท่านั้น จึงสามารถใช้ได้ใน LocalScript เท่านั้น

ดูเพิ่มเติม:

พารามิเตอร์

ตัวอย่าง InputObject ซึ่งมีข้อมูลเกี่ยวกับการป้อนของผู้ใช้

gameProcessedEvent: bool

ระบุว่าเครื่องมือเกมส์สังเกตเห็นการป้อนข้อมูลนี้และดำเนินการต่อมัน โดยปกตินี่เกี่ยวข้องกับการประมวลผล UI ดังนั้นหากปุ่มถูกแตะหรือคลิกจากการป้อนข้


ตัวอย่างโค้ด

The Difference Between TouchTap and TouchLongPress

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

TouchLongPress

จะได้รับการเปิดเมื่อผู้ใช้กดค้างที่ปุ่มเดียวในเวลาสั้น ๆ อุปกรณ์

เหตุการณ์นี้สามารถใช้เพื่อกำหนดเมื่อผู้ใช้กดนิ้วของพวกเขาลงบนในเกม GUI หรือองค์ประกอบ

ตัวอย่างด้านล่างพิมพ์ state ของการกดค้างเวลานานของผู้ใช้เมื่อผู้ใช้กดค้างที่ปุ่มเดียวในเวลาสั้น ๆ บนตำแหน่งหน้าจอเดีย


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)

เพื่อตรวจสอบว่าอุปกรณ์ของผู้ใช้เปิดใช้งาน TouchEnabled และเหตุการณ์การแตะจะเกิดขึ้น, ดู UserInputService.TouchEnabled .

สามารถคู่กับ UserInputService.TouchStarted และ UserInputService.TouchEnded เพื่อกำหนดเมื่อผู้ใช้เริ่มและหยุดแตะหน้าจอ

เหตุการณ์นี้จะเกิดขึ้นเฉพาะเมื่อหน้าต่างของลูกค้า Roblox อยู่ในโฟกัส โดยเฉพาะอย่างยิ่งการป้อนข้อมูลจะไม่ถูกจับกุมเมื่อหน้าต่างถูกขนาดเล็ก

เนื่องจากเหตุการณ์นี้เฉพาะกับพื้นที่โคลนเท่านั้น จึงสามารถใช้ได้ใน LocalScript เท่านั้น

ดูเพิ่มเติม:

พารามิเตอร์

touchPositions: Array

รายการ Vector2 ตัวอย่างที่แสดงตำแหน่งของนิ้วที่เกี่ยวข้องในการเคลื่อนไหว

สถานะ Enum.UserInputState ของการเคลื่อนไหว

gameProcessedEvent: bool

ระบุว่าเครื่องมือเกมส์สังเกตเห็นการป้อนข้อมูลนี้และดำเนินการต่อมัน โดยปกตินี่เกี่ยวข้องกับการประมวลผล UI ดังนั้นหากปุ่มถูกแตะหรือคลิกจากการป้อนข้


ตัวอย่างโค้ด

The Difference Between TouchTap and TouchLongPress

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

TouchMoved

เหตุการณ์ TouchMoved จะเกิดขึ้นเมื่อผู้ใช้ย้ายนิ้วของพวกเขาไปที่อุปกรณ์เปิดใช้งาน

เหตุการณ์นี้สามารถใช้เพื่อระบุเมื่อผู้ใช้เคลื่อนนิ้วของพวกเขาขณะที่แตะหน้าจอของอุปกรณ์สัมผัส

รหัสด้านล่างพิมพ์ "Touch moved from" ตำแหน่ง Vector2 ก่อน "ไปยัง" ตำแหน่ง Vector2 ใหม่ของผู้ใช้บนอุปกรณ์ TouchEnabled


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

สามารถคู่กับ UserInputService.TouchStarted และ UserInputService.TouchEnded เพื่อกำหนดเมื่อผู้ใช้เริ่มสัมผัสหน้าจอพวกเขาจะเคลื่อนไหวนิ้วของพวกเขาในขณะที่สัมผัสหน้าจอและเมื่อพวกเขาหยุดส

เพื่อตรวจสอบว่าอุปกรณ์ของผู้ใช้เป็น TouchEnabled และเหตุการณ์การแตะจะเกิดขึ้น, ดู UserInputService.TouchEnabled .

เหตุการณ์นี้จะเกิดขึ้นเฉพาะเมื่อหน้าต่างของลูกค้า Roblox อยู่ในโฟกัส โดยเฉพาะอย่างยิ่งการป้อนข้อมูลจะไม่ถูกจับกุมเมื่อหน้าต่างถูกขนาดเล็ก

เนื่องจากเหตุการณ์นี้เฉพาะกับพื้นที่โคลนเท่านั้น จึงสามารถใช้ได้ใน LocalScript เท่านั้น

ดูเพิ่มเติม:

พารามิเตอร์

ตัวอย่าง InputObject ซึ่งมีข้อมูลเกี่ยวกับการป้อนของผู้ใช้

gameProcessedEvent: bool

ระบุว่าเครื่องมือเกมส์สังเกตเห็นการป้อนข้อมูลนี้และดำเนินการต่อมัน โดยปกตินี่เกี่ยวข้องกับการประมวลผล UI ดังนั้นหากปุ่มถูกแตะหรือคลิกจากการป้อนข้


ตัวอย่างโค้ด

The Difference Between TouchTap and TouchLongPress

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

TouchPan

เหตุการณ์ TouchPan เกิดขึ้นเมื่อผู้ใช้ลากนิ้วหนึ่งหรือมากกว่าบนอุปกรณ์ TouchEnabled

เหตุการณ์นี้สามารถใช้เพื่อกำหนดเมื่อผู้ใช้สแน็ปนิ้วของพวกเขาไปทั่วหน้าจอของอุปกรณ์เปิดใช้งานสัมผัส - เช่นเพื่อหมุน Camera ในสคริปต์กล้องที่กําหนดเอง

สแน็ปช็อตด้านล่างพิมพ์ "ความเร็วในการลาก" ตามความเร็วของผู้ใช้เมื่อผู้ใช้ลากนิ้วของพวกเขาบนหน้าจอ


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

ดูฟังก์ชัน UserInputService ที่มีประโยชน์อื่น ๆ ที่นี่ UserInputService.TouchRotate

เหตุการณ์นี้จะเกิดขึ้นเฉพาะเมื่อหน้าต่างของลูกค้า Roblox อยู่ในโฟกัส โดยเฉพาะอย่างยิ่งการป้อนข้อมูลจะไม่ถูกจับกุมเมื่อหน้าต่างถูกขนาดเล็ก

เนื่องจากเหตุการณ์นี้เฉพาะกับพื้นที่โคลนเท่านั้น จึงสามารถใช้ได้ใน LocalScript เท่านั้น

ดูเพิ่มเติม:

พารามิเตอร์

touchPositions: Array

รายการ Vector2 ตัวอย่างที่แสดงตำแหน่งของปุ่ม (เช่น นิ้ว) ที่เกี่ยวข้องในการเคลื่อนไหว

totalTranslation: Vector2

ขนาดของการเคลื่อนไหวของกระทะ (ในพิกเซล)

velocity: Vector2

ความเร็วของการเคลื่อนไหวของแป้น (ในพิกเซลต่อวินาที)

สถานะ Enum.UserInputState ของการเคลื่อนไหว

gameProcessedEvent: bool

ระบุว่าเครื่องมือเกมส์สังเกตเห็นการป้อนข้อมูลนี้และดำเนินการต่อมัน โดยปกตินี่เกี่ยวข้องกับการประมวลผล UI ดังนั้นหากปุ่มถูกแตะหรือคลิกจากการป้อนข้


ตัวอย่างโค้ด

Create a Custom CameraScript

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

TouchPinch

จะยิงเมื่อผู้ใช้วางและย้ายนิ้วสองให้อยู่บนหน้าจอของ TouchEnabled อุปกรณ์

อินสแตนซ์สแน็ปช็อตด้านล่างพิมพ์จำนวนเงินที่เครื่องชูตามุมเปลี่ยนแปลงตั้งแต่ต้นของการแตะเมาส์


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

เพื่อตรวจสอบว่าอุปกรณ์ของผู้ใช้เป็น TouchEnabled และเหตุการณ์การแตะจะเกิดขึ้น, ดู UserInputService.TouchEnabled .

เหตุการณ์นี้จะเกิดขึ้นเฉพาะเมื่อหน้าต่างของ Roblox เป็นของโฟกัส โดยปกติแล้วการป้อนข้อมูลจะไม่ถูกจับกุมเมื่อหน้าต่างถูกขนาดเล็ก เช่น การป้อนข้อมูลจะไม่ถูกจับกุมเมื่อหน้าต่างถูกขน

ดูเพิ่มเติม:

พารามิเตอร์

touchPositions: Array

Datatype.Vector2|Vector2s รายการที่แสดงตำแหน่งหน้าจอในพิกเซลของนิ้วของผู้ใช้ที่เกี่ยวข้องในการเลื่อนแป้น

scale: number

ความเข้มของการเจาะจากจุดเริ่มต้นไปจนถึงจุดสิ้นสุด (ในพิกเซล) หารกับตำแหน่งของการเจาะ

velocity: number

ความเร็วของการเคลื่อนไหวของการกด (ในพิกเซล) ต่อวินาที

สถานะ Enum.UserInputState ของการเคลื่อนไหว

gameProcessedEvent: bool

ระบุว่าเครื่องมือเกมส์สังเกตเห็นการป้อนข้อมูลนี้และดำเนินการต่อมัน โดยปกตินี่เกี่ยวข้องกับการประมวลผล UI ดังนั้นหากปุ่มถูกแตะหรือคลิกจากการป้อนข้


ตัวอย่างโค้ด

Create a Custom CameraScript

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

TouchRotate

เหตุการณ์ TouchRotate จะเกิดขึ้นเมื่อผู้ใช้หมุนสองนิ้วบนอุปกรณ์ TouchEnabled ตัว

เช่นเดียวกับรหัสต่อไปนี้ พิมพ์จำนวนเงินที่กล้องหมุนตั้งแต่ต้นของการหมุนสัมผัส


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

เพื่อตรวจสอบว่าอุปกรณ์ของผู้ใช้เป็น TouchEnabled และเหตุการณ์การแตะจะเกิดขึ้น, ดู UserInputService.TouchEnabled .

เหตุการณ์นี้จะเกิดขึ้นเฉพาะเมื่อหน้าต่างของลูกค้า Roblox อยู่ในโฟกัส โดยเฉพาะอย่างยิ่งการป้อนข้อมูลจะไม่ถูกจับกุมเมื่อหน้าต่างถูกขนาดเล็ก

เนื่องจากเหตุการณ์นี้เฉพาะกับพื้นที่โคลนเท่านั้น จึงสามารถใช้ได้ใน LocalScript เท่านั้น

สคริปต์การควบคุมกล้องของผู้ใช้บนอุปกรณ์มือถือใช้โค้ดที่ทำงานได้เหมือนกับเหตุการณ์นี้ การฝึกซ้อมที่ดีที่สุดสำหรับเหตุการณ์นี้คือการใช้โค้ดนี้เมื่อสร้างระบบกล้องมือถือเพื่อเปลี่ยนแปลงสคริป

ดูเพิ่มเติม:

พารามิเตอร์

touchPositions: Array

Datatype.Vector2|Vector2s รายการที่แสดงตำแหน่งของนิ้วที่เกี่ยวข้องในการเคลื่อนไหว

rotation: number

จำนวนองศาที่เกิดขึ้นตั้งแต่เริ่มเคลื่อนไหว

velocity: number

การเปลี่ยนแปลงในแกน (ในองศา) ที่แบ่งโดยระยะเวลาของการเปลี่ยนแปลง (ในวินาที)

สถานะ Enum.UserInputState ของการเคลื่อนไหว

gameProcessedEvent: bool

ระบุว่าเครื่องมือเกมส์สังเกตเห็นการป้อนข้อมูลนี้และดำเนินการต่อมัน โดยปกตินี่เกี่ยวข้องกับการประมวลผล UI ดังนั้นหากปุ่มถูกแตะหรือคลิกจากการป้อนข้


ตัวอย่างโค้ด

Create a Custom CameraScript

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

TouchStarted

เหตุการณ์ TouchStarted จะเกิดขึ้นเมื่อผู้ใช้วางนิ้วของพวกเขาบนอุปกรณ์ TouchEnabled เริ่มการป้อนข้อมูลแตะด้วยอุปกรณ์

เหตุการณ์นี้สามารถใช้เพื่อกำหนดเมื่อผู้ใช้เริ่มสัมผัสหน้าจอของอุปกรณ์ของพวกเขา สามารถใช้คู่กับ UserInputService.TouchEnded เพื่อกำหนดเมื่อผู้ใช้เริ่มและหยุดสัมผัสหน้าจอ

ตัววัตถุปุ่มสัมผัสเป็นตัววัตถุปุ่มสัมผัสเดียวกันตลอดชีวิตของปุ่มสัมผัส ดังนั้นการเปรียบเทียบ InputObjects เมื่อพวกเขาเป็นตัวปุ่มสัมผัสจะเป็นประโยชน์ในการกำหนดว่ามันเป็นนิ้วเดียว

เพื่อตรวจสอบว่าอุปกรณ์ของผู้ใช้เป็น TouchEnabled และเหตุการณ์การแตะจะเกิดขึ้น, ดู UserInputService.TouchEnabled .

เหตุการณ์นี้จะเกิดขึ้นเฉพาะเมื่อหน้าต่างของลูกค้า Roblox อยู่ในโฟกัส โดยเฉพาะอย่างยิ่งการป้อนข้อมูลจะไม่ถูกจับกุมเมื่อหน้าต่างถูกขนาดเล็ก

เนื่องจากเหตุการณ์นี้เฉพาะกับพื้นที่โคลนเท่านั้น จึงสามารถใช้ได้ใน LocalScript เท่านั้น

ดูเพิ่มเติม:

พารามิเตอร์

ตัวอย่าง InputObject ซึ่งมีข้อมูลเกี่ยวกับการป้อนของผู้ใช้

gameProcessedEvent: bool

ระบุว่าเครื่องมือเกมส์สังเกตเห็นการป้อนข้อมูลนี้และดำเนินการต่อมัน โดยปกตินี่เกี่ยวข้องกับการประมวลผล UI ดังนั้นหากปุ่มถูกแตะหรือคลิกจากการป้อนข้


ตัวอย่างโค้ด

Tracking Touches

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

TouchSwipe

เหตุการณ์ TouchSwipe เกิดขึ้นเมื่อผู้ใช้สแน็ปนิ้วของพวกเขาบนอุปกรณ์ TouchEnabled

เหตุการณ์นี้สามารถใช้เพื่อกำหนดเมื่อผู้ใช้สแน็ปนิ้วของพวกเขาบนหน้าจอของอุปกรณ์ของพวกเขาและทิศทางที่ผู้ใช้สแน็ปนิ้ว

สำหรับการติดตามการเคลื่อนไหวของการป้อนแตะด้วยความแม่นยำมากขึ้นใช้การใช้ UserInputService.TouchMoved

เพื่อตรวจสอบว่าอุปกรณ์ของผู้ใช้เป็น TouchEnabled และเหตุการณ์การแตะจะเกิดขึ้น, ดู UserInputService.TouchEnabled .

เหตุการณ์นี้จะเกิดขึ้นเฉพาะเมื่อหน้าต่างของลูกค้า Roblox อยู่ในโฟกัส โดยเฉพาะอย่างยิ่งการป้อนข้อมูลจะไม่ถูกจับกุมเมื่อหน้าต่างถูกขนาดเล็ก

เนื่องจากเหตุการณ์นี้เฉพาะกับพื้นที่โคลนเท่านั้น จึงสามารถใช้ได้ใน LocalScript เท่านั้น

ดูเพิ่มเติม:

พารามิเตอร์

swipeDirection: Enum.SwipeDirection

Direction.SwipeDirection การแสดงทิศทางที่ผู้ใช้สวิป

numberOfTouches: number

จำนวนการแตะ (เช่นนิ้วมือ) ที่เกี่ยวข้องกับการเคลื่อนไหว

gameProcessedEvent: bool

ระบุว่าเครื่องมือเกมส์สังเกตเห็นการป้อนข้อมูลนี้และดำเนินการต่อมัน โดยปกตินี่เกี่ยวข้องกับการประมวลผล UI ดังนั้นหากปุ่มถูกแตะหรือคลิกจากการป้อนข้


ตัวอย่างโค้ด

Touch Swipe a GUI

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

TouchTap

เหตุการณ์ TouchTap เกิดขึ้นเมื่อผู้ใช้แตะ / แตะนิ้วของพวกเขาบนหน้าจอเครื่องของผู้ใช้ที่มี TouchEnabled อุปกรณ์

เหตุการณ์นี้จะเกิดขึ้นอย่างไรก็ตามว่าผู้ใช้จะสัมผัส/แตะโลกเกมหรือไม่ หากคุณกำลังมองหาเหตุการณ์ที่เฉพาะเจาะจงที่จะเกิดขึ้นเมื่อผู้ใช้แตะ / สัมผัสโลกเกม ให

เพื่อตรวจสอบว่าอุปกรณ์ของผู้ใช้เป็น TouchEnabled และเหตุการณ์การแตะจะเกิดขึ้น, ดู UserInputService.TouchEnabled .

เหตุการณ์นี้จะเกิดขึ้นเฉพาะเมื่อหน้าต่างของลูกค้า Roblox อยู่ในโฟกัส โดยเฉพาะอย่างยิ่งการป้อนข้อมูลจะไม่ถูกจับกุมเมื่อหน้าต่างถูกขนาดเล็ก

เนื่องจากเหตุการณ์นี้เฉพาะกับพื้นที่โคลนเท่านั้น จึงสามารถใช้ได้ใน LocalScript เท่านั้น

พารามิเตอร์

touchPositions: Array

รายการ Vector2 ตัวอย่างที่แสดงตำแหน่งของนิ้วมือที่เกี่ยวข้องในการแตะสัมผัส

gameProcessedEvent: bool

ระบุว่าเครื่องมือเกมส์สังเกตเห็นการป้อนข้อมูลนี้และดำเนินการต่อมัน โดยปกตินี่เกี่ยวข้องกับการประมวลผล UI ดังนั้นหากปุ่มถูกแตะหรือคลิกจากการป้อนข้


ตัวอย่างโค้ด

The Difference Between TouchTap and TouchLongPress

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

TouchTapInWorld

เหตุการณ์ TouchTapInWorld จะเกิดขึ้นเมื่อผู้ใช้แตะ / แตะนิ้วของพวกเขาบนหน้าจอเครื่องของผู้ใช้ที่มี TouchEnabled อุปกรณ์ มันจะเกิดขึ้นเมื่อผู้ใช้แตะในโลกเกม

เหตุการณ์นี้สามารถใช้เพื่อกำหนดเมื่อผู้ใช้แตะหน้าจอและไม่แตะรายการ GUI หากผู้ใช้แตะรายการ GUI จะเปิดไฟน์ UserInputService.TouchTap แทนที่จะเปิด TouchTapInWorld

เพื่อตรวจสอบว่าอุปกรณ์ของผู้ใช้เป็น TouchEnabled และเหตุการณ์การแตะจะเกิดขึ้น, ดู UserInputService.TouchEnabled .

เหตุการณ์นี้จะเกิดขึ้นเฉพาะเมื่อหน้าต่างของลูกค้า Roblox อยู่ในโฟกัส โดยเฉพาะอย่างยิ่งการป้อนข้อมูลจะไม่ถูกจับกุมเมื่อหน้าต่างถูกขนาดเล็ก

เนื่องจากมันเฉพาะกับพื้นที่โค้งข้างในเท่านั้น จึงสามารถใช้ได้ใน LocalScript เท่านั้น

ดูเพิ่มเติม:

พารามิเตอร์

position: Vector2

A Vector2 การแสดงตำแหน่งของการสัมผัส

processedByUI: bool

ว่าผู้ใช้แตะรายการ GUI


ตัวอย่างโค้ด

Create a Part in World at Touch Position

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

WindowFocusReleased

เหตุการณ์ UserInputService WindowFocusRelease จะเกิดขึ้นเมื่อหน้าต่างของ Roblox ลดลง - โดยปกติเมื่อหน้าต่างของ Roblox ถูกมินิมิซิโซรโดยผู้ใช้

เช่นโค้ดด้านล่างพิมพ์ "การโฟกัสหน้าต่างปล่อย" เมื่อเวลาที่ Roblox ลูกค้าสูญเสียการโฟกัส


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

เหตุการณ์นี้สามารถใช้ร่วมกับ UserInputService.WindowFocused เพื่อติดตามว่าเครื่องมือ Roblox จะมุ่งเน้นไปที่หน้าจอของผู้ใช้หรือไม่

เนื่องจากมันเฉพาะกับพื้นที่โค้งของตัวเองเท่านั้น จึงสามารถใช้ได้ใน LocalScript เท่านั้น


ตัวอย่างโค้ด

Window Focus AFK Script (Script)

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

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

WindowFocused

เหตุการณ์ UserInputService WindowFocused เกิดขึ้นเมื่อหน้าต่างของ Roblox ได้รับการโฟกัสเมื่อหน้าต่างของ Roblox เป็นสีสัน - โดยปกติเมื่อ Roblox เป็นสีสัน/เปิดอยู่บนหน้าจอของผู้ใช้

เช่นเดียวกับรหัสด้านล่างพิมพ์ "หน้าต่างมุ่งเน้น" เมื่อได้รับการโฟกัสของ Roblox คลาย


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

เหตุการณ์นี้สามารถใช้ร่วมกับ UserInputService.WindowFocusReleased เพื่อติดตามว่าเครื่องมือ Roblox จะมุ่งเน้นไปที่หน้าจอของผู้ใช้หรือไม่

เนื่องจากเหตุการณ์นี้เฉพาะกับพื้นที่โคลนเท่านั้น จึงสามารถใช้ได้ใน LocalScript เท่านั้น


ตัวอย่างโค้ด

Window Focus AFK Script (Script)

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

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