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

