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

Unity中如何实现物体无中断同时朝两个方向移动?

问题诊断与解决方案

你的问题核心出在两处:

  1. 移动逻辑误用GetKeyDown:这个方法仅在按键按下的第一帧触发一次,无法持续响应按住按键的状态,导致速度累加逻辑混乱,多键操作时异常频发。
  2. 松开按键直接清零速度:不管当前是否还有其他方向键处于按住状态,只要松开任意一个键就把velocity强制设为(0,0),这就是松开单键后物体立刻停止的直接原因。

修正后的实现代码

我们可以直接重构移动逻辑,每帧重新计算所有按下按键的组合输入,无需单独写停止函数:

using UnityEngine;

public class ObjectControl : MonoBehaviour
{
    [SerializeField] float objectSpeed = 5f; // 建议调小数值,原500会导致速度异常
    private Rigidbody2D rb;

    void Awake()
    {
        // 提前缓存组件,避免每帧调用GetComponent浪费性能
        rb = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        HandleMovement();
    }

    void HandleMovement()
    {
        // 逐帧检测方向键状态
        float horizontal = 0f;
        float vertical = 0f;

        if (Input.GetKey(KeyCode.RightArrow))
            horizontal = 1f;
        else if (Input.GetKey(KeyCode.LeftArrow))
            horizontal = -1f;

        if (Input.GetKey(KeyCode.UpArrow))
            vertical = 1f;
        else if (Input.GetKey(KeyCode.DownArrow))
            vertical = -1f;

        // 归一化方向向量,避免斜向移动速度过快(斜向向量默认长度为√2,归一化后保持速度统一)
        Vector2 moveDirection = new Vector2(horizontal, vertical).normalized;

        // 直接设置刚体速度,无按键时自动归0
        rb.velocity = moveDirection * objectSpeed * Time.deltaTime;
    }
}

关键改动说明

  • 用GetKey替代GetKeyDown:持续检测按键状态,按住方向键时每帧都会更新速度,符合常规移动逻辑。
  • 缓存Rigidbody2D组件:GetComponent是性能开销较高的操作,在Awake中提前获取并缓存,提升运行效率。
  • 方向向量归一化:解决斜向移动时速度大于单方向移动的问题,保证所有方向的移动速度一致。
  • 移除冗余停止函数:当没有任何方向键按下时,horizontal和vertical自动归0,速度自然变为0,无需额外处理。

内容的提问来源于stack exchange,提问作者Mice From Kæhta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 00:45:42