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
相关产品推荐
相关产品推荐

