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

Unity 2D射击游戏角色WASD移动松开按键不停止问题

2D角色移动按键松开后无法停止的问题修复

原代码存在的问题

  • 每次按下单个按键时直接覆盖rigidBody.velocity,多方向按键时逻辑冲突,且松开按键后未重置对应方向速度,导致角色持续移动
  • S键的速度计算额外乘以Time.deltaTime,与其他方向速度倍率不一致,造成移动速度不均
  • 未对多方向输入的向量做归一化处理,斜向移动时速度会快于单方向

修改后的实现思路

  1. 初始化一个空的移动方向向量,根据WASD输入分别修改x、y轴分量
  2. 对移动方向向量归一化,保证斜向移动速度与单方向一致
  3. 将最终方向乘以速度和Time.deltaTime(消除帧率对移动速度的影响),赋值给刚体速度
  4. 松开所有按键时,移动方向向量归零,刚体速度也随之归零,角色停止移动

修改后的完整代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Movement : MonoBehaviour 
{
    public Rigidbody2D rigidBody;
    public float speed = 5f; // 建议用float类型,调整速度更灵活

    void Update()
    {
        // 初始化移动方向为零向量
        Vector2 moveDir = Vector2.zero;

        // 根据按键输入修改移动方向
        if (Input.GetKey("w"))
        {
            moveDir.y += 1;
        }
        if (Input.GetKey("s"))
        {
            moveDir.y -= 1;
        }
        if (Input.GetKey("a"))
        {
            moveDir.x -= 1;
        }
        if (Input.GetKey("d"))
        {
            moveDir.x += 1;
        }

        // 归一化向量,避免斜向移动速度过快
        if (moveDir.magnitude > 1)
        {
            moveDir = moveDir.normalized;
        }

        // 应用速度,乘以Time.deltaTime让移动帧率无关
        rigidBody.velocity = moveDir * speed * Time.deltaTime;
    }
}

额外提示

  • 建议使用Unity的**输入管理器(Input Manager)**定义虚拟轴(比如Horizontal和Vertical),可以直接用Input.GetAxis("Horizontal")和Input.GetAxis("Vertical")获取方向,代码更简洁且支持手柄输入
  • 若希望角色有平滑的加速减速效果,可以改用rigidBody.AddForce代替直接设置velocity,配合摩擦力参数调整手感

内容的提问来源于stack exchange,提问作者Maxim Titovitch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 14:12:36