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

如何使飞刀落地穿刺点间距相等?射击角度计算方案咨询

解决方案:让飞刀地面穿刺点间距相等

你的问题核心是均匀角度增量会导致地面穿刺点间距不均匀——因为水平距离和投掷角度的关系是水平距离 = 投掷高度 × tan(角度),而tan函数不是线性的,固定加角度会让点越往两边越稀疏。要实现等间距,得反过来用反正切函数计算每个飞刀的角度。

实现步骤

  1. 确定两个关键参数:
    • heightToGround:投掷点(attackPoint)到地面的垂直高度
    • desiredSpacing:你想要的相邻穿刺点水平间距
  2. 对每把飞刀,计算它相对于中间位置的水平偏移,再用arctan(偏移距离/高度)算出对应的投掷角度

修改后的代码

else if (throwType == "onGround")
{
    // 可根据你的场景调整这两个参数
    float heightToGround = 2f; // 投掷点到地面的垂直高度,也可以动态计算(见下方)
    float desiredSpacing = 0.5f; // 相邻穿刺点的水平间距
    int kunaiCount = 5;
    
    int halfCount = (kunaiCount - 1) / 2; // 5把刀的话,中间是第3把,左右各2把
    for (int i = 0; i < kunaiCount; i++)
    {
        // 计算当前飞刀相对于中间点的水平偏移步数
        int offsetStep = i - halfCount;
        // 对应的水平偏移距离
        float horizontalOffset = offsetStep * desiredSpacing;
        // 计算投掷角度(弧度转角度)
        float angle = Mathf.Atan(horizontalOffset / heightToGround) * Mathf.Rad2Deg;
        // 生成飞刀,保持你原有的旋转逻辑
        Instantiate(kunai, attackPoint.position, transform.rotation * Quaternion.Euler(0f, 180f, angle));
    }
}

动态计算高度(可选)

如果玩家可能在不同高度投掷,用射线检测实时获取地面高度:

// 替换上面的heightToGround赋值
float heightToGround = 2f; // 默认值
RaycastHit hit;
// 向下发射射线检测地面(记得给地面Layer设为"Ground")
if (Physics.Raycast(attackPoint.position, Vector3.down, out hit, Mathf.Infinity, LayerMask.GetMask("Ground")))
{
    heightToGround = hit.distance;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 23:47:36