【发布时间】: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