Nhập gamepad

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

Roblox chấp nhận nhập từ gamepad USB như Xbox và điều khiển PlayStation.Vì gamepad có nhiều loại khác nhau, bạn cần tuân theo thiết lập bổ sung để xác minh rằng các đầu vào gamepad của người chơi có thể sử dụng trong trải nghiệm của bạn.

Để thiết lập các đầu vào gamepad, bạn có thể sử dụng ContextActionService hoặc UserInputService để phát hiện gamepad kết nối cho thiết bị của một người chơi, xác minh các đầu vào hỗ trợ tương thích với Roblox, nhận được đầu vào và nhiều hơn nữa.

Khi kết nối các đầu vào gamepad, hãy xem bảng điều khiển chung để tạo ra một trải nghiệm gamepad nhất quán cho người chơi.Sau khi đã cài đặt các đầu vào, bạn có thể cải thiện trải nghiệm của người chơi bằng cách bao gồm phản hồi haptic trên các điều khiển được hỗ trợ.

Phát hiện gamepad

Bạn có thể phát hiện xem thiết bị của người chơi hiện có đang có gamepad hoạt động bằng cách sử dụng thuộc tính UserInputService.GamepadEnabled.

Phát hiện Gamepad

local UserInputService = game:GetService("UserInputService")
if UserInputService.GamepadEnabled then
print("Player has gamepad enabled...")
end

Bạn có thể kiểm tra gamepad kết nối thông qua sự kiện UserInputService.GamepadConnectedUserInputService.GamepadDisconnected .Các sự kiện này bắt lửa khi một thiết bị được kết nối hoặc thoát kết nối lần lượt, và cả hai sự kiện đều truyền một Enum.UserInputType đến chức năng kết nối chỉ ra gamepad nào gây ra sự kiện.Trong hầu hết các trường hợp, gamepad kết nối là Gamepad1 .

Kiểm tra kết nối và kết nối lại

local UserInputService = game:GetService("UserInputService")
UserInputService.GamepadConnected:Connect(function(gamepad)
print("User has connected controller: " .. tostring(gamepad))
end)
UserInputService.GamepadDisconnected:Connect(function(gamepad)
print("User has disconnected controller: " .. tostring(gamepad))
end)

Bạn cũng có thể truy vấn xem có phải điều khiển cụ thể nào đó được kết nối bằng cách sử dụng phương pháp UserInputService:GetGamepadConnected().Điều này yêu cầu một Enum.UserInputType như một tham số và chỉ chấp nhận các giá trị của Gamepad1 thông qua Gamepad8 .

Kết Nối Gamepad Cụ Thể Yêu Cầu

local UserInputService = game:GetService("UserInputService")
if UserInputService:GetGamepadConnected(Enum.UserInputType.Gamepad1) then
print("Gamepad1 is connected")
elseif UserInputService:GetGamepadConnected(Enum.UserInputType.Gamepad2) then
print("Gamepad2 is connected")
end

Xác minh các đầu vào được hỗ trợ

Vì gamepad có thể có các bộ đầu vào khác nhau, bạn nên kiểm tra các đầu vào nào được hỗ trợ với UserInputService:GetSupportedGamepadKeyCodes() .Phương pháp này nhận một Enum.UserInputType như một tham số và trả về một bảng với một danh sách tất cả các đầu vào có sẵn cho điều khiển được chỉ định.

Xác minh các đầu vào được hỗ trợ

local UserInputService = game:GetService("UserInputService")
local availableInputs = UserInputService:GetSupportedGamepadKeyCodes(Enum.UserInputType.Gamepad2)
print("This controller supports the following controls:")
for _, control in availableInputs do
print(control)
end

Nhận đầu vào

ContextActionService là hữu ích để gắn các điều khiển vào cả gamepad và các nguồn nhập khác như chuột và bàn phím hoặc cảm ứng di động của màn hình cảm ứng, hoặc để gắn nhiều chức năng vào một nút đầu vào duy nhất trên bất kỳ thiết bị nào.Ví dụ, mã trình bày sau đây gắn một hành động OpenSpellBook vào nút ButtonR2 của gamepad và phím B của bàn phím.

Dịch vụ liên kết hành động ContextActionService

local ContextActionService = game:GetService("ContextActionService")
local function openSpellBook(actionName, inputState, inputObject)
if inputState == Enum.UserInputState.Begin then
-- Mở cuốn sách phép
end
end
ContextActionService:BindAction("OpenSpellBook", openSpellBook, false, Enum.KeyCode.ButtonR2, Enum.KeyCode.B)

