用途:整理 Roblox 客户端输入与相机控制的实现方式,帮助在键鼠、触屏、手柄、VR 间统一处理玩家操作。
主要能力与选型:新玩法控制推荐 Input Action System,用 InputContext → InputAction → InputBinding 结构配置跨设备绑定、启用/禁用上下文、内置屏幕按钮绑定与提示显示;原始输入、无文本热键、鼠标位置/增量、触屏手势、设备检测用 UserInputService 事件;旧代码或简单绑定可用 ContextActionService:BindAction。所有输入处理都在客户端,意图通过 remotes 发给服务器并由服务器校验。
InputAction.Type 含 Bool、Direction1D、Direction2D、Direction3D、ViewportPosition;事件有 Pressed、Released(仅 Bool)、StateChanged(value),可用 action:GetState() 读取当前值。InputBinding 支持 KeyCode、复合方向、Scale、模拟扳机阈值、组合键修饰符、UIButton 与提示显示名/图。InputContext.Enabled 切换控制方案,Priority 与 Sink 让高优先级上下文消费按键。将 Workspace.PlayerScriptsUseInputActionSystem 设为 Enabled 可让默认玩家/相机脚本也使用该系统(服务器权威所需)。
UserInputService 要点:InputBegan 中必须尊重 gameProcessedEvent,否则玩家打字时会误触发技能;用 PreferredInput 判断玩家实际使用的设备,而非仅看 TouchEnabled/KeyboardEnabled。鼠标可用 MouseBehavior.LockCenter、GetMouseLocation、MouseDeltaSensitivity;手柄可用 GetConnectedGamepads、摇杆死区约 0.15、HapticService;触屏有 TouchTap、TouchLongPress、TouchPinch、TouchSwipe。Esc、F9、F11、F12、PrintScreen、聊天 /、Tab 等为保留键,无法覆盖。
自定义相机:将 camera.CameraType 设为 Scriptable,在 RunService:BindToRenderStep 中更新(不要用 Heartbeat 或 task.wait 循环),用 CFrame:Lerp 做帧率无关平滑;第一人称用 CameraMode.LockFirstPerson 与缩放距离限制;屏幕转世界用 ViewportPointToRay/ScreenPointToRay 加 Raycast。
限制与检查:每个操作都应具备键盘、手柄、触屏绑定;提示随 PreferredInput 变化;避免仅悬停交互;破坏性操作需长按确认;在 Studio 的设备与手柄模拟器中测试。相关技能包括 roblox-ui、roblox-characters-animation、roblox-networking、roblox-physics。