3.7.2 物理系统管理器

优质
小牛编辑
138浏览
2023-12-01

物理系统(Physics3DManager)可以模拟真实的物理行为进行碰撞检测以及计算物体的受力情况,然后将模拟结果反馈给渲染层。

开启 3D 物理系统

3D 物理系统默认是关闭的,如果需要使用可以通过以下命令行开启,否则运行时不会产生任何效果。

cc.director.getPhysics3DManager().enabled = true;

3D 物理系统属性与接口

属性功能说明
enabled是否开启物理系统,默认为 false
allowSleep是否允许物理系统自动休眠,默认为 true
maxSubStep物理每帧模拟的最大子步数,默认为 2
deltaTime物理每步模拟消耗的时间,默认为 1/60 秒
gravity物理世界的重力值,默认为 (0, -10, 0)

API 接口相关可参考 Physics3DManager

注意:Builtin 物理引擎不支持以上与物理模拟相关的属性。

射线检测

射线检测用来检测给定的线段穿过哪些碰撞体。支持以下两种类型:

  • cc.director.getPhysics3DManager().raycast

    通过 cc.director.getPhysics3DManager().raycast 接口,检测射线路径上所有与射线发生碰撞的碰撞体,检测到的结果顺序不是固定的。

    • 若没有检测到任何碰撞体,则返回 null
    • 若有,则返回一个包含所有碰撞结果的数组。具体的内容可参考 API 文档 raycast

      代码示例:

      onTouchStart (event) {
        let touchLoc = event.touch.getLocation();
        let ray = cc.Camera.main.getRay(touchLoc);
        let maxDistance = 1000;
        let rayColliderGroupName = "ray collider group name";
        const results = cc.director.getPhysics3DManager().raycast(ray, rayColliderGroupName, maxDistance);
        if (results) {
            console.log(results);
        }
      }
      
  • cc.director.getPhysics3DManager().raycastClosest

    通过 cc.director.getPhysics3DManager().raycastClosest 接口,检测射线路径上所有与射线发生碰撞的距离最短的碰撞体。

    • 若没有检测到任何碰撞体,则返回 null
    • 若有,则返回符合要求的碰撞体,用法与 raycast 接口类似。具体内容可参考 API 文档 raycastClosest

      代码示例:

      onTouchStart (event) {
        let touchLoc = event.touch.getLocation();
        let ray = cc.Camera.main.getRay(touchLoc);
        let maxDistance = 1000;
        let rayColliderGroupName = "ray collider group name";
        const result = cc.director.getPhysics3DManager().raycastClosest(ray, rayColliderGroupName, maxDistance);
        if (result) {
            console.log(result);
        }
      }