Unity本地合作2D俯视角游戏WASD移动功能异常求助
Unity本地合作2D俯视角游戏WASD移动按键冲突问题
我正在开发一款本地合作(local coop)的2D俯视角游戏,两名玩家分别使用WASD和方向键操作。但当前WASD移动代码存在问题:仅能响应两个按键,删除其中一个正常按键的代码后,另一个原本无效的按键才会生效。方向键代码逻辑与WASD完全一致。
当前代码:
using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.InputSystem; public class PlayerController : MonoBehaviour { public float moveSpeed = 5f; public Rigidbody2D rb; Vector2 movement; void Update() { if (Input.GetKey(KeyCode.D) == true) //move right { movement.x = 1; } else //stop move right { movement.x = 0; } if (Input.GetKey(KeyCode.A) == true) //move left { movement.x = -1; } else //stop move left { movement.x = 0; } if (Input.GetKey(KeyCode.W) == true) //move up { movement.y = 1; } else //stop move up { movement.y = 0; } if (Input.GetKey(KeyCode.S) == true) //move down { movement.y = -1; } else //stop move down { movement.y = 0; } } void FixedUpdate() { rb.MovePosition(rb.position + movement * moveSpeed * Time.fixedDeltaTime); } }
问题原因
代码里每个方向按键用独立的if-else分支处理,导致同一轴上的按键互相覆盖。比如先判断D键,把movement.x设为1,之后判断A键时,如果没按A,就会把movement.x重置为0,直接覆盖了D键的输入效果。同理,W和S也会互相覆盖,最终同一轴上只有最后一个判断的按键能生效。
解决方案
方案1:修改旧输入系统逻辑
调整Update里的输入处理方式,计算同一轴上的按键输入总和,避免互相覆盖:
void Update() { // 计算X轴输入:按D加1,按A减1 movement.x = 0; if (Input.GetKey(KeyCode.D)) movement.x += 1; if (Input.GetKey(KeyCode.A)) movement.x -= 1; // 计算Y轴输入:按W加1,按S减1 movement.y = 0; if (Input.GetKey(KeyCode.W)) movement.y += 1; if (Input.GetKey(KeyCode.S)) movement.y -= 1; // 可选:归一化向量,防止斜向移动时速度过快 if (movement.magnitude > 1) { movement = movement.normalized; } }
方案2:使用Unity新输入系统(推荐)
既然代码已经引用了UnityEngine.InputSystem,建议直接用新输入系统处理,更适合本地合作游戏的多玩家输入管理:
- 创建Input Action Asset:右键项目窗口 > Input Actions > Input Action Asset
- 为Player1设置WASD移动映射,Player2设置方向键映射,分别绑定到对应的Move动作轴
- 修改代码读取输入动作的值:
using UnityEngine; using UnityEngine.InputSystem; public class PlayerController : MonoBehaviour { public float moveSpeed = 5f; public Rigidbody2D rb; // 在Inspector面板绑定对应玩家的Move动作 public InputAction moveAction; private Vector2 movement; private void OnEnable() { moveAction.Enable(); } private void OnDisable() { moveAction.Disable(); } void Update() { // 直接读取输入动作的轴值 movement = moveAction.ReadValue<Vector2>(); // 可选归一化 if (movement.magnitude > 1) { movement = movement.normalized; } } void FixedUpdate() { rb.MovePosition(rb.position + movement * moveSpeed * Time.fixedDeltaTime); } }
新输入系统能更方便地管理多玩家输入,避免按键冲突,还支持手柄等多种输入设备,更适合本地合作游戏的需求。
内容的提问来源于stack exchange,提问作者Isohel
相关产品推荐
相关产品推荐

