# 物理系统

# 系统简介

使用物理系统可以为场景中的3D物体添加物理效果,使它们能产生符合物理规律的移动、旋转以及碰撞。

小游戏框架内集成了Nvidia PhysX,并采用简单易用的组件化设计。让用户能以最小的代价快速上手,轻松地为游戏添加逼真且高性能的物理效果。

游戏脚本中可以通过game.physicsSystem来获取到物理系统的全局实例。

# 快速上手

点击下载物理性能demo,在工具中直接上手体验。

点击下载工具新手引导,直接在工具中按流程学习。

也可以点击这里学习如何让场景中的立方体变成物理世界中的刚体,并落在地板上。

# 物理模拟

物理系统会收集场景中带有物理组件的物体,并在Update()之后、LateUpdate()之前,对它们进行物理模拟

物理模拟的过程中,带有速度的刚体会前进,可能会受到重力、摩擦力、阻尼等影响而产生加速度;碰撞体(或Trigger)之间会发生碰撞,改变它们的运动状态,并生成物理事件

每次物理模拟的时长都是固定的,一般来说会小于渲染帧的时长,默认为0.02s,可以通过PhysicsSystem.fixedDeltaTime来改变。在一帧中可能会发生多次物理模拟,具体次数视渲染帧的时长而定。

每次物理模拟结束后,会先产生物理事件,然后调用一次用户脚本内的onFixedUpdate函数。

# 物理组件

  • Rigidbody:刚体组件,让物体能在物理模拟阶段发生位移或旋转;
  • Collider:碰撞体组件,描述物体的形状,使其能发生碰撞;
  • CharacterController:物理角色控制器组件,可以模拟角色在充满障碍物的世界里移动。
  • Joints:关节组件,可以用各种方法连接刚体和另一个刚体(或空间位置),来限制刚体的移动和旋转。

# 物理资源

# 物理工具函数

全局物理工具函数挂载于game.physicsSystem上。

  • 射线检测
    可以手动向场景投射一条射线(或者其他形状),检测与射线相交的物理碰撞体。
    详见 API 文档中rayCast,boxCast,overlapBox等。

  • 物理碰撞矩阵
    可以通过设置物理碰撞,来设定某些Layer之间,不发生物理碰撞。

    在工具内的ProjectSetting标签内,可以手动设置碰撞矩阵。

    也可在脚本内调用PhysicsSystem.ignoreLayerCollision,来设定某两个 layer 不碰撞。