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
相关产品推荐
相关产品推荐

