我正在做一个体素游戏,我的引擎使用Physics.raycasts和网格碰撞器来获取您到目前为止点击的 block 的坐标。我决定删除网格碰撞器,因为它在某些情况下消耗了太多性能,并且我的 fps 下降到 0.1fps 几秒钟(例如,您应该能够滚动浏览 y 层),而我只需要它用于光线转换。我不使用任何其他与物理相关的东西。如果没有网格碰撞器,帧速率稳定在 60 到 100 fps,但现在我发现很难找到另一种方法来获取我正在单击的 block 的信息。
有什么建议吗?
到目前为止我正在使用这段代码:
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
的调用限制为每次更新一次,甚至每第二次或第三次更新调用更少 - 如果您需要多个光线转换,请考虑使用 Physics.RaycastAll
- 如果物理引擎导致帧速率显着下降,请检查是否可以使用层来优化计算
- 使用探查器(前提是您拥有专业版许可证)
关于unity-game-engine - 不使用碰撞器的光线转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28701923/