Unity2D实现敌人向玩家发射锥形散布弹幕的问题
解决方案
问题出在你当前的逻辑里:所有子弹都用了完全相同的朝向玩家的方向,而你设置的子弹旋转并没有影响飞行方向——因为Projectile脚本是直接用传入的shootDir移动,和自身旋转无关。要实现「朝向玩家的锥形散布」,核心是基于敌人指向玩家的基础方向,给每颗子弹加上不同的角度偏移,再将偏移后的角度转成方向向量。
修改Enemy Script代码
aimAngle = 60f; // 先计算敌人指向玩家的基础角度(世界空间下的角度) Vector3 toPlayer = player.transform.position - transform.position; float baseAimAngle = Mathf.Atan2(toPlayer.y, toPlayer.x) * Mathf.Rad2Deg; for (int i = 0; i < spreadShot; i++) { // 计算当前子弹的偏移角度:以指向玩家的方向为中心,叠加散布偏移 // 原来的aimAngle从60→30→0,对应相对于中心的+30°、0°、-30° float currentBulletAngle = baseAimAngle + (aimAngle - 30f); // 将角度转为方向向量 Vector3 bulletDir = new Vector3( Mathf.Cos(currentBulletAngle * Mathf.Deg2Rad), Mathf.Sin(currentBulletAngle * Mathf.Deg2Rad), 0 ); bulletDir.Normalize(); // 生成子弹时,设置正确的旋转(让子弹朝向飞行方向) Quaternion shotRotation = Quaternion.Euler(0, 0, currentBulletAngle); GameObject clone = Instantiate(projectile, transform.position, shotRotation); // 给子弹传入偏移后的方向 clone.GetComponent<Projectile>().Setup(bulletDir); aimAngle -= 30f; }
改动说明
- 基础角度锚定:用
Mathf.Atan2算出敌人指向玩家的准确角度,把这个角度作为散布的中心轴,确保整体射击方向朝向玩家。 - 锥形散布实现:把原来的
aimAngle(60→30→0)转换成相对于中心的±30°、0°偏移,让子弹围绕「指向玩家」的方向形成锥形扩散。 - 视觉与逻辑统一:既给子弹传入了偏移后的飞行方向,又设置了对应的旋转,让子弹的视觉朝向和实际飞行方向保持一致。
可选简化方案
如果你想让子弹的飞行方向直接跟随自身旋转,可以修改Projectile脚本,去掉shootDir变量,直接用自身的transform.right移动,这样只需要正确设置子弹的旋转即可:
[SerializeField] float m_Speed; private void Update() { transform.position += transform.right * m_Speed * Time.deltaTime; }
这种情况下,Enemy Script里无需再传bulletDir给Setup,只需要保证shotRotation是偏移后的角度即可,代码会更简洁。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

