为什么我的光线投射有时会检测到命中,有时候不会?

问题描述 投票:0回答:1

我有一颗子弹在刚体上用Impuls射击。然后,每一帧我都会以子弹的速度向前投射光线,有时这样做,有时候找不到敌人。当我逐帧浏览游戏时,我可以清楚地看到我的调试光线投射在敌人的(boc)对撞机内,但它仍然无法找到它。我很确定它不仅仅是通过敌人,在编辑器中我可以清楚地看到对撞机内的绿色光线投射。

有什么建议?我也尝试过在线播放,我在这里找到了,但这给出了相同的结果。 (该线位于完全相同的位置,并且还在对撞机内绘制调试线。这些层也是正确的,正如我所说,有时它会,有时它不会找到目标......

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里面?

Editor Screenshot

刚体移动了

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

更新:

经过一些调试和测试后,我发现它发生了,因为你不会从对撞机内部受到攻击。这是发生的事情:

  • 子弹是在目标对撞机之外,但是光线投射是为了找到它。
  • 子弹向前移动,敌人也向前移动(彼此接近)。子弹现在在​​对撞机里面
  • raycast不会找到敌人,因为那就是光线投射的工作方式

我能做的是,使光线投射的距离更远,但也不会太远,以至于它会导致奇怪的命中,这在图形上看起来很奇怪。

我认为使用

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

这就足够了(因为这是自从最后一帧以来子弹行进的距离,但由于敌人也会移动,上述情况也会发生。好吧,如果敌人不动,那就足够了:/

c# unity3d collision-detection raycasting
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.