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

Unity 2D:如何修复Vector2相关的Velocity速度异常Bug?

问题解决方法

首先,你原来的代码有两个核心问题导致修改不生效:

  • Rigidbody2D.velocity是值类型(结构体):直接修改它的x分量只会操作临时副本,不会改变刚体实际速度,必须重新赋值整个Vector2对象。
  • 拼写错误:RigidBody2D应为Rigidbody2D(Unity组件命名是驼峰式,b为小写)。

修正x方向速度为正数的代码

直接在计算方向时就确保x为正,或者在赋值速度后修正,两种方式任选:

// file: Ball.cs
void OnCollisionEnter2D(Collision2D col)
{
    if(col.gameObject.name == "racket")
    {
        float x = hitFactor(transform.position,
                      col.transform.position,
                      col.collider.bounds.size.x);
        
        // 方式1:直接将x转为正数(保留原幅度,仅修正方向)
        x = Mathf.Abs(x);
        // 如果你想固定x方向为正的最大幅度,也可以写x = 1;
        
        Vector2 dir = new Vector2(x, 1).normalized;
        Rigidbody2D rb = GetComponent<Rigidbody2D>();
        rb.velocity = dir * speed;

        // 方式2:赋值后修正x方向(适合需要基于现有速度调整的场景)
        // Vector2 currentVel = rb.velocity;
        // currentVel.x = Mathf.Abs(currentVel.x);
        // rb.velocity = currentVel;
    }
}

解决小球速度飙升问题

速度飙升是因为碰撞时paddle的移动速度被叠加到了小球上。除了直接设置速度覆盖碰撞结果,还可以加一层速度大小限制,确保速度不会超出设定值:

// 在设置rb.velocity之后添加
rb.velocity = Vector2.ClampMagnitude(rb.velocity, speed);

这样无论碰撞时出现什么异常,小球的速度大小都会被限制在你设定的speed值范围内。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 01:21:00