我有一颗子弹在刚体上用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内?
刚体移动
//Speed = 500 in this case, but lowering doesn't change anything
rigidBody.AddRelativeForce(Vector3.forward * Speed, ForceMode.Impulse);
更新:
经过一些调试和测试后,我发现它发生了,因为你没有从对手内部获得一击。 这里发生了什么:
子弹在目标对撞机之外,但是光线投射是为了找到它。
子弹向前移动,敌人也向前移动(彼此接近)。 Bullet现在位于对撞机内
raycast找不到敌人,因为那就是光线投射的工作方式
我可以做的是,使光线投射的距离更远,但也不会太远,以至于它会导致奇怪的命中,这在图形上看起来很奇怪。
我认为使用
float distance = (_rigidBody.velocity.magnitude * Time.deltaTime);
就足够了(因为这是自从最后一帧以来子弹行进的距离,但由于敌人也会移动,上面的情况也会发生。嗯,如果敌人不动,那就足够了:/
答案 0 :(得分:0)
一种可能的解决方案是转到Project Settings -> Script execution order
并在默认时间之后放置子弹的MonoBehavior。这样,在你进行射线投射之前,其他所有东西都已经完成了移动。一个hacky解决方案,但应该工作。