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

如何在移动射击时保持子弹发射间隔与间距恒定?

解决俯视角射击游戏子弹间距随玩家移动变化的问题

问题根源

当前代码里,子弹仅用transform.up * projectileSpeed作为速度,这是相对玩家本地的飞行速度,但没叠加玩家自身的移动速度。当玩家移动时,子弹的实际世界速度缺少玩家位移的分量,导致子弹在世界空间中的间距随玩家移动状态改变,出现类似多普勒效应的宽窄变化。

修复方案

1. 叠加玩家速度到子弹速度

修改子弹速度的计算逻辑,把玩家当前的刚体速度和子弹自身的飞行速度做矢量叠加,保证子弹在世界空间中的速度恒定,进而让间距保持一致。

2. (可选)稳定发射间隔

如果需要发射间隔不受游戏时间缩放影响,可将WaitForSeconds替换为WaitForSecondsRealtime,确保帧率波动或时间缩放时发射频率仍稳定。

修改后的代码示例

Shooter脚本的FireContinuously协程

// 在Shooter脚本中添加玩家刚体引用,需在Inspector中赋值
[SerializeField] private Rigidbody2D playerRb;

IEnumerator FireContinuously()
{
    while (true)
    {
        GameObject instance = Instantiate(projectilePrefab,
                          transform.position,
                          Quaternion.identity);

        AudioPlayer.Instance.PlayShootingClip();

        Rigidbody2D rb = instance.GetComponent<Rigidbody2D>();
        if (rb != null)
        {
            // 计算子弹的世界空间速度:玩家移动速度 + 子弹自身飞行速度
            Vector2 bulletWorldVelocity = playerRb.velocity + (Vector2)transform.up * projectileSpeed;
            rb.velocity = bulletWorldVelocity;
        }

        // 保持原游戏时间间隔,若需要不受时间缩放影响则替换为WaitForSecondsRealtime
        yield return new WaitForSeconds(firingRate);
    }
}

关键说明

  • 必须在Inspector面板中将playerRb赋值为玩家对象的Rigidbody2D组件。
  • 叠加速度后,子弹在世界空间中的实际移动速度恒定,结合固定的发射间隔,子弹间的间距会始终保持一致,不再受玩家移动影响。

内容的提问来源于stack exchange,提问作者binary_right_010.011

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 23:16:02