Ngoài ra, bạn có thể sử dụng UserInputService để gắn kết điều khiển trực tiếp từ gamepad.Khi phát hiện sự kiện gamepad thông qua dịch vụ này, sử dụng sự kiện InputBegan để phát hiện khi nút được nhấn ban đầu và InputEnded để phát hiện khi nút được phát hành.Trong chức năng xử lý, thuộc tính InputObject.UserInputType cho thấy gamepad nào đã kích hoạt sự kiện và InputObject.KeyCode cho thấy nút hoặc thanh cụ thể đã kích hoạt nó.

Dịch vụ nhận nút nhấn của người dùng Detection

local UserInputService = game:GetService("UserInputService")
UserInputService.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.Gamepad1 then
if input.KeyCode == Enum.KeyCode.ButtonA then
print("Button A pressed on Gamepad1")
end
end
end)

Tình trạng gamepad

Bạn có thể phát hiện tình trạng hiện tại của tất cả các nút và que trên gamepad với phương pháp UserInputService:GetGamepadState().Nó hữu ích nếu bạn cần kiểm tra các đầu vào gamepad hiện tại khi một sự kiện riêng biệt xảy ra trong trải nghiệm của bạn, chẳng hạn như kiểm tra xem liệu các nút cụ thể được nhấn khi một nhân vật chạm vào một vật phẩm.

Kiểm tra trạng thái của đầu vào Gamepad

local Players = game:GetService("Players")
local UserInputService = game:GetService("UserInputService")
local player = Players.LocalPlayer
local character = player.Character or player.CharacterAdded:Wait()
local leftFoot = character:WaitForChild("LeftFoot")
-- Khi chân trái tiếp xúc với một thứ gì đó, kiểm tra tình trạng đầu vào gamepad
leftFoot.Touched:Connect(function(hit)
local state = UserInputService:GetGamepadState(Enum.UserInputType.Gamepad1)
for _, input in state do
-- Nếu ButtonR2 hiện đang giữ, in ra một tin nhắn
if input.KeyCode == Enum.KeyCode.ButtonR2 and input.UserInputState == Enum.UserInputState.Begin then
print("Character's left foot touched something while holding right trigger")
end
end
end)

Kích hoạt áp lực

Bạn có thể phát hiện bao nhiêu áp lực được đặt lên các kích hoạt trên gamepad bằng cách kiểm tra giá trị Position.Z của kích hoạt nhập.

Kiểm tra áp lực kích hoạt thử

local UserInputService = game:GetService("UserInputService")
UserInputService.InputChanged:Connect(function(input)
if input.UserInputType == Enum.UserInputType.Gamepad1 then
if input.KeyCode == Enum.KeyCode.ButtonL2 then
print("Pressure on left trigger has changed:", input.Position.Z)
elseif input.KeyCode == Enum.KeyCode.ButtonR2 then
print("Pressure on right trigger has changed:", input.Position.Z)
end
end
end)

Các sơ đồ điều khiển thông thường

Gamepad có nhiều hình dạng và kích cỡ khác nhau.Như với bất kỳ phương pháp nhập của người chơi nào, tốt nhất là tạo một số sự đồng nhất trên các trò chơi và trải nghiệm khác nhau.

Các giao diện sau đây là các giao diện nhập thông thường sẽ giúp người chơi ngay lập tức cảm thấy quen thuộc và thoải mái với điều khiển gamepad:

NhậpCác trường hợp sử dụng phổ biến
ButtonAChấp nhận lời nhắc người chơi hoặc lựa chọn GUI. Hoặc sử dụng cho hành động chính như nhảy.
ButtonBHủy lời nhắc người chơi hoặc lựa chọn GUI. Thay thế sử dụng cho các hành động thứ cấp như né, lăn hoặc chạy.
Thumbstick1Thông thường liên quan đến chuyển động của nhân vật.
Thumbstick2Thông thường liên quan đến chuyển động của camera.
ButtonL2 , ButtonR2Thông thường được sử dụng cho các hành động chính, như bắn súng.
ButtonL1 , ButtonR1 , ButtonX , ButtonYHành động thứ cấp như làm mới, nhắm mục tiêu hoặc truy cập vào một kho hoặc bản đồ lượng tử.

phản hồihồi haptic

