Unity基础——物理系统

系列文章

物理系统

Unity可以在游戏中模拟使用物理系统,以确保对象正确加速并对碰撞、重力和各种其他力做出响应。Unity 提供了以下不同的物理引擎实现方案,您可以根据自己的项目需求选用:3D、2D、面向对象或面向数据。

面向对象的项目内置的物理引擎

面向数据的项目物理引擎包

如果项目中使用的时面向数据的技术堆栈(DOTS),则需要安装专用的DOTS物理包,可用的包括:

  • Unity Physics包:默认需要安装的 DOTS 物理引擎,用于在任何面向数据的项目中模拟物理系统。
  • Havok Physics for Unity包:适用于 Unity 的 Havok 物理引擎的实现方案,用作 Unity Physics 包的扩展。请注意,此包受制于特定的许可方案。

内置3D物理引擎

Unity内置物理引擎集成的是Nvidia PhysX,使用该引擎,可以方用以下内容来进行物理系统的模拟:

  • CharacterControl,角色控制,为第一人称及第三人称角色听基础的物理配置;
  • Rigidbody Physics,刚体物理,为GameObject赋予物理行为;
  • Collision,碰撞体,使用碰撞体来完成多个GameObject间的碰撞行为物理模拟;
  • Joints,应用并配置连接GameObjects并模拟旋转、移动和限制的物理力的关节;
  • Articulations,配置刚体和关节组成的复杂物理系统;
  • Ragdoll Physics,为角色配置布娃娃物理;
  • Cloth,布料系统,用来模拟人物服装和其他应用纺织品的织物运动;
  • Multi-scene Physics,使用多个专用物理场景在一个项目中管理不同的物理环境;

CharacterControl

第一人称和第三人称视角的游戏中,游戏角色通常需要一直基础的物理碰撞属性支持,这样游戏角色就不会从地板上掉下去或者不会穿墙。在3D应用中,可以通过CharacterControl来创建并配置一个这样的游戏角色,主要通过CharacterController和CharacterControl 组件来配置。

CharacterController控制器

CharacterController的属性

区别于直接用Transform或者RigidBodyCharacterController有着更好的效果,它拥有RigidBody的一些重要特性,但是又去掉了很多物理效果,这样可以避免诸如穿模,滑步,被撞飞或者将其他物体撞位移等情况。主要属性如下:

  • Slope limit,斜度限制,代表的是角色能爬上的最大坡度;

  • Step offset,每部偏移量,其实就是能走上的台阶的高度。这其实是很有用的一个属性,走上一些高度不是很高的台阶或者石头之类的东西不再需要跳跃,这也更符合实际的移动情况。

    这个值有一个限制即该值必须小于等于(高度+半径*2)(上分图片中的最下方两个值),这个设定其实很好理解,毕竟你一个一米七的人不可能一步跨上一米多的台阶吧

  • Skin width,蒙皮宽度,碰撞体外层再添加一层,用来放置衣服等装饰物品;

    1. 要正确调整角色控制器,Skin Width 属性是最重要的属性之一。 如果角色被卡住,那么很可能是因为 Skin Width 设置过小。Skin Width 允许对象轻微穿透控制器,但可消除抖动并防止被卡住。

    2. 最好是让 Skin Width 的值至少大于 0.01 并且比 Radius 的值大 10%。

    3. 两个碰撞体可以穿透彼此且穿透深度最多为皮肤宽度 (Skin Width)。较大的皮肤宽度可减少抖动。较小的皮肤宽度可能导致角色卡住。合理设置是将此值设为半径的 10%。
  • Min move Distance,最小移动距离

    1. 建议将 Min Move Distance 保持为 0。
    2. 此设置可以用来减少抖动。在大多数情况下,此值应保留为 0。
  • Center,碰撞体的中心

  • Radius,碰撞体的半径

  • Height,碰撞体的高度

CharacterController的操作方法