碰撞组件

    以获取BoxCollider为例,在JavaScript中获取Collider组件:

    1. this.getComponent(BoxCollider)

    TypeScript中获取Collider组件:

    1. 上述JavaScript使用的方式
    2. this.getComponent(BoxCollider) (推荐使用,提示导入时,注意导入位置为cc)

    组件具有isTrigger属性,当isTriggertrue时,表示为触发器,反之为碰撞器。

    首先,ColliderRigidBody组件都是为了服务于物理元素,分别操控着物理元素上的一部分属性。这也意味着要了解它们之间的关系,需要先了解 Cocos Creator 3D 中的物理元素是如何构成的。

    物理简介中,介绍了一个物理元素是由ColliderRigidBody组件相互组合而成的,其中指出了物理元素只能有一个或零个RigidBody组件,并且可以有多个Collider组件。

    对于节点链的情况,目前有两个思路:

    1. 每个节点只要有物理组件,就是一个元素,也就是说父子节点的组件无依赖关系,需要多个形状,往该节点上添加相应的Collider组件。

    2. 从自身节点开始往父链节点上搜索,如果找到了RigidBody组件,则将自身的Collider组件绑定到该节点上,否则整条链上的Collider组件将共享一个RigidBody组件,元素对应的节点是最顶层的Collider组件所对应的节点。

    这两个思路各有利弊:

    • 思路一不够直观,多个形状只能往一个节点上加,显示形状需要增加子节点模型。
    • 思路一调整参数时,需要调整两个地方,分别为子节点的位置信息和父节点上对应组件的数据信息。
    • 思路二在节点链被破坏时,需要维护内容更多,节点链在反复被破坏时需要处理复杂的逻辑。

    ColliderattachedRigidbody属性

    Collider组件中具有attachedRigidbody属性,此属性可获得当前Collider组件所绑定的RigidBody组件,但是请注意以下几点:

    • 在自身节点无RigidBody组件时,该属性返回为null
    • attachedRigidbody是一个只读的属性。

    每一个组件都会绑定一个节点,有些组件会根据绑定的节点动态更新数据,碰撞体组件会根据节点信息自动更新相应的形状数据,让碰撞体可以更方便的贴合渲染模型。

    更新数据,以模型组件举例:

    但碰撞体的有些性质导致缩放的处理不太一样:

    • 碰撞体一般用几何结构来描述
    • 碰撞体大部分都是凸包类型

    这些性质限制了切变、非均一缩放等变换,以球举例:

    假设绑定节点的缩放信息是(1,2,1)(非均一缩放),由于模型和碰撞体描述的结构不一样,球模型使用多个基础图元(如三角面)来表示,缩放后会形变成类似于鹅卵石的形状;但球碰撞体的使用半径大小来描述,缩放时会取数值最大的维度来缩放半径(来保证碰撞体可以尽可能的包围住模型),但缩放后还是一个球。

    碰撞体拥有物理材质属性,相关内容在物理材质中有详细介绍,这里主要介绍共享和非共享的接口区别。

    目前Collider组件提供了两个属性去访问和设置,分别为materialsharedMaterial,它们的区别主要如下:

    1. 设置sharedMaterial或者material是一样的效果,在没有调用这些接口之前是共享状态,当发现设置的与当前引用不是同一实例时,后面获取material将不会生成新的材质实例,此时是非共享状态。

    2. 在共享状态前提下,获取material将会生成新的材质实例,以确保只有当前碰撞体引用了该材质,这样修改时不会影响到其他的碰撞体,之后就是非共享状态了。


    继续前往 说明文档。