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

Unity中Projectile运动方向错误:偏离武器朝向45度

问题排查与修正方案

核心问题1:Instantiate参数完全传反了

Unity的Instantiate方法里,要是你想指定生成位置、旋转、父对象,正确的参数顺序是:Instantiate(预制体, 位置, 旋转, 父对象)。你现在把武器的旋转(四元数)当成位置传进去,把父对象的Transform当成旋转传,这直接导致子弹初始位置乱掉,旋转也没继承武器朝向,这是方向偏45度的主要原因。

核心问题2:子弹速度计算逻辑混乱

你在Projectile控制器里用rb.velocity.x和rb.velocity.y来拼新速度,刚实例化的子弹刚体初始速度本来就不确定,这么搞等于给子弹加了无关的横向/纵向速度,自然会跑偏。应该直接基于子弹自身的前方向(也就是武器的朝向)来设置速度。

修正后的代码

武器控制器代码

// 修正实例化参数:传正确的发射位置、武器旋转、父对象
GameObject obj = Instantiate(projectile, transform.position, transform.rotation, bulletParent.transform);
// 一次性获取组件,减少性能开销
ProjectileController projectileCtrl = obj.AddComponent<ProjectileController>();
Rigidbody rb = obj.GetComponent<Rigidbody>();

projectileCtrl.speed = weapon.velocity;
// 子弹已经继承了武器的旋转,angle参数可以删掉不用传
rb.mass = weapon.projectileMass;

注:如果bulletParent是发射点的父容器,直接把子弹挂在它下面就行,别传bulletParent.transform.parent,避免层级嵌套出错。

Projectile控制器代码

// 直接用自身前方向(和武器朝向一致)设置世界空间速度
rb.velocity = transform.forward * speed;

或者用TransformDirection的写法也可以,效果一样:

rb.velocity = transform.TransformDirection(Vector3.forward * speed);

额外要检查的点

  • 确认Weapon配置里的velocity是正常正数,没被错设成奇怪的值
  • 看看bulletParent自身有没有额外旋转,确保武器的transform朝向就是玩家的实际朝向
  • 子弹预制体的Rigidbody如果不需要重力,把Use Gravity勾掉,免得下落导致方向看起来偏

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 02:13:13