Unity2D实现子弹碰撞墙体后沿原路径匀速反向运动问题求助
问题根因
- 每帧持续施加冲量力导致子弹不断提速:你在
Update中每帧调用AddForce的ForceMode2D.Impulse模式,冲量会持续叠加到速度上,自然会出现越来越快的问题,子弹完全不需要每帧加力,仅初始赋予一次固定速度即可。 Vector2.Reflect参数使用错误:该方法第一个参数需要传入入射速度方向,你传入的是子弹的世界坐标位置,计算出的反射方向完全不符合预期,自然会出现角度偏移。- 缺少物理参数配置:没有关闭物理引擎默认的重力、阻尼、摩擦、弹力属性,这些参数都会额外干扰子弹的速度和运动方向。
修正方案
- 先完成子弹的物理属性配置:
- Rigidbody2D组件:
Gravity Scale设为0,Linear Drag设为0,Angular Drag设为0,勾选Freeze Rotation的Z轴 - 子弹的Collider2D组件:使用Friction=0、Bounciness=0的2D物理材质
- Rigidbody2D组件:
- 修正后的代码:
public Rigidbody2D rb; // 直接使用固定速度值,不需要力相关参数 private float bulletSpeed = 20f; Vector2 dir; private void Awake() { rb = GetComponent<Rigidbody2D>(); dir = transform.up; // 初始直接赋予固定速度,后续不需要每帧修改 rb.velocity = dir.normalized * bulletSpeed; } private void OnCollisionEnter2D(Collision2D other) { if (other.gameObject.CompareTag("Edge")) { // Reflect第一个参数传入入射方向,而非位置坐标 dir = Vector2.Reflect(dir, other.contacts[0].normal); // 直接赋值固定速度,规避物理引擎的额外速度干扰 rb.velocity = dir.normalized * bulletSpeed; transform.up = dir; } }
补充说明
如果需要严格保证运动路径完全无偏差,可以关闭Rigidbody2D的Interpolate插值选项,避免渲染插值带来的微小位置偏移。
内容的提问来源于stack exchange,提问作者AnXian
相关产品推荐
相关产品推荐

