You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,建议直接用新输入系统处理,更适合本地合作游戏的多玩家输入管理:

  1. 创建Input Action Asset:右键项目窗口 > Input Actions > Input Action Asset
  2. 为Player1设置WASD移动映射,Player2设置方向键映射,分别绑定到对应的Move动作轴
  3. 修改代码读取输入动作的值:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 16:59:59