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

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;
}

改动说明

  1. 基础角度锚定:用Mathf.Atan2算出敌人指向玩家的准确角度,把这个角度作为散布的中心轴,确保整体射击方向朝向玩家。
  2. 锥形散布实现:把原来的aimAngle(60→30→0)转换成相对于中心的±30°、0°偏移,让子弹围绕「指向玩家」的方向形成锥形扩散。
  3. 视觉与逻辑统一:既给子弹传入了偏移后的飞行方向,又设置了对应的旋转,让子弹的视觉朝向和实际飞行方向保持一致。

可选简化方案

如果你想让子弹的飞行方向直接跟随自身旋转,可以修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 02:06:52