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

Unity 3D射击游戏子弹无法朝屏幕中心发射问题求助

问题解决:3D射击游戏子弹无法朝屏幕中心发射

核心问题分析

  • ScreenToWorldPoint深度参数错误:你传入的屏幕中心Z值为0,该方法会将其转换为相机近平面上的点,但BulletEffect位置不在这个平面,导致计算出的方向出现偏差。
  • 强制丢弃Z轴分量:返回方向时将direction.z设为0,直接砍掉了3D空间的深度方向分量,完全不符合3D射击的轨迹逻辑。
  • 方向计算逻辑偏差:用屏幕中心的错误世界点减去BulletEffect位置得到方向,正确逻辑应该是从屏幕中心发射射线,直接获取射线的方向向量。

修正后的代码

void Shoot()
{
    BulletEffect.Play();
    Bun.Play("RifleShoot");
    Src.PlayOneShot(Clip);

    GameObject Bullet2 = Instantiate(Bullet, BulletEffect.transform.position, Quaternion.identity);
    Vector3 direction = GetDirectionToCenter();
    Rigidbody BulletRb = Bullet2.GetComponent<Rigidbody>();
    BulletRb.velocity = direction * BulletSpeed;

    // 可选:恢复射线检测,同步使用修正后的方向
    /*RaycastHit hit;
    if (Physics.Raycast(BulletEffect.transform.position, direction, out hit, Range, Layer))
    {
        Debug.Log(hit.transform.name);
        hit.transform.GetComponent<EnemyScript>()?.TakeDamage(Damage);
    }
    */
}

Vector3 GetDirectionToCenter()
{
    // 从屏幕中心发射射线,直接获取世界空间中的方向向量
    Ray ray = Camera.main.ScreenPointToRay(new Vector3(Screen.width / 2, Screen.height / 2, 0));
    return ray.direction;
}

额外优化建议

  • 如果是2D视角的3D游戏(如俯视/侧视),需要限制子弹在特定平面移动,可在设置velocity时按需保留轴分量,不要在方向计算阶段直接砍掉Z轴。
  • 给子弹的Rigidbody添加Constraints,锁定不需要旋转的轴,避免子弹飞行时乱转。
  • 采用对象池预生成子弹,避免频繁Instantiate和销毁带来的性能损耗。

内容的提问来源于stack exchange,提问作者Aseed Kid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 01:52:59