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

Unity中如何设置Rigidbody2D的最大速度?现有代码无法生效求助

问题分析与修复方案

哥们我太懂你折腾好几个小时、试遍谷歌方案却没用的崩溃感了!咱们直接揪出你代码里的核心问题:

核心问题1:veloc变量从未更新

你在Start()里只给veloc赋值了一次初始速度,之后再也没同步过刚体的实时速度。这就导致FixedUpdate()里的速度限制判断完全无效——它一直拿游戏刚启动时的速度做对比,根本不管物体现在飞得多快!

核心问题2:数值设置不合理

你给maxSpeed设了0.01f,但speed却设成了4,这俩数值差距大到离谱。就算速度限制逻辑生效了,要么物体几乎不动,要么AddForce的力直接冲破限制(不过这不是当前的主要问题)。


修复后的完整代码

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

public class PlayerMovement : MonoBehaviour {
    [Range(0, 5)] public int speed;
    public Rigidbody2D rb2D;
    public float maxSpeed;

    void Start () {
        rb2D = GetComponent<Rigidbody2D>();
        speed = 4;
        // 把maxSpeed改成合理数值,比如5f,可根据你的游戏需求微调
        maxSpeed = 5f;
    }

    void Update () {
        if(Input.GetKey(KeyCode.W)) {
            rb2D.AddForce(Vector3.up * speed);
        }
        if(Input.GetKey(KeyCode.S)) {
            rb2D.AddForce(-Vector3.up * speed);
        }
        if(Input.GetKey(KeyCode.D)) {
            rb2D.AddForce(Vector3.right * speed);
        }
        if(Input.GetKey(KeyCode.A)) {
            rb2D.AddForce(-Vector3.right * speed);
        }
    }

    void FixedUpdate () {
        // 直接用刚体的实时速度做判断,无需额外的veloc变量
        if(rb2D.velocity.magnitude > maxSpeed) {
            rb2D.velocity = rb2D.velocity.normalized * maxSpeed;
        }
    }
}

关键修改点说明

  1. 移除无用的veloc变量:直接在FixedUpdate()里使用rb2D.velocity获取实时速度,确保判断逻辑能正确检测当前物体的移动速度。
  2. 调整maxSpeed数值:把0.01f改成更合理的5f,你可以根据游戏的手感需求再微调这个值。
  3. 简化重复代码:去掉了Start里重复获取Rigidbody2D的操作,避免冗余。

这样修改后,你的速度限制逻辑就能正常工作,物体再也不会像闪电侠一样乱飞啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:28:40