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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:11:10