一.概述
物理系统中要产生碰撞效果需要碰撞的两个物体都有碰撞器并且至少一个物体持有刚体组件。想要让两个物体表现出不同的物理效果,可以为刚体组件添加物理材质。在制作像自动门等游戏物体时可以使用触发器使碰撞的两个物体取消碰撞产生的物理效果。
二.物理碰撞相应函数
在MonoBehaviour的生命周期函数中,在循环更新的函数部分,物理效果有关的更新是最先执行的,这些函数中常用的有FixedUpdate函数和OnTriggerXXX、OnCollisionXXX等函数,后两个函数就是处理游戏碰撞相关的。
1.OnCollisionXXX函数
//进入物理碰撞时 private void OnCollisionEnter(Collision collision) { } //在物理碰撞中 private void OnCollisionStay(Collision collision) { } //物理碰撞结束时 private void OnCollisionExit(Collision collision) { } //2D的进入物理碰撞函数 private void OnCollisionEnter2D(Collision2D collision) { } //2D的物理碰撞中函数 private void OnCollisionStay2D(Collision2D collision) { } //2D的物理碰撞结束时 private void OnCollisionExit2D(Collision2D collision) { }
3D游戏的物理碰撞函数和2D游戏不同,但是都是一个套路的,接下来也仅以3D为例。物理碰撞函数都有3个,分别是OnCollisionEnter(当两个物体的碰撞器接触的一瞬间)、OnCollisionStay(当两个物体的碰撞器持续接触中)、OnCollisionExit(当两个物体的碰撞器脱离接触的瞬间)。物理碰撞函数的参数是Collision类的一个变量,这个类如下图:
其中有11个属性和4个方法,其中一些比较常用的属性如下:
collider:碰撞到的碰撞器的触发器信息;gameObject:碰撞到的碰撞器依附的游戏物体;transform:碰撞到的碰撞器依附游戏物体的位置信息;contactCount:碰撞点个数;contacts:所有碰撞点。
2.OnTriggerXXX函数
private void OnTriggerEnter(Collider other) { } private void OnTriggerStay(Collider other) { } private void OnTriggerExit(Collider other) { }
和Collision函数相同,同样有3个函数分别对应开始碰撞时、碰撞中、碰撞结束时触发,有3D的触发器函数也有2D的触发器函数。注意:要想使用触发器,也就是取消碰撞的物理效果,两个物体的碰撞器中至少一个碰撞器必须勾选isTrigger参数:
三个函数的参数都是Collider类对象,这个类如下图:
这个对象保存了碰撞的物理材质、刚体等信息。