UserInputService
*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่
UserInputService เป็นบริการที่ใช้เพื่อตรวจจับและการจับกุมประเภทต่างๆของการป้อนข้อมูลที่มีอยู่ในอุปกรณ์ของผู้ใช้
วัตถุประสงค์หลักของบริการนี้คือเพื่อให้ประสบการณ์สามารถร่วมมือกับหลากหลายของตัวเลือกที่มีอยู่ เช่นเกมแพด หน้าจอแตะ และคีย์บอร์ด มันช่วยให้ LocalScript ทำงานต่
การใช้งานบางอย่างของบริการนี้รวมถึงการตรวจจับการป้อนข้อมูลของผู้ใช้เมื่อพวกเขาใช้งานกับ GUIs เครื่องมือ และอื่น ๆ
เนื่องจากบริการนี้เป็นบริการข้างเครื่องคอมพิวเตอร์เท่านั้นจึงจะทำงานได้เฉพาะเมื่อใช้ใน LocalScript หรือ ModuleScript ที่ต้องการโดย LocalScript
ดูเพิ่มเติมที่ ContextActionService บริการที่ช่วยให้คุณสามารถผูกฟังก์ชันไปยังหลายการป้อนของผู้ใช้
ตัวอย่างโค้ด
-- 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
อธิบายว่ามีเครื่องมือเมาส์หรือไม่
รหัสเนื้อหาของรูปภาพที่ใช้เป็นไอคอนผู้ใช้
กำหนดว่าไอคอน Mouse มองเห็นได้หรือไม่
กำหนดตำแหน่งของคีย์บอร์ดบนหน้าจอ
กำหนดขนาดของคีย์บอร์ดบนหน้าจอ
อธิบายว่าคีย์บอร์ดบนหน้าจอมีประสิทธิภาพหรือไม่
อธิบายว่ามีหน้าจอแสดงผลแบบสัมผัสหรือไม่
เฮดเซ็ท
วิธีการ
กลับว่าว่า Enum.UserInputType รองเท้าเกมสนับสนุนปุ่มที่ตรงกับ Enum.KeyCode หรือไม่
กลับรายการ Enum.UserInputType ของเกมแพดพร้างที่เชื่อมต่ออยู่ในขณะนี้
กลับมาเป็น InputObject ที่อธิบายความเร่งปัจจุบันของอุปกรณ์
กลับมาที่ InputObject ที่อธิบายเวกเตอร์แรงโน้มถ่วงของอุปกรณ์
กลับมาที่ InputObject และ CFrame ซึ่งอธิบายเกี่ยวกับเวกเตอร์การหมุนปัจจุบันของอุปกรณ์
กลับไปที่ปัจจุบัน TextBox ที่ลูกค้ากำลังมุ่งเน้นอยู่
กลับว่าเกมพาดกับ Enum.UserInputType ''gamepadNum'' เชื่อมต่ออยู่หรือไม่
กลับรายการ InputObjects สำหรับทุกการป้อนข้อมูลที่มีอยู่ในแผงเกมที่ให้, การป้อนข้อมูลแต่ละครั้งจะแทนที่สถานะการป้อนข้อมูลสุดท้ายของแต่ละการป้อนข้อมูล
ส่งคืนภาพสำหรับ 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 ที่สวมใส่โดยผู้ใช้
ตั้งค่าว่า Gamepad นามสกุลผู้ใช้สามารถเคลื่อนย้ายผู้ใช้ได้หรือไม่ Errors: Error: Class.GuiObject|Gui Severity: major ---
อีเวนต์
เริ่มต้นเมื่อผู้ใช้ย้ายอุปกรณ์ที่มีเครื่องวัดความเร่ง ใช้เพื่อติดตามการเคลื่อนไหวของอุปกรณ์ในโลกแห่งความเป็นจริงภายในเกม Roblox
เกิดขึ้นเมื่อแรงโน้มถ่วงเปลี่ยนแปลงในอุปกรณ์ที่มีเครื่องวัดความเร่งที่เปิดใช้งาน - เช่นอุปกรณ์มือถือ
จะยิงเมื่อผู้ใช้หมุนได้อุปกรณ์ที่มีเครื่องวัดความเร่ง
เกิดขึ้นเมื่อ gamepad ถูกเชื่อมต่อกับเครื่องคอมพิวเตอร์ ส่งผ่าน "gamepadNum" ของ gamepad ที่เชื่อมต่อ
เกิดขึ้นเมื่อ gamepad ถูกขัดออกจากเครื่องคอมพิวเตอร์ ส่งผ่าน Enum.UserInputType ของ gamepad ที่ถูกขัดออก
เกิดขึ้นเมื่อผู้ใช้เริ่มใช้งานผ่านอุปกรณ์ระหว่างมนุษย์และคอมพิวเตอร์ - เช่นเมาส์หรือเกมแพด
จะได้รับการยิงเมื่อผู้ใช้เปลี่ยนวิธีการใช้งานผ่านอุปกรณ์ Human-Computer Interface
จะเกิดขึ้นเมื่อผู้ใช้หยุดใช้งานผ่านอุปกรณ์สื่อกลางมนุษย์-คอมพิวเตอร์
เปิดให้บริการเมื่อลูกค้าทำคำขอให้กระโดดตัวละครของพวกเขา
เกิดขึ้นเมื่อ Enum.UserInputType ของลูกค้าเปลี่ยนแปลง
- PointerAction(wheel : number,pan : Vector2,pinch : number,gameProcessedEvent : bool):RBXScriptSignal
เกิดขึ้นเมื่อผู้ใช้ปฏิบัติการตรึงเฉพาะ (ล้อ, หมุน, หมุน)
ไฟร์เมื่อลูกค้าสูญเสียโฟกัสใน TextBox
จะได้รับการเรียกใช้เมื่อลูกค้ามุ่งเน้นไปที่ TextBox
ปล่อยให้เมื่อผู้ใช้ปล่อยนิ้วของพวกเขาออกจากหน้าจอเมื่อใช้อุปกรณ์สัมผัส - เช่นหน้าจอของอุปกรณ์มือถือ
- TouchLongPress(touchPositions : Array,state : Enum.UserInputState,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 - เช่นหน้าจอของอุปกรณ์มือถือ
จะได้รับการเปิดเมื่อผู้ใช้วางนิ้วของพวกเขาบนอุปกรณ์ที่เปิดใช้งาน - เช่นหน้าจอของ Apple iPad หรือ iPhone หรือโทรศัพท์ Android Google
- TouchSwipe(swipeDirection : Enum.SwipeDirection,numberOfTouches : number,gameProcessedEvent : bool):RBXScriptSignal
จะได้รับการเรียกใช้เมื่อผู้ใช้สแน็ปนิ้วของพวกเขาบนอุปกรณ์ TouchEnabled เช่นหน้าจอของอุปกรณ์มือถือ
จะได้รับการเรียกใช้เมื่อผู้ใช้แตะนิ้วของพวกเขาบนอุปกรณ์ TouchEnabled เช่นหน้าจอของอุปกรณ์มือถือ
เกิดขึ้นเมื่อผู้ใช้แตะโลกเกมบนอุปกรณ์ TouchEnabled - เช่นหน้าจอของอุปกรณ์มือถือ
เกิดขึ้นเมื่อหน้าต่างของลูกค้า Roblox สูญเสียโฟกัสไปยังหน้าจอของผู้ใช้
เปิดเมื่อหน้าต่างของลูกค้า Roblox ได้รับการโฟกัสบนหน้าจอของผู้ใช้
คุณสมบัติ
AccelerometerEnabled
สมบัตินี้อธิบายว่ามีเครื่องวัดความเร่งหรือไม่
เครื่องวัดความเร่ง (เปลี่ยนแปลงในความเร็ว) เป็นส่วนประกอบที่พบในอุปกรณ์มือถือส่วนใหญ่ที่วัดความเร่ง (เปลี่ยนแปลงในความเร็ว)
ตัวอย่างรหัสต่อไปนี้แสดงให้เห็นวิธีการตรวจสอบว่าอุปกรณ์ของผู้ใช้มีเครื่องวัดความเร่งหรือไม่
local UserInputService = game:GetService("UserInputService")local accelerometerEnabled = UserInputService.AccelerometerEnabledif accelerometerEnabled thenprint("Accelerometer enabled!")elseprint("Accelerometer not enabled!")end
หากอุปกรณ์มีเครื่องวัดความเร่งที่เปิดใช้งานได้ คุณสามารถรับความเร่งปัจจุบันของอุปกรณ์โดยใช้ฟังก์ชัน UserInputService:GetDeviceAcceleration() หรือติดตามเมื่อความเร่งของอุปกรณ์เ
เนื่องจาก UserInputService เป็นข้างล่างเท่านั้น, คุณสมบัตินี้สามารถใช้ได้ใน LocalScript เท่านั้น
ตัวอย่างโค้ด
local Workspace = game:GetService("Workspace")
local UserInputService = game:GetService("UserInputService")
local ball = script.Parent:WaitForChild("Ball")
local mass = ball:GetMass()
local gravityForce = ball:WaitForChild("GravityForce")
local function moveBall(gravity)
gravityForce.Force = gravity.Position * Workspace.Gravity * mass
end
if UserInputService.AccelerometerEnabled then
UserInputService.DeviceGravityChanged:Connect(moveBall)
end
local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local character = player.CharacterAdded:Wait()
local head = character:WaitForChild("Head")
local camera = workspace.CurrentCamera
local currentRotation = camera.CFrame -- CFrame.new(Vector3.new(0,0,0), Vector3.new(0,0,0))
local lastInputFrame = nil
local upsideDown = false
task.wait()
local orientationSet = false
local function GravityChanged(gravity)
if not orientationSet then
upsideDown = (gravity.Position.X < -0.5 or gravity.Position.Z > 0.5)
orientationSet = true
end
end
local function RotationChanged(_rotation, rotCFrame)
if orientationSet then
if not lastInputFrame then
lastInputFrame = rotCFrame
end
local delta = rotCFrame * lastInputFrame:inverse()
local x, y, z = delta:ToEulerAnglesXYZ()
if upsideDown then
delta = CFrame.Angles(-x, y, z)
else
delta = CFrame.Angles(x, -y, z)
end
currentRotation = currentRotation * delta
lastInputFrame = rotCFrame
end
end
local function HideCharacter()
for _, limb in pairs(character:GetChildren()) do
if limb:IsA("Part") then
limb.Transparency = 1
end
end
end
if UserInputService.GyroscopeEnabled then
UserInputService.DeviceGravityChanged:Connect(GravityChanged)
UserInputService.DeviceRotationChanged:Connect(RotationChanged)
HideCharacter()
RunService:BindToRenderStep("Camera", Enum.RenderPriority.Camera.Value, function()
camera.CFrame = CFrame.new(head.Position - Vector3.new(0, 8, 10)) * currentRotation
camera.Focus = CFrame.new(currentRotation * Vector3.new(0, 0, -10))
end)
end
GamepadEnabled
สมบัตินี้อธิบายว่ามีเกมแพดที่พร้อมใช้งานหรือไม่ หากมีเกมแพดที่พร้อมใช้งาน คุณสามารถใช้ UserInputService:GetConnectedGamepads() เพื่อดึงรายการเกมแพดที่เชื่อมต่อได้
เนื่องจาก UserInputService เป็นข้างล่างเท่านั้น, คุณสมบัตินี้สามารถใช้ได้ใน LocalScript เท่านั้น
ดูเพิ่มเติม:
ตัวอย่างโค้ด
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.GyroscopeEnabledif gyroIsEnabled thenprint("Gyroscope is enabled!")elseprint("Gyroscope is not enabled!")end
เนื่องจาก UserInputService เป็นข้างล่างเท่านั้น, คุณสมบัตินี้สามารถใช้ได้ใน LocalScript เท่านั้น
ตัวอย่างโค้ด
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 เท่านั้น
ตัวอย่างโค้ด
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
สามารถตั้งค่าได้สามค่า:
- ค่าเริ่มต้น : เมาส์เคลื่อนที่ได้อย่างอิสระรอบหน้าจอของผู้ใช้
- ล็อคเซ็นเตอร์ : เมาส์ถูกล็อคไว้ และไม่สามารถเคลื่อนที่ได้ จากศูนย์กลางของหน้าจอผู้ใช้
- ล็อคตำแหน่งปัจจุบัน : เมาส์ล็อคอยู่ และไม่สามารถเคลื่อนได้ ตำแหน่งปัจจุบันของผู้ใช้บนหน้าจอในเวลาล็อค
ค่านี้ไม่ส่งผลต่อความไวของเหตุการณ์ติดตามการเคลื่อนไหวของเมาส์ ตัวอย่างเช่น GetMouseDelta ส่งค่า Vector2 ที่เหมือนกั
คุณสมบัตินี้จะถูกเปลี่ยนแปลงหาก GuiButton ที่มี Modal เปิดอยู่ คือ GuiButton.Visible ยกเว้นปุ่มเมาส์ขวาของผู้เล่นไม่ได้ปิด
หมายเหตุว่าหากเมาส์ถูกล็อค UserInputService.InputChanged เกม
เนื่องจาก UserInputService เป็นข้างล่างเท่านั้น, คุณสมบัตินี้สามารถใช้ได้ใน LocalScript เท่านั้น
ตัวอย่างโค้ด
local UserInputService = game:GetService("UserInputService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local character = player.CharacterAdded:Wait()
local head = character:WaitForChild("Head", false)
local mouse = player:GetMouse()
local zoomed = false
local camera = game.Workspace.CurrentCamera
local target = nil
local originalProperties = {
FieldOfView = nil,
_CFrame = nil,
MouseBehavior = nil,
MouseDeltaSensitivity = nil,
}
local AngleX, TargetAngleX = 0, 0
local AngleY, TargetAngleY = 0, 0
-- Reset camera back to CFrame and FieldOfView before zoom
local function ResetCamera()
target = nil
camera.CameraType = Enum.CameraType.Custom
camera.CFrame = originalProperties._CFrame
camera.FieldOfView = originalProperties.FieldOfView
UserInputService.MouseBehavior = originalProperties.MouseBehavior
UserInputService.MouseDeltaSensitivity = originalProperties.MouseDeltaSensitivity
end
local function ZoomCamera()
-- Allow camera to be changed by script
camera.CameraType = Enum.CameraType.Scriptable
-- Store camera properties before zoom
originalProperties._CFrame = camera.CFrame
originalProperties.FieldOfView = camera.FieldOfView
originalProperties.MouseBehavior = UserInputService.MouseBehavior
originalProperties.MouseDeltaSensitivity = UserInputService.MouseDeltaSensitivity
-- Zoom camera
target = mouse.Hit.Position
local eyesight = head.Position
camera.CFrame = CFrame.new(eyesight, target)
camera.Focus = CFrame.new(target)
camera.FieldOfView = 10
-- Lock and slow down mouse
UserInputService.MouseBehavior = Enum.MouseBehavior.LockCenter
UserInputService.MouseDeltaSensitivity = 1
-- Reset zoom angles
AngleX, TargetAngleX = 0, 0
AngleY, TargetAngleY = 0, 0
end
-- Toggle camera zoom/unzoom
local function MouseClick()
if zoomed then
-- Unzoom camera
ResetCamera()
else
-- Zoom in camera
ZoomCamera()
end
zoomed = not zoomed
end
local function MouseMoved(input)
if zoomed then
local sensitivity = 0.6 -- anything higher would make looking up and down harder; recommend anything between 0~1
local smoothness = 0.05 -- recommend anything between 0~1
local delta = Vector2.new(input.Delta.x / sensitivity, input.Delta.y / sensitivity) * smoothness
local X = TargetAngleX - delta.y
local Y = TargetAngleY - delta.x
TargetAngleX = (X >= 80 and 80) or (X <= -80 and -80) or X
TargetAngleY = (Y >= 80 and 80) or (Y <= -80 and -80) or Y
AngleX = AngleX + (TargetAngleX - AngleX) * 0.35
AngleY = AngleY + (TargetAngleY - AngleY) * 0.15
camera.CFrame = CFrame.new(head.Position, target)
* CFrame.Angles(0, math.rad(AngleY), 0)
* CFrame.Angles(math.rad(AngleX), 0, 0)
end
end
local function InputBegan(input, _gameProcessedEvent)
if input.UserInputType == Enum.UserInputType.MouseButton1 then
MouseClick()
end
end
local function InputChanged(input, _gameProcessedEvent)
if input.UserInputType == Enum.UserInputType.MouseMovement then
MouseMoved(input)
end
end
if UserInputService.MouseEnabled then
UserInputService.InputBegan:Connect(InputBegan)
UserInputService.InputChanged:Connect(InputChanged)
end
local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local Players = game:GetService("Players")
local camera = workspace.CurrentCamera
local player = Players.LocalPlayer
local character = player.CharacterAdded:Wait()
local torso = character:WaitForChild("HumanoidRootPart")
local playerPosition = torso.Position
local default_CameraPosition = torso.Position
local default_CameraRotation = Vector2.new(0, math.rad(-60))
local default_CameraZoom = 15
local cameraPosition = default_CameraPosition
local cameraRotation = default_CameraRotation
local cameraZoom = default_CameraZoom
local cameraZoomBounds = nil -- {10,200}
local cameraRotateSpeed = 10
local cameraMouseRotateSpeed = 0.25
local cameraTouchRotateSpeed = 10
local function SetCameraMode()
camera.CameraType = "Scriptable"
camera.FieldOfView = 80
camera.CameraSubject = nil
end
local function UpdateCamera()
SetCameraMode()
local cameraRotationCFrame = CFrame.Angles(0, cameraRotation.X, 0) * CFrame.Angles(cameraRotation.Y, 0, 0)
camera.CFrame = cameraRotationCFrame + cameraPosition + cameraRotationCFrame * Vector3.new(0, 0, cameraZoom)
camera.Focus = camera.CFrame - Vector3.new(0, camera.CFrame.p.Y, 0)
end
local lastTouchTranslation = nil
local function TouchMove(_touchPositions, totalTranslation, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = totalTranslation - lastTouchTranslation
cameraPosition = cameraPosition + Vector3.new(difference.X, 0, difference.Y)
UpdateCamera()
end
lastTouchTranslation = totalTranslation
end
local lastTouchRotation = nil
local function TouchRotate(_touchPositions, rotation, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = rotation - lastTouchRotation
cameraRotation = cameraRotation
+ Vector2.new(-difference, 0) * math.rad(cameraTouchRotateSpeed * cameraRotateSpeed)
UpdateCamera()
end
lastTouchRotation = rotation
end
local lastTouchScale = nil
local function TouchZoom(_touchPositions, scale, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = scale - lastTouchScale
cameraZoom = cameraZoom * (1 + difference)
if cameraZoomBounds ~= nil then
cameraZoom = math.min(math.max(cameraZoom, cameraZoomBounds[1]), cameraZoomBounds[2])
else
cameraZoom = math.max(cameraZoom, 0)
end
UpdateCamera()
end
lastTouchScale = scale
end
local function Input(inputObject)
if inputObject.UserInputType == Enum.UserInputType.Keyboard then
if inputObject.UserInputState == Enum.UserInputState.Begin then
-- (I) Zoom In
if inputObject.KeyCode == Enum.KeyCode.I then
cameraZoom = cameraZoom - 15
elseif inputObject.KeyCode == Enum.KeyCode.O then
cameraZoom = cameraZoom + 15
end
-- (O) Zoom Out
if cameraZoomBounds ~= nil then
cameraZoom = math.min(math.max(cameraZoom, cameraZoomBounds[1]), cameraZoomBounds[2])
else
cameraZoom = math.max(cameraZoom, 0)
end
UpdateCamera()
end
end
local pressed = UserInputService:IsMouseButtonPressed(Enum.UserInputType.MouseButton1)
if pressed then
UserInputService.MouseBehavior = Enum.MouseBehavior.LockCurrentPosition
local rotation = UserInputService:GetMouseDelta()
cameraRotation = cameraRotation + rotation * math.rad(cameraMouseRotateSpeed)
else
UserInputService.MouseBehavior = Enum.MouseBehavior.Default
end
end
local function PlayerChanged()
local movement = torso.Position - playerPosition
cameraPosition = cameraPosition + movement
playerPosition = torso.Position
UpdateCamera()
end
-- Determine whether the user is on a mobile device
if UserInputService.TouchEnabled then
-- The user is on a mobile device, use Touch events
UserInputService.TouchPan:Connect(TouchMove)
UserInputService.TouchRotate:Connect(TouchRotate)
UserInputService.TouchPinch:Connect(TouchZoom)
else
-- The user is not on a mobile device use Input events
UserInputService.InputBegan:Connect(Input)
UserInputService.InputChanged:Connect(Input)
UserInputService.InputEnded:Connect(Input)
-- Camera controlled by player movement
task.wait(2)
RunService:BindToRenderStep("PlayerChanged", Enum.RenderPriority.Camera.Value - 1, PlayerChanged)
end
MouseDeltaSensitivity
คุณสมบัตินี้กำหนดความไวของผู้ใช้ Mouse
ความไวส่งผลกับระดับที่สมบูรณ์แบบที่การเคลื่อนไหวของเมาส์ทางกายสามารถแปลเป็นการเคลื่อนไหวของเมาส์ในเกม ความไวนี้สามารถปรับได้โดยใช้เครื่องมือติดตามการเคลื่อนไหวของเ
สิ่งนี้ไม่ส่งผลต่อการเคลื่อนไหวของไอคอนเมาส์ นอกจากนี้ยังไม่ส่งผลต่อการตั้งค่า ความไวของกล้อง ที่พบในแท็บ การตั้งค่า ของเมนู การตั้งค่า ของลูกค้า
ค่านี้มีมูลค่าสูงสุด 10 และมีมูลค่าต่ำสุด 0 ค่านี้เทียบเคียงกับความไวต่ำและค่านี้สูงขึ้น สำหรับความไวสูง
เมื่อความไวเป็น 0 เหตุการณ์ที่ติดตามการเคลื่อนไหวของเมาส์จะยังคงไฟ แต่ค่าปรับและโปรไฟล์ที่แสดงถึงการเป
ตัวอย่างโค้ด
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 thenprint("The user's device has an available mouse!")elseprint("The user's device does not have an available mouse!")end
มีความสำคัญที่จะตรวจสอบสิ่งนี้ก่อนที่จะใช้งาน UserInputService หน้าเมาส์เช่น UserInputService:GetMouseLocation()
เนื่องจาก UserInputService เป็นข้างล่างเท่านั้น, คุณสมบัตินี้สามารถใช้ได้ใน LocalScript เท่านั้น
ดูเพิ่มเติม:
ตัวอย่างโค้ด
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
สมบัติ ไอคอนเมาส์ ระบุไอเมจที่ใช้เป็นตัวชี้ หากว่างเปล่าจะใช้ลูกศรเริ่มต้น โดยปกติจะใช้ลูกศรเริ่มต้นเป็น Class
เพื่อซ่อนตัวเลือกทั้งหมด อย่าใช้ ไม่ใช้ รูปภาพโปร่งใส. แทนที่, ตั้งค่า UserInputService.MouseIconEnabled เป็น false
ตัวอย่างโค้ด
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 เท่านั้น
ตัวอย่างโค้ด
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
ตัวอย่างโค้ด
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 thenprint("The user's device has a touchscreen!")elseprint("The user's device does not have a touchscreen!")end
ดูเพิ่มเติม:
ตัวอย่างโค้ด
local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local Players = game:GetService("Players")
local camera = workspace.CurrentCamera
local player = Players.LocalPlayer
local character = player.CharacterAdded:Wait()
local torso = character:WaitForChild("HumanoidRootPart")
local playerPosition = torso.Position
local default_CameraPosition = torso.Position
local default_CameraRotation = Vector2.new(0, math.rad(-60))
local default_CameraZoom = 15
local cameraPosition = default_CameraPosition
local cameraRotation = default_CameraRotation
local cameraZoom = default_CameraZoom
local cameraZoomBounds = nil -- {10,200}
local cameraRotateSpeed = 10
local cameraMouseRotateSpeed = 0.25
local cameraTouchRotateSpeed = 10
local function SetCameraMode()
camera.CameraType = "Scriptable"
camera.FieldOfView = 80
camera.CameraSubject = nil
end
local function UpdateCamera()
SetCameraMode()
local cameraRotationCFrame = CFrame.Angles(0, cameraRotation.X, 0) * CFrame.Angles(cameraRotation.Y, 0, 0)
camera.CFrame = cameraRotationCFrame + cameraPosition + cameraRotationCFrame * Vector3.new(0, 0, cameraZoom)
camera.Focus = camera.CFrame - Vector3.new(0, camera.CFrame.p.Y, 0)
end
local lastTouchTranslation = nil
local function TouchMove(_touchPositions, totalTranslation, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = totalTranslation - lastTouchTranslation
cameraPosition = cameraPosition + Vector3.new(difference.X, 0, difference.Y)
UpdateCamera()
end
lastTouchTranslation = totalTranslation
end
local lastTouchRotation = nil
local function TouchRotate(_touchPositions, rotation, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = rotation - lastTouchRotation
cameraRotation = cameraRotation
+ Vector2.new(-difference, 0) * math.rad(cameraTouchRotateSpeed * cameraRotateSpeed)
UpdateCamera()
end
lastTouchRotation = rotation
end
local lastTouchScale = nil
local function TouchZoom(_touchPositions, scale, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = scale - lastTouchScale
cameraZoom = cameraZoom * (1 + difference)
if cameraZoomBounds ~= nil then
cameraZoom = math.min(math.max(cameraZoom, cameraZoomBounds[1]), cameraZoomBounds[2])
else
cameraZoom = math.max(cameraZoom, 0)
end
UpdateCamera()
end
lastTouchScale = scale
end
local function Input(inputObject)
if inputObject.UserInputType == Enum.UserInputType.Keyboard then
if inputObject.UserInputState == Enum.UserInputState.Begin then
-- (I) Zoom In
if inputObject.KeyCode == Enum.KeyCode.I then
cameraZoom = cameraZoom - 15
elseif inputObject.KeyCode == Enum.KeyCode.O then
cameraZoom = cameraZoom + 15
end
-- (O) Zoom Out
if cameraZoomBounds ~= nil then
cameraZoom = math.min(math.max(cameraZoom, cameraZoomBounds[1]), cameraZoomBounds[2])
else
cameraZoom = math.max(cameraZoom, 0)
end
UpdateCamera()
end
end
local pressed = UserInputService:IsMouseButtonPressed(Enum.UserInputType.MouseButton1)
if pressed then
UserInputService.MouseBehavior = Enum.MouseBehavior.LockCurrentPosition
local rotation = UserInputService:GetMouseDelta()
cameraRotation = cameraRotation + rotation * math.rad(cameraMouseRotateSpeed)
else
UserInputService.MouseBehavior = Enum.MouseBehavior.Default
end
end
local function PlayerChanged()
local movement = torso.Position - playerPosition
cameraPosition = cameraPosition + movement
playerPosition = torso.Position
UpdateCamera()
end
-- Determine whether the user is on a mobile device
if UserInputService.TouchEnabled then
-- The user is on a mobile device, use Touch events
UserInputService.TouchPan:Connect(TouchMove)
UserInputService.TouchRotate:Connect(TouchRotate)
UserInputService.TouchPinch:Connect(TouchZoom)
else
-- The user is not on a mobile device use Input events
UserInputService.InputBegan:Connect(Input)
UserInputService.InputChanged:Connect(Input)
UserInputService.InputEnded:Connect(Input)
-- Camera controlled by player movement
task.wait(2)
RunService:BindToRenderStep("PlayerChanged", Enum.RenderPriority.Camera.Value - 1, PlayerChanged)
end
VREnabled
สมบัตินี้อธิบายว่าผู้ใช้กำลังใช้อุปกรณ์เสมือนความเป็นจริง (VR)
หากเปิดใช้งานอุปกรณ์ VR คุณสามารถใช้งานได้ผ่านตำแหน่งและการเคลื่อนที่ของมันผ่านผ่านระบบต่างๆเช่น UserInputService:GetUserCFrame() คุณยังสามารถตอบกลับการเคลื่อนที่ของอุปกรณ์
local UserInputService = game:GetService("UserInputService")local isUsingVR = UserInputService.VREnabledif isUsingVR thenprint("User is using a VR headset!")elseprint("User is not using a VR headset!")end
เนื่องจาก UserInputService เป็นข้างล่างเท่านั้น, คุณสมบัตินี้สามารถใช้ได้ใน LocalScript เท่านั้น
ดูเพิ่มเติม:
ตัวอย่างโค้ด
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 เท่านั้น
ดูเพิ่มเติม:
พารามิเตอร์
The Enum.UserInputType ของ gamepad
The Enum.KeyCode ของปุ่มในคำถาม
ส่งค่ากลับ
ว่า gamepad ที่ให้สนับสนุนปุ่มที่ตรงกับ Enum.KeyCode หรือไม่
ตัวอย่างโค้ด
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 รายการที่ตรงกับแพดพิงเกมที่เชื่อมต่อกับอุปกรณ์ของผู้ใช้
ตัวอย่างโค้ด
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 เท่านั้น
ส่งค่ากลับ
ตัวอย่างโค้ด
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 เท่านั้น
ส่งค่ากลับ
ตัวอย่างโค้ด
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 เท่านั้น
ส่งค่ากลับ
ตัวแปรที่มีสองค่า:
- ค่าดีลตาร์ระบุจำนวนการหมุนที่เกิดขึ้นครั้งสุดท้าย
- CFrame คือการหมุนของอุปกรณ์ที่เกี่ยวข้องกับเฟรมอ้างอิงเริ่มต้นของมัน
ตัวอย่างโค้ด
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 เท่านั้น
ดูเพิ่มเติม:
ส่งค่ากลับ
ตัวอย่างโค้ด
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 เท่านั้น
ดูเพิ่มเติม:
พารามิเตอร์
The Enum.UserInputType ของ gamepad ในคำถาม
ส่งค่ากลับ
ว่าเกมพาดพนับที่เกี่ยวข้องกับ Enum.UserInputType เชื่อมต่อหรือไม่
ตัวอย่างโค้ด
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 เท่านั้น
ดูเพิ่มเติม:
พารามิเตอร์
Entity.UserInputType ที่ตรงกับเกมพาดในขณะนี้
ส่งค่ากลับ
Class.InputObject|InputObjects รายการที่แทนที่สถานะปัจจุบันของการป้อนข้อมูลทั้งหมดสำหรับแผ่น gamepad ที่ให้
GetImageForKeyCode
วิธีนี้ใช้ Enum.KeyCode ที่ร้องขอและสร้างภาพที่เกี่ยวข้องสำหรับเครื่องประกบที่เชื่อมต่ออยู่ (จำกัดไว้ที่ Xbox, PlayStation และ Windows) หาก
พารามิเตอร์
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 รายการที่เกี่ยวข้องกับกุญแจที่กดอยู่ในขณะนี้
ตัวอย่างโค้ด
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 ที่เกี่ยวข้องกับการป้อนข้อมูลล่าสุดของผู้ใช้
ตัวอย่างโค้ด
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 รายการที่เกี่ยวข้องกับปุ่มเมาส์ที่กดไว้ในขณะนี้
ตัวอย่างโค้ด
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 เท่านั้น
ส่งค่ากลับ
เปลี่ยนแปลงการเคลื่อนที่ของเมาส์
ตัวอย่างโค้ด
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local function OnRenderStep()
local delta = UserInputService:GetMouseDelta()
print("The mouse has moved", delta, "since the last step.")
end
RunService:BindToRenderStep("MeasureMouseMovement", Enum.RenderPriority.Input.Value, OnRenderStep)
local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local Players = game:GetService("Players")
local camera = workspace.CurrentCamera
local player = Players.LocalPlayer
local character = player.CharacterAdded:Wait()
local torso = character:WaitForChild("HumanoidRootPart")
local playerPosition = torso.Position
local default_CameraPosition = torso.Position
local default_CameraRotation = Vector2.new(0, math.rad(-60))
local default_CameraZoom = 15
local cameraPosition = default_CameraPosition
local cameraRotation = default_CameraRotation
local cameraZoom = default_CameraZoom
local cameraZoomBounds = nil -- {10,200}
local cameraRotateSpeed = 10
local cameraMouseRotateSpeed = 0.25
local cameraTouchRotateSpeed = 10
local function SetCameraMode()
camera.CameraType = "Scriptable"
camera.FieldOfView = 80
camera.CameraSubject = nil
end
local function UpdateCamera()
SetCameraMode()
local cameraRotationCFrame = CFrame.Angles(0, cameraRotation.X, 0) * CFrame.Angles(cameraRotation.Y, 0, 0)
camera.CFrame = cameraRotationCFrame + cameraPosition + cameraRotationCFrame * Vector3.new(0, 0, cameraZoom)
camera.Focus = camera.CFrame - Vector3.new(0, camera.CFrame.p.Y, 0)
end
local lastTouchTranslation = nil
local function TouchMove(_touchPositions, totalTranslation, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = totalTranslation - lastTouchTranslation
cameraPosition = cameraPosition + Vector3.new(difference.X, 0, difference.Y)
UpdateCamera()
end
lastTouchTranslation = totalTranslation
end
local lastTouchRotation = nil
local function TouchRotate(_touchPositions, rotation, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = rotation - lastTouchRotation
cameraRotation = cameraRotation
+ Vector2.new(-difference, 0) * math.rad(cameraTouchRotateSpeed * cameraRotateSpeed)
UpdateCamera()
end
lastTouchRotation = rotation
end
local lastTouchScale = nil
local function TouchZoom(_touchPositions, scale, _velocity, state)
if state == Enum.UserInputState.Change or state == Enum.UserInputState.End then
local difference = scale - lastTouchScale
cameraZoom = cameraZoom * (1 + difference)
if cameraZoomBounds ~= nil then
cameraZoom = math.min(math.max(cameraZoom, cameraZoomBounds[1]), cameraZoomBounds[2])
else
cameraZoom = math.max(cameraZoom, 0)
end
UpdateCamera()
end
lastTouchScale = scale
end
local function Input(inputObject)
if inputObject.UserInputType == Enum.UserInputType.Keyboard then
if inputObject.UserInputState == Enum.UserInputState.Begin then
-- (I) Zoom In
if inputObject.KeyCode == Enum.KeyCode.I then
cameraZoom = cameraZoom - 15
elseif inputObject.KeyCode == Enum.KeyCode.O then
cameraZoom = cameraZoom + 15
end
-- (O) Zoom Out
if cameraZoomBounds ~= nil then
cameraZoom = math.min(math.max(cameraZoom, cameraZoomBounds[1]), cameraZoomBounds[2])
else
cameraZoom = math.max(cameraZoom, 0)
end
UpdateCamera()
end
end
local pressed = UserInputService:IsMouseButtonPressed(Enum.UserInputType.MouseButton1)
if pressed then
UserInputService.MouseBehavior = Enum.MouseBehavior.LockCurrentPosition
local rotation = UserInputService:GetMouseDelta()
cameraRotation = cameraRotation + rotation * math.rad(cameraMouseRotateSpeed)
else
UserInputService.MouseBehavior = Enum.MouseBehavior.Default
end
end
local function PlayerChanged()
local movement = torso.Position - playerPosition
cameraPosition = cameraPosition + movement
playerPosition = torso.Position
UpdateCamera()
end
-- Determine whether the user is on a mobile device
if UserInputService.TouchEnabled then
-- The user is on a mobile device, use Touch events
UserInputService.TouchPan:Connect(TouchMove)
UserInputService.TouchRotate:Connect(TouchRotate)
UserInputService.TouchPinch:Connect(TouchZoom)
else
-- The user is not on a mobile device use Input events
UserInputService.InputBegan:Connect(Input)
UserInputService.InputChanged:Connect(Input)
UserInputService.InputEnded:Connect(Input)
-- Camera controlled by player movement
task.wait(2)
RunService:BindToRenderStep("PlayerChanged", Enum.RenderPriority.Camera.Value - 1, PlayerChanged)
end
GetMouseLocation
ฟังก์ชันนี้กลับมาเป็น Vector2 ที่แทนที่ตำแหน่งหน้าจอปัจจุบันของผู้เล่น Mouse ในพิกเซลสัมพันธ์กับมุมด้านบนซ้าย
หากตำแหน่งของเมาส์เป็น offscreen หรืออุปกรณ์ของผู้เล่นไม่มีเมาส์ ผลที่กลับมาจะไม่ได้รับการกำหนด
เนื่องจาก UserInputService เป็นข้างล่างเท่านั้น, ฟังก์ชันนี้สามารถใช้ได้ใน LocalScript เท่านั้น
ส่งค่ากลับ
ตัวอย่างโค้ด
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.Parentlocal mapKey = Enum.KeyCode.MtextLabel.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.Parentlocal key = Enum.KeyCode.ButtonAlocal mappings = {ButtonA = "rbxasset://BUTTON_A_ASSET", -- Replace with the desired ButtonA assetButtonCross = "rbxasset://BUTTON_CROSS_ASSET" -- Replace with the desired ButtonCross asset}local mappedKey = UserInputService:GetStringForKeyCode(key)local image = mappings[mappedKey]imageLabel.Image = image
การตั้งค่า 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>
รหัสสําคัญ | รูป | รหัสสินทรัพย์ |
---|
พารามิเตอร์
ส่งค่ากลับ
GetSupportedGamepadKeyCodes
ฟังก์ชันนี้กลับรายการ KeyCodes ที่ gamepad ที่เกี่ยวข้องกับ key ให้การสนับสนุน Enum.UserInputType
ฟังก์ชันนี้สามารถใช้เพื่อระบุว่า KeyCodes ใดที่สนับสนุนและไม่สนับสนุนโดยเกมแพดที่เชื่อมต่อ เพื่อระบุว่า KeyCodes บางอย่างได้รับการสนับสนุนหรือไม่ได้รับการสนับสนุนโดยเกมแพดที่เชื่อมต่อ ใช้ Class
หากเรียกในเกมพาดที่ไม่มีอยู่หรือไม่เชื่อมต่อเกมแพด, ฟังก์ชันนี้จะกลับค่ารายการที่ว่างเปล่า
เนื่องจาก UserInputService เป็นข้างล่างเท่านั้น, ฟังก์ชันนี้สามารถใช้ได้ใน LocalScript เท่านั้น
ดูเพิ่มเติม:
พารามิเตอร์
The Enum.UserInputType ของ gamepad
ส่งค่ากลับ
KeyCode|KeyCodes รายการที่สนับสนุนโดย gamepad ที่ระบุ
ตัวอย่างโค้ด
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.ButtonAlocal gamepad = Enum.UserInputType.Gamepad1local isButtonHeld = UserInputService:IsGamepadButtonDown(gamepad, button)
เนื่องจาก UserInputService เป็นข้างล่างเท่านั้น, ฟังก์ชันนี้สามารถใช้ได้ใน LocalScript เท่านั้น
ดูเพิ่มเติม:
- UserInputService:IsKeyDown() - วิธีการที่คล้ายกันด้วยการใช้งานที่แตกต่างกัน: เพื่อตรวจสอบว่า key ที่ให้บน keyboard ถูกกดหรือไม่
พารามิเตอร์
The Enum.UserInputType ของ gamepad ที่ให้
The Enum.KeyCode ของปุ่มที่ระบุ
ส่งค่ากลับ
ว่าปุ่ม gamepad ที่ระบุไว้บน gamepad ที่ให้นั้นจะถูกกดหรือไม่
ตัวอย่างโค้ด
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 ถูกกด
พารามิเตอร์
The Enum.KeyCode คีย์
ส่งค่ากลับ
ว่าคีย์ที่กำหนดไว้จะถูกกดลงหรือไม่
ตัวอย่างโค้ด
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 เท่านั้น"
พารามิเตอร์
The Enum.UserInputType ของปุ่มเมาส์
ส่งค่ากลับ
ว่าปุ่มเมาส์ที่ให้นั้นถูกกดไว้หรือไม่
ตัวอย่างโค้ด
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) thenprint("Gamepad is a navigation gamepad!")elseprint("Gamepad is not a navigation gamepad!")end
รายการของแพดพิงเกมทั้งหมดที่เชื่อมต่อสามารถดึงได้โดยใช้ `UserInput/GetConnectedGamepads
เนื่องจาก UserInputService เป็นข้างล่างเท่านั้น, ฟังก์ชันนี้สามารถใช้ได้ใน LocalScript เท่านั้น
ดูเพิ่มเติม:
พารามิเตอร์
The Enum.UserInputType ของ gamepad ที่ระบุ
ส่งค่ากลับ
ว่า gamepad ที่ระบุเป็นเกมแห่งการนำทาง
RecenterUserHeadCFrame
ระบบนี้ให้ความสำเร็จของ CFrame ของหมวก VR ไปยังตำแหน่งปัจจุบันของหมวกที่สวมใส่โดยผู้ใช้ เฮดเซ็ทCFrame.new()
ใช้งานนี้เพื่อย้ายหมวก CFrame ไปยังศูนย์กลางของพื้นที่เล่นหากมันดูเหมือนจะอยู่ในขอบเขตที่แปลก
พฤติกรรมนี้เหมือนกับฟังก์ชัน VRService และ VRService:RecenterUserHeadCFrame()
เนื่องจาก UserInputService เป็นข้างล่างเท่านั้น, ฟังก์ชันนี้สามารถใช้ได้ใน LocalScript เท่านั้น
ส่งค่ากลับ
ตัวอย่างโค้ด
local UserInputService = game:GetService("UserInputService")
UserInputService:RecenterUserHeadCFrame()
SetNavigationGamepad
การตั้งค่า NavigationGamepad ตั้งค่าว่า Enum.UserInputType แผงเกมส์สามารถเคลื่อนย้ายนาวิเกเตอร์ GUI ได้หรือไม่ แผงเกมส์ที่สามารถเคลื่อนย้ายนาวิเกเตอร์ GUI ได้จะถูกจัดประเภทเป็น เกมส์นาวิเก
หาก เปิดใช้งานได้อย่างเป็นทางการเป็น true ตัวอ้างจะทำให้ Gamepad สามารถเคลื่อนย้ายได้ navigator GUI หาก เป็น 1> false1> ตัวอ้างจะทำให้ Gamepad ไม่สามารถเคลื่อนย้ายได้ navigator GUI
หากคุณต้องการตรวจสอบว่า Gamepad ที่กำหนดเป็นเกมแนวนำทางหรือไม่ คุณสามารถใช้ฟังก์ชัน UserInputService:IsNavigationGamepad() ได้ นอกจากนี้คุณยังสามารถใช้ฟังก์ชัน Class.UserInputService:GetNavigationGamepads()
เนื่องจาก UserInputService เป็นข้างล่างเท่านั้น, ฟังก์ชันนี้สามารถใช้ได้ใน LocalScript เท่านั้น
ดูเพิ่มเติม:
พารามิเตอร์
The Enum.UserInputType ของ gamepad ที่ระบุ
ว่า gamepad ที่ระบุสามารถเคลื่อนย้าย GUI Navigator ได้หรือไม่
ส่งค่ากลับ
ตัวอย่างโค้ด
local UserInputService = game:GetService("UserInputService")
UserInputService:SetNavigationGamepad(Enum.UserInputType.Gamepad1, true)
อีเวนต์
DeviceAccelerationChanged
เหตุการณ์ DeviceAccelerationChanged จะเกิดขึ้นเมื่อผู้ใช้ย้ายอุปกรณ์ที่มีเครื่องวัดความเร่ง
เครื่องวัดความเร่ง (เปลี่ยนแปลงในความเร็ว) เป็นส่วนประกอบที่พบในอุปกรณ์มือถือส่วนใหญ่ที่วัดความเร่ง (เปลี่ยนแปลงในความเร็ว)
เพื่อตรวจสอบว่าอุปกรณ์ของผู้ใช้มีเครื่องวัดความเร่งหรือไม่ให้ดูที่ UserInputService.AccelerometerEnabled
กิจกรรมนี้สามารถใช้เพื่อติดตามการเคลื่อนที่ของอุปกรณ์ที่มีเครื่องวัดความเร่ง การใช้ตัวอย่างจะรวมถึงการเคลื่อนไหวตัวละครของผู้ใช้เมื่ออุปกรณ์เคลื่อนที่ด้วยความเร็ว
นอกจากนี้ยังสามารถใช้ร่วมกับ UserInputService:GetDeviceAcceleration() เพื่อระบุการเคลื่อนที่ปัจจุบันของอุปกรณ์ของผู้ใช้หากอุปกรณ์มีเครื่องวัดความเร่ง
เหตุการณ์นี้จะเกิดขึ้นเฉพาะในพื้นที่ - ซึ่งหมายความว่าเฉพาะผู้เล่นที่มีอุปกรณ์เคลื่อนที่สามารถใช้เหตุการณ์นี้และมันจะทำงานใน LocalScript เท่านั้น
พารามิเตอร์
Class.InputObject ที่มี UserInputType ของ เครื่องวัดความเร่ง และ 1>Class.InputObject.Position|Position1> ที่แสดงอาการเร่งแรงบนแกนหลักของแต่ละอุปกรณ์
ตัวอย่างโค้ด
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 หากอุปกรณ์มีเครื่องวัดความเร่งที่เปิดใช้งานคุณสามารถใช้
พารามิเตอร์
Class.InputObject ที่มี InputObject.Position สมบัติสมุดที่แสดงตำแหน่งแรงโน้มถ่วงบนแกนต่างๆ ของอุปกรณ์ ตำแหน่งนี้สามารถใช้เป็นทิศทางเพื่อกำหนดทิศทางแรงโน้มถ่วงเมื่อเป็นสัดส่วนก
ตัวอย่างโค้ด
local Workspace = game:GetService("Workspace")
local UserInputService = game:GetService("UserInputService")
local ball = script.Parent:WaitForChild("Ball")
local mass = ball:GetMass()
local gravityForce = ball:WaitForChild("GravityForce")
local function moveBall(gravity)
gravityForce.Force = gravity.Position * Workspace.Gravity * mass
end
if UserInputService.AccelerometerEnabled then
UserInputService.DeviceGravityChanged:Connect(moveBall)
end
local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local character = player.CharacterAdded:Wait()
local head = character:WaitForChild("Head")
local camera = workspace.CurrentCamera
local currentRotation = camera.CFrame -- CFrame.new(Vector3.new(0,0,0), Vector3.new(0,0,0))
local lastInputFrame = nil
local upsideDown = false
task.wait()
local orientationSet = false
local function GravityChanged(gravity)
if not orientationSet then
upsideDown = (gravity.Position.X < -0.5 or gravity.Position.Z > 0.5)
orientationSet = true
end
end
local function RotationChanged(_rotation, rotCFrame)
if orientationSet then
if not lastInputFrame then
lastInputFrame = rotCFrame
end
local delta = rotCFrame * lastInputFrame:inverse()
local x, y, z = delta:ToEulerAnglesXYZ()
if upsideDown then
delta = CFrame.Angles(-x, y, z)
else
delta = CFrame.Angles(x, -y, z)
end
currentRotation = currentRotation * delta
lastInputFrame = rotCFrame
end
end
local function HideCharacter()
for _, limb in pairs(character:GetChildren()) do
if limb:IsA("Part") then
limb.Transparency = 1
end
end
end
if UserInputService.GyroscopeEnabled then
UserInputService.DeviceGravityChanged:Connect(GravityChanged)
UserInputService.DeviceRotationChanged:Connect(RotationChanged)
HideCharacter()
RunService:BindToRenderStep("Camera", Enum.RenderPriority.Camera.Value, function()
camera.CFrame = CFrame.new(head.Position - Vector3.new(0, 8, 10)) * currentRotation
camera.Focus = CFrame.new(currentRotation * Vector3.new(0, 0, -10))
end)
end
DeviceRotationChanged
เหตุการณ์ DeviceRotationChanged จะเกิดขึ้นเมื่อผู้ใช้หมุนอุปกรณ์ที่มีเครื่องวัดความเร่ง
เซ็นเซอร์กายโรสโกปี้เป็นส่วนประกอบที่พบในอุปกรณ์มือถือส่วนใหญ่ที่ตรวจจับการเปลี่ยนแปลงทางกายภาพและความเร็วในการหมุน
เหตุการณ์เป็นประโยชน์เมื่อติดตามการเรียงลำดับของอุปกรณ์และวิธีการเปลี่ยนแปลงเมื่อผู้ใช้หมุนอุปกรณ์ของพวกเขา เพื่อกำหนดการหมุนของอุปกรณ์ปัจจุบันคุณสามารถใช้คุณสมบัติ Class.UserInputService:GetDeviceRotation()
เพื่อตรวจสอบว่าอุปกรณ์ของผู้ใช้มีเครื่องวัดแรงโน้มถ่วงที่เปิดใช้งาน และเหตุการณ์นี้จะเกิดขึ้น ดู UserInputService.GyroscopeEnabled
เหตุการณ์นี้จะเกิดขึ้นเฉพาะเมื่อหน้าต่างของลูกค้า Roblox อยู่ในโฟกัส โดยเฉพาะอย่างยิ่งการป้อนข้อมูลจะไม่ถูกจับกุมเมื่อหน้าต่างถูกขนาดเล็ก
พารามิเตอร์
Class.InputObject ที่ให้ข้อมูลเกี่ยวกับการหมุนของอุปกรณ์ InputObject.Position 代表新的旋转位置 Vector3 代表位置 และ 1> Class.InputObject.Delta1> 代表位置ใ
ตัวอย่างโค้ด
local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local Players = game:GetService("Players")
local player = Players.LocalPlayer
local character = player.CharacterAdded:Wait()
local head = character:WaitForChild("Head")
local camera = workspace.CurrentCamera
local currentRotation = camera.CFrame -- CFrame.new(Vector3.new(0,0,0), Vector3.new(0,0,0))
local lastInputFrame = nil
local upsideDown = false
task.wait()
local orientationSet = false
local function GravityChanged(gravity)
if not orientationSet then
upsideDown = (gravity.Position.X < -0.5 or gravity.Position.Z > 0.5)
orientationSet = true
end
end
local function RotationChanged(_rotation, rotCFrame)
if orientationSet then
if not lastInputFrame then
lastInputFrame = rotCFrame
end
local delta = rotCFrame * lastInputFrame:inverse()
local x, y, z = delta:ToEulerAnglesXYZ()
if upsideDown then
delta = CFrame.Angles(-x, y, z)
else
delta = CFrame.Angles(x, -y, z)
end
currentRotation = currentRotation * delta
lastInputFrame = rotCFrame
end
end
local function HideCharacter()
for _, limb in pairs(character:GetChildren()) do
if limb:IsA("Part") then
limb.Transparency = 1
end
end
end
if UserInputService.GyroscopeEnabled then
UserInputService.DeviceGravityChanged:Connect(GravityChanged)
UserInputService.DeviceRotationChanged:Connect(RotationChanged)
HideCharacter()
RunService:BindToRenderStep("Camera", Enum.RenderPriority.Camera.Value, function()
camera.CFrame = CFrame.new(head.Position - Vector3.new(0, 8, 10)) * currentRotation
camera.Focus = CFrame.new(currentRotation * Vector3.new(0, 0, -10))
end)
end
local Workspace = game:GetService("Workspace")
local UserInputService = game:GetService("UserInputService")
local ball = script.Parent:WaitForChild("Ball")
local mass = ball:GetMass()
local gravityForce = ball:WaitForChild("GravityForce")
local function moveBall(gravity)
gravityForce.Force = gravity.Position * Workspace.Gravity * mass
end
if UserInputService.AccelerometerEnabled then
UserInputService.DeviceGravityChanged:Connect(moveBall)
end
GamepadConnected
เหตุการณ์ 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 เท่านั้น
ดูเพิ่มเติม:
พารามิเตอร์
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 เท่านั้น
ดูเพิ่มเติม:
พารามิเตอร์
เมนูผู้ใช้ ของ gamepad ที่ตัดการเชื่อมต่อ
InputBegan
เหตุการณ์ InputBegan จะเกิดขึ้นเมื่อผู้ใช้เริ่มต้นใช้งานผ่านอุปกรณ์ Human-Computer Interface ต่างๆ (ปุ่มเมาส์ลง, แตะเริ่ม, ปุ่มกล้องสัมผัส, ฯลฯ)
สามารถใช้เพื่อติดตามจุดเริ่มต้นของการใช้งานของผู้ใช้ เช่นเมื่อผู้ใช้ใช้งาน GUI ครั้งแรก การเคลื่อนไหวของวงล้อเมาส์ ฯลฯ ไม่ได้จับการเคลื่อนไหวของล้อเมาส์
เหตุการณ์นี้สามารถใช้ร่วมกับ UserInputService.InputChanged และ UserInputService.InputEnded เพื่อติดตามเมื่อผู้ใช้เริ่มต้นให้ข้อมูลเริ่มต้น เปลี่ยนแปลง และจบลง
เหตุการณ์นี้จะเกิดขึ้นเฉพาะเมื่อหน้าต่างของลูกค้า Roblox อยู่ในโฟกัส โดยเฉพาะอย่างยิ่งการป้อนข้อมูลจะไม่ถูกจับกุมเมื่อหน้าต่างถูกขนาดเล็ก
เนื่องจากเหตุการณ์นี้เฉพาะกับพื้นที่โคลนเท่านั้น จึงสามารถใช้ได้ใน LocalScript เท่านั้น
พารามิเตอร์
ตัวอย่าง InputObject ซึ่งมีข้อมูลเกี่ยวกับการป้อนของผู้ใช้
ระบุว่าเครื่องมือเกมส์สังเกตเห็นการป้อนข้อมูลนี้และดำเนินการต่อมัน โดยปกตินี่เกี่ยวข้องกับการประมวลผล UI ดังนั้นหากปุ่มถูกแตะหรือคลิกจากการป้อนข้
ตัวอย่างโค้ด
-- 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 ซึ่งมีข้อมูลเกี่ยวกับการป้อนของผู้ใช้
ระบุว่าเครื่องมือเกมส์สังเกตเห็นการป้อนข้อมูลนี้และดำเนินการต่อมัน โดยปกตินี่เกี่ยวข้องกับการประมวลผล UI ดังนั้นหากปุ่มถูกแตะหรือคลิกจากการป้อนข้
ตัวอย่างโค้ด
-- 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 ซึ่งมีข้อมูลเกี่ยวกับการป้อนของผู้ใช้
ระบุว่าเครื่องมือเกมส์สังเกตเห็นการป้อนข้อมูลนี้และดำเนินการต่อมัน โดยปกตินี่เกี่ยวข้องกับการประมวลผล UI ดังนั้นหากปุ่มถูกแตะหรือคลิกจากการป้อนข้
ตัวอย่างโค้ด
-- 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 เท่านั้น
ตัวอย่างโค้ด
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 เท่านั้น
พารามิเตอร์
A Enum.UserInputType พิมพ์
ตัวอย่างโค้ด
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 แอ็คชันโดยเฉพาะการเลื่อนล้อเมาส์
พารามิเตอร์
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 เท่านั้น
ดูเพิ่มเติม:
พารามิเตอร์
Class.Toolbar ที่สูญเสียโฟกัส
ตัวอย่างโค้ด
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 เท่านั้น
ดูเพิ่มเติม:
พารามิเตอร์
Class.Toolbar ที่ได้รับการโฟกัส
ตัวอย่างโค้ด
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 ซึ่งมีข้อมูลเกี่ยวกับการป้อนของผู้ใช้
ระบุว่าเครื่องมือเกมส์สังเกตเห็นการป้อนข้อมูลนี้และดำเนินการต่อมัน โดยปกตินี่เกี่ยวข้องกับการประมวลผล UI ดังนั้นหากปุ่มถูกแตะหรือคลิกจากการป้อนข้
ตัวอย่างโค้ด
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 เท่านั้น
ดูเพิ่มเติม:
พารามิเตอร์
สถานะ Enum.UserInputState ของการเคลื่อนไหว
ระบุว่าเครื่องมือเกมส์สังเกตเห็นการป้อนข้อมูลนี้และดำเนินการต่อมัน โดยปกตินี่เกี่ยวข้องกับการประมวลผล UI ดังนั้นหากปุ่มถูกแตะหรือคลิกจากการป้อนข้
ตัวอย่างโค้ด
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 ซึ่งมีข้อมูลเกี่ยวกับการป้อนของผู้ใช้
ระบุว่าเครื่องมือเกมส์สังเกตเห็นการป้อนข้อมูลนี้และดำเนินการต่อมัน โดยปกตินี่เกี่ยวข้องกับการประมวลผล UI ดังนั้นหากปุ่มถูกแตะหรือคลิกจากการป้อนข้
ตัวอย่างโค้ด
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 เท่านั้น
ดูเพิ่มเติม:
พารามิเตอร์
รายการ Vector2 ตัวอย่างที่แสดงตำแหน่งของปุ่ม (เช่น นิ้ว) ที่เกี่ยวข้องในการเคลื่อนไหว
ขนาดของการเคลื่อนไหวของกระทะ (ในพิกเซล)
ความเร็วของการเคลื่อนไหวของแป้น (ในพิกเซลต่อวินาที)
สถานะ Enum.UserInputState ของการเคลื่อนไหว
ระบุว่าเครื่องมือเกมส์สังเกตเห็นการป้อนข้อมูลนี้และดำเนินการต่อมัน โดยปกตินี่เกี่ยวข้องกับการประมวลผล UI ดังนั้นหากปุ่มถูกแตะหรือคลิกจากการป้อนข้
ตัวอย่างโค้ด
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 เป็นของโฟกัส โดยปกติแล้วการป้อนข้อมูลจะไม่ถูกจับกุมเมื่อหน้าต่างถูกขนาดเล็ก เช่น การป้อนข้อมูลจะไม่ถูกจับกุมเมื่อหน้าต่างถูกขน
ดูเพิ่มเติม:
พารามิเตอร์
Datatype.Vector2|Vector2s รายการที่แสดงตำแหน่งหน้าจอในพิกเซลของนิ้วของผู้ใช้ที่เกี่ยวข้องในการเลื่อนแป้น
ความเข้มของการเจาะจากจุดเริ่มต้นไปจนถึงจุดสิ้นสุด (ในพิกเซล) หารกับตำแหน่งของการเจาะ
ความเร็วของการเคลื่อนไหวของการกด (ในพิกเซล) ต่อวินาที
สถานะ Enum.UserInputState ของการเคลื่อนไหว
ระบุว่าเครื่องมือเกมส์สังเกตเห็นการป้อนข้อมูลนี้และดำเนินการต่อมัน โดยปกตินี่เกี่ยวข้องกับการประมวลผล UI ดังนั้นหากปุ่มถูกแตะหรือคลิกจากการป้อนข้
ตัวอย่างโค้ด
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 เท่านั้น
สคริปต์การควบคุมกล้องของผู้ใช้บนอุปกรณ์มือถือใช้โค้ดที่ทำงานได้เหมือนกับเหตุการณ์นี้ การฝึกซ้อมที่ดีที่สุดสำหรับเหตุการณ์นี้คือการใช้โค้ดนี้เมื่อสร้างระบบกล้องมือถือเพื่อเปลี่ยนแปลงสคริป
ดูเพิ่มเติม:
พารามิเตอร์
Datatype.Vector2|Vector2s รายการที่แสดงตำแหน่งของนิ้วที่เกี่ยวข้องในการเคลื่อนไหว
จำนวนองศาที่เกิดขึ้นตั้งแต่เริ่มเคลื่อนไหว
การเปลี่ยนแปลงในแกน (ในองศา) ที่แบ่งโดยระยะเวลาของการเปลี่ยนแปลง (ในวินาที)
สถานะ Enum.UserInputState ของการเคลื่อนไหว
ระบุว่าเครื่องมือเกมส์สังเกตเห็นการป้อนข้อมูลนี้และดำเนินการต่อมัน โดยปกตินี่เกี่ยวข้องกับการประมวลผล UI ดังนั้นหากปุ่มถูกแตะหรือคลิกจากการป้อนข้
ตัวอย่างโค้ด
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 ซึ่งมีข้อมูลเกี่ยวกับการป้อนของผู้ใช้
ระบุว่าเครื่องมือเกมส์สังเกตเห็นการป้อนข้อมูลนี้และดำเนินการต่อมัน โดยปกตินี่เกี่ยวข้องกับการประมวลผล UI ดังนั้นหากปุ่มถูกแตะหรือคลิกจากการป้อนข้
ตัวอย่างโค้ด
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 เท่านั้น
ดูเพิ่มเติม:
พารามิเตอร์
Direction.SwipeDirection การแสดงทิศทางที่ผู้ใช้สวิป
จำนวนการแตะ (เช่นนิ้วมือ) ที่เกี่ยวข้องกับการเคลื่อนไหว
ระบุว่าเครื่องมือเกมส์สังเกตเห็นการป้อนข้อมูลนี้และดำเนินการต่อมัน โดยปกตินี่เกี่ยวข้องกับการประมวลผล UI ดังนั้นหากปุ่มถูกแตะหรือคลิกจากการป้อนข้
ตัวอย่างโค้ด
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 เท่านั้น
พารามิเตอร์
ระบุว่าเครื่องมือเกมส์สังเกตเห็นการป้อนข้อมูลนี้และดำเนินการต่อมัน โดยปกตินี่เกี่ยวข้องกับการประมวลผล UI ดังนั้นหากปุ่มถูกแตะหรือคลิกจากการป้อนข้
ตัวอย่างโค้ด
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 เท่านั้น
ดูเพิ่มเติม:
พารามิเตอร์
ตัวอย่างโค้ด
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 เท่านั้น
ตัวอย่างโค้ด
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local afkEvent = Instance.new("RemoteEvent")
afkEvent.Name = "AfkEvent"
afkEvent.Parent = ReplicatedStorage
local function setAfk(player, afk)
if afk then
local forcefield = Instance.new("ForceField")
forcefield.Parent = player.Character
else
local forcefield = player.Character:FindFirstChildOfClass("ForceField")
if forcefield then
forcefield:Destroy()
end
end
end
afkEvent.OnServerEvent:Connect(setAfk)
local UserInputService = game:GetService("UserInputService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local afkEvent = ReplicatedStorage:WaitForChild("AfkEvent")
local function focusGained()
afkEvent:FireServer(false)
end
local function focusReleased()
afkEvent:FireServer(true)
end
UserInputService.WindowFocused:Connect(focusGained)
UserInputService.WindowFocusReleased:Connect(focusReleased)
WindowFocused
เหตุการณ์ UserInputService WindowFocused เกิดขึ้นเมื่อหน้าต่างของ Roblox ได้รับการโฟกัสเมื่อหน้าต่างของ Roblox เป็นสีสัน - โดยปกติเมื่อ Roblox เป็นสีสัน/เปิดอยู่บนหน้าจอของผู้ใช้
เช่นเดียวกับรหัสด้านล่างพิมพ์ "หน้าต่างมุ่งเน้น" เมื่อได้รับการโฟกัสของ Roblox คลาย
local UserInputService = game:GetService("UserInputService")
UserInputService.WindowFocused:Connect(function()
print("Window focused")
end)
เหตุการณ์นี้สามารถใช้ร่วมกับ UserInputService.WindowFocusReleased เพื่อติดตามว่าเครื่องมือ Roblox จะมุ่งเน้นไปที่หน้าจอของผู้ใช้หรือไม่
เนื่องจากเหตุการณ์นี้เฉพาะกับพื้นที่โคลนเท่านั้น จึงสามารถใช้ได้ใน LocalScript เท่านั้น
ตัวอย่างโค้ด
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local afkEvent = Instance.new("RemoteEvent")
afkEvent.Name = "AfkEvent"
afkEvent.Parent = ReplicatedStorage
local function setAfk(player, afk)
if afk then
local forcefield = Instance.new("ForceField")
forcefield.Parent = player.Character
else
local forcefield = player.Character:FindFirstChildOfClass("ForceField")
if forcefield then
forcefield:Destroy()
end
end
end
afkEvent.OnServerEvent:Connect(setAfk)
local UserInputService = game:GetService("UserInputService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local afkEvent = ReplicatedStorage:WaitForChild("AfkEvent")
local function focusGained()
afkEvent:FireServer(false)
end
local function focusReleased()
afkEvent:FireServer(true)
end
UserInputService.WindowFocused:Connect(focusGained)
UserInputService.WindowFocusReleased:Connect(focusReleased)