如何使飞刀落地穿刺点间距相等?射击角度计算方案咨询
解决方案:让飞刀地面穿刺点间距相等
你的问题核心是均匀角度增量会导致地面穿刺点间距不均匀——因为水平距离和投掷角度的关系是水平距离 = 投掷高度 × tan(角度),而tan函数不是线性的,固定加角度会让点越往两边越稀疏。要实现等间距,得反过来用反正切函数计算每个飞刀的角度。
实现步骤
- 确定两个关键参数:
heightToGround:投掷点(attackPoint)到地面的垂直高度desiredSpacing:你想要的相邻穿刺点水平间距
- 对每把飞刀,计算它相对于中间位置的水平偏移,再用
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
相关产品推荐
相关产品推荐

