【问题标题】:Why does my raycast sometimes does detect a hit and sometimes wont?为什么我的 raycast 有时会检测到命中而有时不会?
【发布时间】:2018-06-05 19:58:42
【问题描述】:

我有一颗在刚体上使用 Impuls 发射的子弹。 然后,每一帧我都以子弹的速度向前进行光线投射,有时会,有时却找不到敌人。 当我逐帧跳过游戏时,我可以清楚地看到敌人的(boc)对撞机内的调试射线投射,但它仍然找不到。 我很确定它不只是通过敌人,在编辑器中我可以清楚地看到对撞机内部的绿色光线投射。

有什么建议吗?我也尝试了一个 linecast,我在这里找到了,但结果相同。 (这条线在完全相同的位置,并且还在对撞机内部绘制了调试线。层也是正确的,正如我所说,有时会,有时会找不到目标......

void Update()
{
  //get direction and distance
  Vector3 direction = _rigidBody.velocity.normalized;
  float distance = (_rigidBody.velocity.magnitude * Time.deltaTime);

  //raycast for targets
  RaycastHit raycast;
  if (Physics.Raycast(transform.position, direction, out raycast, distance, HitLayerMask))
  {
    Debug.DrawRay(transform.position, direction, Color.red);
  } 
  else
  {
    Debug.DrawRay(transform.position, direction, Color.green);
  }
}

您可以从侧面看到微小的调试射线以及对撞机。从正面看,它也几乎就在中间。 我在想这可能是因为光线投射的开始和结束都在 boxcollider 内?

刚体被移动

//Speed = 500 in this case, but lowering doesn't change anything
rigidBody.AddRelativeForce(Vector3.forward * Speed, ForceMode.Impulse);

更新:

经过更多的调试和测试,我发现它发生是因为你不会从对撞机内部受到撞击。 发生了什么:

  • bullet 在目标对撞机之外,但光线投射太短,无法找到它。

  • 子弹向前移动,敌人也向前移动(互相靠近)。子弹现在在​​对撞机内

  • raycast 找不到敌人,因为这就是 raycast 的工作原理

我能做的就是让光线投射的距离更远,但也不要太远,否则会导致奇怪的命中,在图形上看起来很奇怪。

我认为使用

float distance = (_rigidBody.velocity.magnitude * Time.deltaTime);

就足够了(因为这是自上一帧以来子弹移动的距离,但是由于敌人也在移动,所以上述情况可能发生。好吧,如果敌人不移动就足够了:/

【问题讨论】:

  • 可能距离(deltaTime)太大,你可以检查它是否比你的对象大,然后拆分它并在for循环中测试每一步。顺便说一句,我对图形一无所知,只是一些想法,不要引用我的话。
  • 我会尝试手动设置距离,看看是否可行,但我不想投得太远,因为这可能会导致奇怪的行为(在实际击中之前击中)
  • 不,你做的和我说的相反,你不需要做 x * 距离,你需要做 (x * distance/m), 1
  • 最好使用从前一个位置到当前位置的线播。或者对刚体进行连续检测。
  • 和linecast是一样的,也在boxcollider里面,还是检测不到,图像和上面的raycast差不多

标签: c# unity3d collision-detection raycasting


【解决方案1】:

一种可能的解决方案是转到Project Settings -> Script execution order 并将子弹的MonoBehavior 放在默认时间之后。这样,在你进行光线投射之前,其他所有东西都已经完成了移动。一个 hacky 解决方案,但应该可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-10
    • 1970-01-01
    • 1970-01-01
    • 2016-10-19
    相关资源
    最近更新 更多