没有使用对撞机的Raycast

时间:2015-02-24 17:06:55

标签: unity3d position raycasting voxel

我正在做一个Voxel游戏,我的引擎使用Physics.raycasts和Mesh colliders来获取你点击的块的坐标,直到现在。我决定移除网格对撞机,因为它在某些情况下只是吃太多的性能而且我的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;
}

1 个答案:

答案 0 :(得分:2)

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

  • 使用复合碰撞器,特别是盒子和球体。 Rigidbody manual
  • 始终将刚体附加到移动物品
  • 将每次更新的呼叫限制为GetBlockCursor一次,或仅通过每次第二次或第三次更新调用
  • 如果您需要多个光线投影,请考虑使用Physics.RaycastAll
  • 如果物理引擎要归咎于显着的帧速率下降,请检查是否可以使用图层来优化计算
  • 使用分析器(如果您拥有专业版许可证)