Unity Project Settings - Input Manager设置说明_unity 如何完全禁用旧input系统
旧版输入系统 (Input Manager)
在 Unity 的 Project Settings > Input Manager 中,您可以配置各种输入轴。以下是旧版输入系统的设置项说明:
• Key or Mouse Button
• Mouse Movement
• Joystick Axis
• X/Y/Z轴
• 鼠标滚轮
• 游戏杆轴
• All Joysticks
• Joystick 1-8
旧版输入系统代码示例
// 获取水平输入float horizontal = Input.GetAxis(\"Horizontal\");// 获取垂直输入float vertical = Input.GetAxis(\"Vertical\");// 检测跳跃按键if(Input.GetButtonDown(\"Jump\")) { // 执行跳跃}
新版输入系统 (Input System Package)
Unity 的新版输入系统需要单独安装 Input System Package,提供更强大和灵活的输入处理方式。
安装与设置
- 通过 Package Manager 安装 “Input System”
- 在 Project Settings > Player > Other Settings 中启用 “Active Input Handling” 为 “New” 或 “Both”
核心概念
输入动作设置 (Input Actions Asset)
• Value: 连续值(如摇杆)
• Button: 按键状态
• Pass-Through: 直接传递输入
• Button
• Axis
• Vector2
• etc.
输入系统设置 (Project Settings > Input System Package)
新版输入系统代码示例
using UnityEngine;using UnityEngine.InputSystem;public class PlayerController : MonoBehaviour{ private PlayerInput playerInput; private InputAction moveAction; private void Awake() { playerInput = GetComponent(); moveAction = playerInput.actions[\"Move\"]; } private void OnEnable() { moveAction.performed += HandleMove; playerInput.actions[\"Jump\"].performed += HandleJump; } private void OnDisable() { moveAction.performed -= HandleMove; playerInput.actions[\"Jump\"].performed -= HandleJump; } private void HandleMove(InputAction.CallbackContext context) { Vector2 movement = context.ReadValue(); // 处理移动逻辑 } private void HandleJump(InputAction.CallbackContext context) { // 执行跳跃 } private void Update() { // 直接读取输入值 Vector2 moveInput = moveAction.ReadValue(); }}
输入系统选择建议
最佳实践
-
统一输入处理:
public interface IInputHandler{ Vector2 GetMovement(); bool IsJumpPressed(); // 其他输入方法}
-
输入设备检测:
string currentControlScheme = playerInput.currentControlScheme;if(currentControlScheme == \"KeyboardMouse\"){ // PC特定控制}else if(currentControlScheme == \"Gamepad\"){ // 手柄特定控制}
-
输入重绑定:
// 重绑定按键var rebindOperation = moveAction.PerformInteractiveRebinding() .WithControlsExcluding(\"Mouse\") .OnMatchWaitForAnother(0.1f) .Start();
-
输入事件优先级:
// 使用Input System的事件优先级void OnGUI(){ if(Event.current.type == EventType.KeyDown && Keyboard.current.escapeKey.wasPressedThisFrame) { // 处理ESC键 Event.current.Use(); // 阻止事件传播 }}
常见问题解决
-
输入无响应:
- 检查输入系统是否启用
- 确认输入动作绑定正确
- 验证事件监听是否注册
-
手柄死区问题:
// 添加死区处理器moveAction.AddBinding(\"/leftStick\") .WithProcessor(\"deadzone(min=0.125,max=0.925)\");
-
多平台适配:
- 使用Control Schemes区分设备
- 为不同设备创建单独的动作映射
- 运行时动态切换控制方案
-
输入冲突:
- 使用Action Maps分离不同上下文
- 在UI打开时禁用玩家输入
-
playerInput.SwitchCurrentActionMap(\"UI\");
根据项目需求选择合适的输入系统,小型项目可使用旧版系统快速开发,中大型项目推荐使用新版输入系统以获得更好的灵活性和扩展性。