游戏手柄触觉反馈¶
Time:5 分钟
Xbox One 控制器和其他一些 USB 游戏手柄控制器内置有提供触觉反馈的电机。增加隆隆声和振动可以极大地增强游戏的体验,并提供难以通过视觉或听觉传达的微妙反馈。Roblox 向开发者提供了一项名为 HapticService
的服务来处理触觉反馈。
检查振动支持¶
并非所有的控制器都支持振动,因此在尝试使用 ClassLink|HapticService 之前检查插入的控制器是否具有振动支持很重要。若要检查给定的控制器是否完全支持隆隆声,可以调用 HapticService/IsVibrationSupported
local HapticService = game:GetService("HapticService")
local isVibrationSupported = HapticService:IsVibrationSupported(Enum.UserInputType.Gamepad1)
检查游戏手柄是否支持振动之后,你也应该检查它是否支持你要使用的电机。在 XBox One 上,控制器有 4 个电机:
大:在控制器的左侧。适合一般隆隆声。
小:在控制器的右侧。适用于更细微的隆隆声(轮胎打滑、触电等)。
左触发器:在左触发器下面。适用于刹车、枪械重装等。
右触发器:在右触发器下面。适用于反冲、加速等。
在 PC 上,你无法保证用户拥有什么样的控制器。很多控制器仅支持大小电机(没有触发器)。你可以使用 HapticService/IsMotorSupported
查看用户的控制器是否支持你要使用的电机。
local HapticService = game:GetService("HapticService")
local isVibrationSupported = HapticService:IsVibrationSupported(Enum.UserInputType.Gamepad1)
local largeSupported = false
if isVibrationSupported then
largeSupported = HapticService:IsMotorSupported(Enum.UserInputType.Gamepad1, Enum.VibrationMotor.Large)
end
打开电机¶
确认用户的游戏手柄支持振动之后,你便可以开始使用游戏手柄电机了。你可以使用 HapticService/SetMotor
打开游戏手柄上的特定电机。此函数将游戏手柄和振动振幅作为参数。振幅可以是 0 到 1 之间的任意值(0 表示无振动,1 表示最大振动)。
local HapticService = game:GetService("HapticService")
HapticService:SetMotor(Enum.UserInputType.Gamepad1, Enum.VibrationMotor.Large, .5)
你也可以使用 HapticService/GetMotor
来获取给定电机的当前振动振幅。
local HapticService = game:GetService("HapticService")
print(HapticService:GetMotor(Enum.UserInputType.Gamepad1, Enum.VibrationMotor.Large)
Vehicle Haptic Feedback ```
-- Services
local HapticService = game:GetService("HapticService")
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
-- Make sure we are running in a LocalScript.
local player = Players.LocalPlayer
assert(player,"This should be running in a LocalScript!")
-- Setup Haptic Feedback Listener
local function updateHapticFeedback()
-- Check if we currently have a character.
local character = player.Character
if character then
-- Do we have a Humanoid?
local humanoid = character:FindFirstChildOfClass("Humanoid")
if humanoid then
-- Are we in a vehicle seat?
local seatPart = humanoid.SeatPart
if seatPart and seatPart:IsA("VehicleSeat") then
-- Measure the current speed of the vehicle by taking the magnitude of the seat's velocity.
local speed = seatPart.Velocity.Magnitude
-- Measure the current throttle from the user.
local throttle = math.abs(seatPart.ThrottleFloat)
-- Compute how much the controller should be vibrating.
local vibrationScale = math.min(1, (speed * throttle) / seatPart.MaxSpeed)
-- Apply the vibration.
HapticService:SetMotor(Enum.UserInputType.Gamepad1, Enum.VibrationMotor.Small, vibrationScale)
-- Return so the motor doesn't get reset.
return
end
end
end
-- If nothing is happening, turn off the motor.
HapticService:SetMotor(Enum.UserInputType.Gamepad1, Enum.VibrationMotor.Small, 0)
end
-- Connect our haptic feedback listener to be updated 60 times a second.
RunService.Heartbeat:Connect(updateHapticFeedback)
0
***__Roblox官方链接__:[游戏手柄触觉反馈](https://developer.roblox.com/zh-cn/articles/Gamepad-Haptic-Feedback)