Nhiều điều khiển gamepad có động cơ được xây dựng để cung cấp phản hồi haptic.Thêm rung và rung có thể cải thiện đáng kể trải nghiệm của người chơi và cung cấp phản hồi tinh tế ngoài hình ảnh hoặc âm thanh.Bạn có thể sử dụng HapticService để xác minh hỗ trợ rung trước khi bật động cơ .

Hỗ trợ rung

Không phải tất cả các điều khiển có động cơ nên rất quan trọng để kiểm tra hỗ trợ trước khi cố gắng sử dụng động cơ haptic.Để truy vấn xem một điều khiển được cung cấp có hỗ trợ rung hay không, hãy gọi HapticService:IsVibrationSupported() .

Kiểm tra hỗ trợ rung

local HapticService = game:GetService("HapticService")
local gamepad = Enum.UserInputType.Gamepad1
local isVibrationSupported = HapticService:IsVibrationSupported(gamepad)

Một số điều khiển có nhiều động cơ cho các mức độ rung khác nhau.Một khi bạn đã kiểm tra xem gamepad có hỗ trợ rung không, bạn cũng nên kiểm tra xem nó có hỗ trợ các động cơ bạn dự định sử dụng thông qua HapticService:IsMotorSupported() không.

Kiểm tra các động cơ được hỗ trợ

local HapticService = game:GetService("HapticService")
local gamepad = Enum.UserInputType.Gamepad1
local isVibrationSupported = HapticService:IsVibrationSupported(gamepad)
if isVibrationSupported then
local largeMotor = HapticService:IsMotorSupported(gamepad, Enum.VibrationMotor.Large)
local smallMotor = HapticService:IsMotorSupported(gamepad, Enum.VibrationMotor.Small)
local leftTriggerMotor = HapticService:IsMotorSupported(gamepad, Enum.VibrationMotor.LeftTrigger)
local rightTriggerMotor = HapticService:IsMotorSupported(gamepad, Enum.VibrationMotor.RightTrigger)
local leftHandMotor = HapticService:IsMotorSupported(gamepad, Enum.VibrationMotor.LeftHand)
local rightHandMotor = HapticService:IsMotorSupported(gamepad, Enum.VibrationMotor.RightHand)
end
Kích thước hoặc vị tríMô tả
LargeĐộng cơ lớn hơn, hữu ích cho rumble chung.
SmallMotor nhỏ hơn, hữu ích cho những rung động tinh tế hơn như bánh xe trượt, sốc điện, v.v.
LeftTriggerBên dưới cú trích bên trái.
RightTriggerBên dưới cú trích phải.
LeftHandỞ bên trái của điều khiển.
RightHandỞ bên phải của điều khiển.

Bật động cơ

Khi bạn đã xác nhận rằng gamepad của một người chơi hỗ trợ rung, bạn có thể bật một động cơ cụ thể với HapticService:SetMotor() .Phương pháp này nhận gamepad và độ lớn của rung làm tham số.Độ lớn có thể là bất kỳ giá trị nào giữa 0 và 1.

Kích hoạt động cơ

local HapticService = game:GetService("HapticService")
local gamepad = Enum.UserInputType.Gamepad1
local isVibrationSupported = HapticService:IsVibrationSupported(gamepad)
if isVibrationSupported then
local largeMotor = HapticService:IsMotorSupported(gamepad, Enum.VibrationMotor.Large)
if largeMotor then
HapticService:SetMotor(gamepad, Enum.VibrationMotor.Large, 0.5)
end
end

Giả lập điều khiển

Trình giả lập điều khiển cho phép bạn chính xác giả lập lại đầu vào gamepad trực tiếp trong Studio .Người điều khiển mặc định là một gamepad chung, nhưng bạn có thể chọn các lựa chọn cho PlayStation, Xbox và các thiết bị Quest từ menu chọn bên trái trên cùng.

Emulate Device Controllers button indicated in Test tab View of the generic controller in the Controller Emulator.

Trong khi thử nghiệm chơi, bạn có thể kiểm soát trải nghiệm bằng điều khiển ảo bằng chuột của bạn.

Bạn cũng có thể nhấp vào Chỉnh sửa bản đồ ở góc trên bên phải để xem và chỉnh sửa bản đồ chính cho điều khiển ảo, ví dụ E đến ButtonL2 hoặc 9 đến ButtonA .Các bản đồ này được lưu giống như các cài đặt khác của Studio (theo kiểm soát viên, theo người dùng, theo máy tính) và được dịch sang sự kiện gamepad trong cả cửa sổ giả lập và 3D viewport.