Unity 3D场景中如何按指定角度与速度朝玩家发射刚体箭矢
解决3D场景中箭矢朝玩家方向带角度发射的Velocity计算问题
嘿,这问题拆解开来其实很清晰,咱们一步步来搞定:
首先,咱们得先确定敌人指向玩家的水平方向——因为你的30°角度是相对于水平面的对吧?所以先忽略高度差,只取X-Z平面上的方向:
// 计算敌人到玩家的方向向量,忽略Y轴高度,只保留水平方向(X-Z平面) Vector3 directionToPlayer = playerTransform.position - enemyTransform.position; directionToPlayer.y = 0; directionToPlayer.Normalize(); // 转为单位向量,保证方向正确且不会影响速度大小
接下来,用三角函数把30m/s的速度分解成水平速度分量和垂直速度分量:
- 水平速度:
velocity * Mathf.Cos(angleInRadians)—— 负责让箭矢朝玩家方向飞行 - 垂直速度:
velocity * Mathf.Sin(angleInRadians)—— 负责让箭矢向上抬升30°
注意Unity的Mathf三角函数使用的是弧度,所以得先把角度转换一下:
float angleInRadians = Mathf.Deg2Rad * angle;
最后把这两部分组合起来,就是箭矢最终的velocity值了:
// 水平方向速度:单位方向向量 × 水平速度分量 Vector3 horizontalVelocity = directionToPlayer * velocity * Mathf.Cos(angleInRadians); // 垂直方向速度:向上的方向向量 × 垂直速度分量 Vector3 verticalVelocity = Vector3.up * velocity * Mathf.Sin(angleInRadians); // 合并得到最终的速度向量 arrowRigidbody.velocity = horizontalVelocity + verticalVelocity;
把这些整合到一起,完整的代码片段就是:
// 计算敌人指向玩家的水平单位方向向量 Vector3 directionToPlayer = playerTransform.position - enemyTransform.position; directionToPlayer.y = 0; directionToPlayer.Normalize(); // 将角度转换为弧度(Unity三角函数要求输入弧度) float angleInRadians = Mathf.Deg2Rad * angle; // 赋值给箭矢的Rigidbody速度 arrowRigidbody.velocity = directionToPlayer * velocity * Mathf.Cos(angleInRadians) + Vector3.up * velocity * Mathf.Sin(angleInRadians);
小补充:如果你的游戏场景里垂直方向不是Y轴(比如有些项目用Z轴作为上下方向),只需要把代码里的Vector3.up换成对应的垂直轴向量就可以了~
内容的提问来源于stack exchange,提问作者Moses
相关产品推荐
相关产品推荐

