unity-game-engine - 不使用碰撞器的光线转换

标签 unity-game-engine position raycasting voxel

我正在做一个体素游戏,我的引擎使用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/

相关文章:

javascript - Three.js 中动态更改网格后的光线转换

c++ - 奇怪的光线追踪伪影

unity-game-engine - 将外部项目添加到统一解决方案

android - 解析,推送通知。如何重置安装数据?

mongodb - 获取所选文档在集合中的位置 [mongoDB]

javascript - 获取一排 float div中的最后一个div

c# - unity 脚本对象在构建中不起作用

java - 为移动多人游戏创建服务器

javascript - 使用鼠标滚轮和侧边栏更改 Div Y 位置

javascript - 试图获得光线转换器的交点