您的位置:首页 > 移动开发 > Unity3D

关于Unity碰撞和触发的总结

2016-02-27 18:58 1371 查看
1、Static Collider属于没有rigidbody的碰撞器,当勾选isTrigger属性时,它将和其它非Static Collider触发OnTriggerXX消息(二者均会收到),并且需要注意的是,必须保证Static Collider物体是静止的,并且不会运行时切换开关状态,否则将造成性能损耗和不正确的结果。

2、Kinematic Collider属于有rigidbody但是rigidbody设置了isKinematic属性的碰撞器。它可以运动,并且可以和Trigger类静态碰撞器触发OnTriggerXX消息,也可以和Rigidbody碰撞器触发OnCollisitionXX消息,但是本身不会有物理模拟效果。Kinematic Collider之间不会触发碰撞消息。

3、Rigidbody Collider属于有rigidbody并关闭了isKinematic属性的碰撞器。它不能运动,仅受物理系统影响。可以和Static Collider、Kinematic Collider 以及同类型的Collider发生物理碰撞,并触发OnCollisionXX消息,也可以与所有的Trigger Collider触发OnTriggerXX消息,但并不会有物理效果。

4、OnCollisionXX消息触发时一定有一方是Rigidboy Collider并且双方都没有Trigger属性,这是物理碰撞发生时才触发的消息。OnTriggerXX消息是当任何一方有isTrigger属性并且至少一方不是Static Collider时触发,这是非物理碰撞时才触发的消息。

5、OnCollisionXX消息和OnTriggerXX消息是互斥的,其触发条件一定是不同的,不可能同时被触发。

6、OnCollisionXX或者OnTriggerXX消息会分别发送给参与碰撞的物体,发送顺序具有无关性,所以不要做依赖于触发顺序的逻辑,需另寻解决方案。

7、可以控制运动但同时也会受物理模拟影响可以通过动态设置isKinematic属性开关来完成。

8、CharacterController:
8.1、CharacterController只可以与Rigdbody Collider 触发OnCollisionXX消息,前提是直接移动CharacterController的transform去碰撞RigidbodyCollider,其自身不受物理系统影响。

8.2 、如果使用CharacterController.Move(Vector3 motion)方法移动角色控制器物体,则它的移动会分别被StaticCollider、KinematicCollider和rigidBodyCollider阻挡,没有OnCollisionXX消息触发,触发的是OnControllerColliderHit消息(单向的,仅发送给CharacterController物体),并且除了角色控制器物体被阻挡外,没有其它物理效果,也就是尽管碰撞的是一个RigidBodyCollider,该RBC也不会有物理效果,需要另外控制AddForce使其移动。

8.3 、CharacterController可以与任何触发类碰撞器触发OnTriggerXX消息,前提是任何一方有rigidbody,否则不会有任何效果

8.4 、CharacterController互相碰撞:
8.2.1、 如果直接控制Transform产生碰撞,不会触发任何消息,不会互相阻挡,出现穿插
8.2.2、 使用CharacterController.Move产生碰撞,不会触发任何消息,但会互相阻挡,不会出现穿插

8.5、RigidbodyCollider主动碰撞CharacterController后,会触发OnCollisionXX消息,并且前者有物理碰撞效果

8.6 、当不使用CharacterController.Move方法产生碰撞时,CharacterController就完全相当于一个StaticCollider,反之则如8.2。

9、OnCollisionXX和OnTriggerXX消息都是双向的,而OnControllerColliderHit消息是单向的(仅发送给CharacterController)

10、备注:Unity官方表格(可以把ChracterController结合进去)



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: