unity学习(四)——物理系统

Rigidbody

Rigidbody 是 GameObject进行物理行为的主要部件。一旦与 Rigidbody关联,物体将会立刻受到重力的影响。如果再添加一个或多个 Collider不见,GameObject会因碰撞而移动。
因为 Rigidbody组件接管了与它相关联的 GameObject的移动,你就不应该再通过由脚本来改变 Transform属性来移动此物体。因此,你应该用力学来推动 GameObject且让物理引擎来计算结果。(要好好学物理了。。)
以下还有一些情况你也可能会需要含有 不会被物理引擎控制的 Rigidbody的 GameObject。例如,你可能会需要直接从脚本控制你的角色但仍它仍可以被 triggers(后面会介绍)探测到,这种由脚本产生的非物理移动被称为 kinematic运动。Rigidbody组件有一个 kinematic属性,这个属性把它从物理引擎的控制中移除并通过脚本移动。从脚本改变 Is Kinematic以允许打开/关闭物体的物理是可行的,但是会有一些运行上的开销(尽量少用)。

睡眠模式

当 Rigidbody移动的比预定义的最小线/旋转速度慢时,物理引擎会假定它已经停止。这样做后 GameObject将不会再移动了,直到它受到碰撞或力,并进入“睡眠”模式。这种优化意味着 Rigidbody不再占用处理器的时间来更新,直到他再次被“唤醒”(即再次处于运动状态)。
在大多数情况下,Rigidbody组件进入睡眠或唤醒是很明显地。然而,如果 Static Collider(没有 Rigidbody的 GameObject)通过修改 Transform位置来靠近或原理某个 GameObject,这个GameObject可能唤醒失败。这可能会导致,当地板从它下方移走后, Rigidbody GameObject悬在空中。对于这种情况, GameObject使用 WakeUp函数显式地唤醒 GameObject。

Colliders

Collider组件定义了 GameObject的形状,以供物理碰撞用。Collider是不可见的,不需要与 GameObject网格形状相同。在 gameplay中,大概的网格形状就够用了。
最简单的 colliders是初始 collider种类。在 3D中,这些种类有 Box(盒) Collider,Sphere(球) Collider和 Capsule(胶囊) Collider。在 2D,你可以用 Box Collider 2D和 Circle Collider 2D。

复合 Colliders

复合 colliders估计 GameObject的形状,且只花费少量处理器开销。你也可以为 child GameObjects灵活地添加额外的 colliders。例如,你可以相对于 parent GameObject的坐标轴转动盒子。当你构建了这样的复合 collider,你就应该只使用一个 Rigidbody组件,放置在层级系统中的源 GameObject上。
初始 colliders在不能用于剪切变换。

网格 Colliders

对于某些情况,偶数个复合 colliders不够精确。在 3D中,你可以使用网格 Colliders来精确地匹配 GameObject的网格形状。
这类 colliders比起初始种类来说,会消耗更多处理器资源,尽可能少用。当然,网格 collider不会与另一个网格 collider碰撞(也就是说,在他们接触时,什么都不会发生)。在一些情况中,你可以在 Inspector中将网格 collider标记为 Convex来绕过这条特性。这会产生一种“convex hull” collider形状。(这种形状跟起始网格很像,但不会有任何 undercut)(?)这样做的好处是,一个 convex mesh collider可以与其他 mesh collider碰撞,所以当你有一个移动中的角色时,你可以使用这条特性。

Static(静态) Colliders

你可以用静态 Colliders来为没有 Rigidbody组件的 GameObject添加 colliders来构造地板、墙和在场景中不需要移动的元素。你不能通过改变 Transform位置来重定位静态 colliders,因为这将严重影响物理引擎的性能。在有 Rigidbody的 GameObject上的 Colliders被称为动态 colliders。静态 colliders能与动态 colliders交互,但是由于它们没有 Rigidbody,它们不能因碰撞而移动。

物理材料

当 colliders交互时,它们的表面需要对它们所表示的材料的属性进行仿真。例如,一层冰很滑,一个橡胶球会摩擦且具有弹性。虽然 colliders的形状在碰撞期间不会形变,但是它们的摩擦和弹力能由物理材料来配置。

Triggers

在碰撞发生时,脚本系统能检测到,且使用 OnCollisionEnter函数初始化动作。然而,你也可以使用物理引擎来简单地检测到一个 collider在没有产生碰撞时进入其他区域。一个配置为 Trigger的 collider(使用 Is Trigger属性)与固态物体不同,且能简单地允许其他 collider穿过。在一个 collider进入它的区域后,trigger会在 此物体的脚本中调用 OnTriggerEnter函数。

To be continued....

猜你喜欢

转载自www.cnblogs.com/qing2019/p/12729518.html