Unity同时启用鼠标与控制器输入时,物体未按预期仅在左键按下时跟随鼠标旋转的问题
Unity同时启用鼠标与控制器输入时,物体未按预期仅在左键按下时跟随鼠标旋转的问题
嘿,我看你遇到了一个挺常见的输入冲突问题,咱们来一步步解决它~
首先先明确你的核心需求:
- 鼠标旋转:只有按住左键时,物体才跟着鼠标移动旋转
- 控制器旋转:右摇杆移动时,物体正常旋转
- 但现在的问题是,当同时启用两种输入方式时,即使没按左键,物体也会跟着鼠标转
问题根源分析
看了你贴的代码,我发现关键问题在于你混用了Unity的新旧两套输入系统:
- 检测鼠标左键用的是旧Input系统的
Input.GetMouseButton(0) - 读取鼠标移动增量用的是新Input System的
Mouse.current.delta.ReadValue()
这两套系统是完全独立的,它们的输入状态不会同步。当有控制器连接时,旧系统的按键检测可能出现异常,导致Input.GetMouseButton(0)在你没按左键时也返回true,进而触发了鼠标旋转的逻辑。
修复方案:统一使用一套输入系统
解决这个问题的核心就是把输入逻辑统一到同一套系统下,下面给你两种可行的方案:
方案一:全用新Input System(推荐)
既然你已经在使用新系统的控制器输入,那直接把鼠标按键检测也换成新系统的API就行:
private void Update() { if (!isInspecting || objectInspect == null) return; RotateWithController(); RotateObject(); } private void RotateObject() { // 用新Input System检测左键按下状态 if (Mouse.current.leftButton.isPressed) { Vector2 mouseDelta = Mouse.current.delta.ReadValue(); if (mouseDelta != Vector2.zero) { objectInspect.transform.Rotate(new Vector3(-mouseDelta.y, mouseDelta.x, 0) * Time.deltaTime * rotationSpeed, Space.World); } } } private void RotateWithController() { Vector2 rotationInput = rotateItem.ReadValue<Vector2>(); if (rotationInput != Vector2.zero) { objectInspect.transform.Rotate(new Vector3(-rotationInput.y, rotationInput.x, 0) * Time.deltaTime * rotationSpeed * 8f, Space.World); } }
方案二:全用旧Input Manager
如果你更习惯旧系统的用法,也可以把鼠标增量读取换成旧API:
private void Update() { if (!isInspecting || objectInspect == null) return; RotateWithController(); RotateObject(); } private void RotateObject() { if (Input.GetMouseButton(0)) { // 用旧系统读取鼠标移动增量 float mouseX = Input.GetAxis("Mouse X"); float mouseY = Input.GetAxis("Mouse Y"); Vector2 mouseDelta = new Vector2(mouseX, mouseY); if (mouseDelta != Vector2.zero) { objectInspect.transform.Rotate(new Vector3(-mouseY, mouseX, 0) * Time.deltaTime * rotationSpeed, Space.World); } } } private void RotateWithController() { // 如果控制器输入也用旧系统的话,改成对应的轴输入 // 比如:Vector2 rotationInput = new Vector2(Input.GetAxis("Right Stick X"), Input.GetAxis("Right Stick Y")); Vector2 rotationInput = rotateItem.ReadValue<Vector2>(); if (rotationInput != Vector2.zero) { objectInspect.transform.Rotate(new Vector3(-rotationInput.y, rotationInput.x, 0) * Time.deltaTime * rotationSpeed * 8f, Space.World); } }
额外建议
如果想进一步优化体验,还可以添加一个输入互斥逻辑:比如当控制器的右摇杆有输入时,暂时忽略鼠标旋转的触发,避免两种输入同时生效导致的混乱,不过这取决于你的具体需求。
备注:内容来源于stack exchange,提问作者Kaio Barbosa
相关产品推荐
相关产品推荐

