3D 物理系统管理器

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

开启 3D 物理系统

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

  1. 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

代码示例:

  1. onTouchStart (event) {
  2. let touchLoc = event.touch.getLocation();
  3. let ray = cc.Camera.main.getRay(touchLoc);
  4. let maxDistance = 1000;
  5. let rayColliderGroupName = "ray collider group name";
  6. const results = cc.director.getPhysics3DManager().raycast(ray, rayColliderGroupName, maxDistance);
  7. if (results) {
  8. console.log(results);
  9. }
  10. }
  • cc.director.getPhysics3DManager().raycastClosest

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

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

代码示例:

  1. onTouchStart (event) {
  2. let touchLoc = event.touch.getLocation();
  3. let ray = cc.Camera.main.getRay(touchLoc);
  4. let maxDistance = 1000;
  5. let rayColliderGroupName = "ray collider group name";
  6. const result = cc.director.getPhysics3DManager().raycastClosest(ray, rayColliderGroupName, maxDistance);
  7. if (result) {
  8. console.log(result);
  9. }
  10. }