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

Unity2D实现子弹碰撞墙体后沿原路径匀速反向运动问题求助

问题根因

  • 每帧持续施加冲量力导致子弹不断提速:你在Update中每帧调用AddForce的ForceMode2D.Impulse模式,冲量会持续叠加到速度上,自然会出现越来越快的问题,子弹完全不需要每帧加力,仅初始赋予一次固定速度即可。
  • Vector2.Reflect参数使用错误:该方法第一个参数需要传入入射速度方向,你传入的是子弹的世界坐标位置,计算出的反射方向完全不符合预期,自然会出现角度偏移。
  • 缺少物理参数配置:没有关闭物理引擎默认的重力、阻尼、摩擦、弹力属性,这些参数都会额外干扰子弹的速度和运动方向。

修正方案

  1. 先完成子弹的物理属性配置:
    • Rigidbody2D组件:Gravity Scale设为0,Linear Drag设为0,Angular Drag设为0,勾选Freeze Rotation的Z轴
    • 子弹的Collider2D组件:使用Friction=0、Bounciness=0的2D物理材质
  2. 修正后的代码:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 16:36:03