不使用对撞机的光线投射

Raycast without using a collider

我正在做一个 Voxel 游戏,我的引擎使用 Physics.raycasts 和 Mesh 碰撞器来获取您到目前为止单击的块的坐标。我决定移除网格对撞机,因为它在某些情况下消耗了太多的性能,并且我将 fps 下拉到 0.1fps 几秒钟(例如,你应该能够滚动 y 层)而我只需要它用于光线投射。我不使用任何其他物理相关的东西。如果没有网格碰撞器,帧速率稳定在 60 到 100 fps,但现在我发现很难找到另一种方法来获取有关我正在单击的块的信息。

有什么建议吗?

到目前为止我正在使用这段代码:

public Vector3? GetBlockCursor(){
    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    RaycastHit hit;

    if(Physics.Raycast(ray, out hit)) {
        hit.point += (hit.normal * -0.5f);
        hit.point = new Vector3(Mathf.RoundToInt(hit.point.x), Mathf.RoundToInt(hit.point.y),
                                Mathf.RoundToInt(hit.point.z));
        return hit.point;
    }
    else return null;
}

很难说,因为它总是取决于游戏逻辑,优化的内容和位置是有效的。基本上每帧一个或几个光线投射对 PhysX 来说应该不是什么大问题,所以我认为还有其他罪魁祸首。一些建议(也许你已经考虑过了):

  • 使用复合碰撞器,尤其是盒子和球体。 Rigidbody manual
  • 始终将刚体附加到移动的项目
  • 将对 GetBlockCursor 的调用限制为每次更新一次或更少,仅在每 2 次或 3 次更新时调用它
  • 如果您需要多个光线投射,请考虑使用 Physics.RaycastAll
  • 如果物理引擎是导致帧率大幅下降的原因,请检查是否可以使用 layers 来优化计算
  • 使用探查器(前提是您拥有 Pro 许可证)