我是不是遗漏了什么或者 Unity3d 跳帧了?

Am I missing something or Unity3d skips frames?

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

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

这是检查碰撞的代码:

private IEnumerator ProjectileCoroutine() {

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

    Explode();
    yield break;
}

一些注意事项:

谁能告诉我发生了什么事? 我怀疑 Unity 跳过了一些帧,因为协程与它有一些联系。

我不认为 Unity 是 "skipping frames"。也就是说,我希望您的协程每个完整图形帧只会 运行 一次。物理更新通常更频繁地发生,尤其是在较低的帧速率下。

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

也就是说,我认为您的 ProjectileCoroutine 不是解决冲突的最佳方式。对于初学者来说,它似乎检查的是一个球体,而不是一个立方体,运行对每颗子弹进行检查在性能方面是个坏主意。

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