如何在移动射击时保持子弹发射间隔与间距恒定?
解决俯视角射击游戏子弹间距随玩家移动变化的问题
问题根源
当前代码里,子弹仅用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
相关产品推荐
相关产品推荐

