我错过了什么或Unity3d跳过帧吗?

时间:2015-01-24 15:30:15

标签: unity3d collision-detection coroutine frame-rate

我有一把枪,有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;
}

一些注意事项:

  • 游戏运行速度为49 - 68 fps(现场100支)
  • 我使用预制池方法
  • 以上代码在分离的协程(StartCoroutine)
  • 中运行

任何人都可以告诉我发生了什么事吗? 我怀疑Unity会跳过一些帧,因为Coroutine与它有一些联系。

1 个答案:

答案 0 :(得分:2)

我不认为Unity是“跳帧”。也就是说,我希望你的协程只能在每个完整的图形框架上运行一次。物理更新通常更频繁地发生,尤其是在较低的帧速率下。

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

那就是说,我不认为您的ProjectileCoroutine是解决碰撞的最佳方式。对于初学者来说,它似乎是检查一个球体,而不是一个立方体,并且为每个子弹运行它是一个糟糕的主观表现。

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