我是否遗漏了什么或Unity3d跳过了帧?

我是否遗漏了什么或Unity3d跳过了帧?,unity3d,collision-detection,coroutine,frame-rate,Unity3d,Collision Detection,Coroutine,Frame Rate,我有一把四口的枪。每个枪口可以发射一颗子弹(因此一次可以发射4颗子弹)。在我的场景中,我有100支枪,因此可以同时发射400发子弹 问题是,如果枪的数量低于20,那么就可以了,但是如果我把枪的数量提高到20以上,一些子弹就会穿过目标(一个大立方体)。如果立方体超过100,就会有大量子弹穿过 这是检查碰撞的代码: private IEnumerator ProjectileCoroutine() { while (Vector3.Distance(transform.position,

我有一把四口的枪。每个枪口可以发射一颗子弹(因此一次可以发射4颗子弹)。在我的场景中,我有100支枪,因此可以同时发射400发子弹

问题是,如果枪的数量低于20,那么就可以了,但是如果我把枪的数量提高到20以上,一些子弹就会穿过目标(一个大立方体)。如果立方体超过100,就会有大量子弹穿过

这是检查碰撞的代码:

private IEnumerator ProjectileCoroutine() {

    while (Vector3.Distance(transform.position, Target.transform.position) > 5)
    {                            
        yield return null;
    }

    Explode();
    yield break;
}
一些注意事项:

  • 游戏以49-68 fps的速度运行(现场有100支枪)
  • 我使用预制池方法
  • 上述代码在一个单独的协同程序(Start例程)中运行
谁能告诉我发生了什么事? 我怀疑Unity跳过了一些帧,因为Coroutine与它有一些联系。

我不认为Unity是“跳过帧”。也就是说,我希望您的协同程序在每个完整的图形帧中只运行一次。物理更新通常更频繁,尤其是在较低的帧速率下

请注意,子弹越多,场景运行可能越慢。对于时间步进的物理模拟,这意味着子弹必须每一步都移动得更远。如果子弹移动快,且时间步长大,则子弹可能在立方体中移动过远,以致无法在一帧中检测和解决碰撞。如果这是问题所在,您可能需要添加某种光线投射,以便更好地检测碰撞

也就是说,我不认为你的射影轨迹是解决碰撞的最好方法。首先,它似乎是检查一个球体,而不是一个立方体,在性能方面,为每一个项目运行它是一个坏主意


最好使用合适的对撞机,依靠实际的物理引擎来检测碰撞,而不是手动进行距离检查。

谢谢兄弟你救了我一天:)正如你提到的,这是一个时间步问题。因此,我转到->[Project Settings]->[Time],并将[Maximum Allowed Timestep]减少到0.02,然后再次点击Play。对性能没有影响(实际上它的速度提高了+10fps),所有子弹都停止通过立方体。另外,我切换回光线投射方法来检查碰撞。起初我怀疑光线投射对性能有巨大的影响,所以我尝试了一个纯数学的解决方案。还有一点,移动的对撞机会严重影响性能,尤其是当您有多台对撞机时。:)