unity3D碰撞器与触发器

552 阅读4分钟

一 , 碰撞性和触发性的定义

  • 碰撞性表现为两个游戏对象发生碰撞(被检测到之后)进而表现出相关的物理效果,以及相应的脚本碰撞方法调用 。 这种物理效果至少会出现在其中一个游戏对象上 ,但对脚本碰撞方法的调用是两个游戏对象所共同具备的 。 碰撞性的关键在于不会发生穿透效应 ! 碰撞体在一定条件下才会产生碰撞性 !
  • 触发性表现为两个游戏对象发生碰撞时 , 不表现相关的物理性质 ,但会调用相应的脚本触发方法 ,这种调用也是两个游戏对象都具有的 ; 触发性的关键在于一定会发生穿透效应 !当碰撞体勾选 is trigger 属性后 , 碰撞体便成为了触发体 , 在一定条件下 , 便会产生触发性 !

二 ,碰撞性的产生条件 : 碰撞被检测到 ;

  • 若A有刚体,B无刚体。A作为主动方撞B,两者都会检测到碰撞 ,A表现出的物理效果是被阻挡移动,B不动(无刚体) ,两者都会调用相关的碰撞方法 ;若B作为主动方撞A ,两者都不会检测到碰撞 ,B会直接穿过A ,A和B都不会有物理效果  , 两者也不会调用相应的碰撞方法 ;
  • 若A和B都有刚体 , 那么发生碰撞时 ,碰撞被检测到 , 物理引擎会自动产生碰撞后的物理效果 , 从而两者的碰撞处理方法都会被调用 ;
  • 由此可见 , 碰撞性产生的条件在于 : 两盒

三 , 触发性产生的条件 :触发被检测到 ;

  • 若两者都没有刚体 , 则不会检测到触发 , 两者也都不会调用相应的脚本触发方法 !
  • 若A有刚体,B无刚体。无论A撞B,抑或是B撞A , 两者都会检测到触发 ,并且都会进入到相应的脚本触发函数 ;
  • 若两者都具有刚体 , 两者都会检测到触发 ,并且都会进入到相应的脚本触发函数 ;
  • 由此可见 , 触发性的产生条件在于 : 至少有一方为触发体 , 并且至少有一方是刚体 , 至于是其中一方有刚体的同时也是触发体 , 还是其中的一方为触发体 , 另一方为刚体 ,都不影响触发性的产生 。

四 , 碰撞性和触发性的排斥性

 若两个游戏对象发生了接触 , 那么它们两者都只会表现出一种性质 , 要么是碰撞性 , 要么是触发性 , 不会出现一个游戏对象表现为触发性 , 而另一个游戏对象表现为碰撞性 。
 

五 , 游戏对象对“触发性”和“碰撞性”的单一选择性 :

五 ,触发性的典型应用场景 :

  • 在游戏中 , 经常看到角色进入某个特定区域后 , 便被传送到另一个区域 , 这便是触发性的体现 。 这种情境下 , 由于特定区域是触发体(脚本中只存在触发函数) ,主角是刚体和碰撞体(脚本中既存在触发函数也存在碰撞函数) , 满足触发性产生的条件 , 两者都只检测到了触发 , 而不是碰撞 ,于是主角脚本的触发函数被执行 , 使其传送到另一个区域 , 特定区域的脚本触发函数也被执行 ,使得区域提示光环消失 。作为上述场景的一个对比 , 我们可以举例对比场景如下 : 有一个箱子被设置为刚体和碰撞体 , 主角和上述一样还是刚体和碰撞体 , 当主角碰撞到箱子以后 , 箱子便会被推开 , 即由引擎自动产生了物理效果 。最关键的区别在于 ,上述的两个对象 ,都是进入了碰撞函数(如果存在的话) ,而不是触发函数 。

  • 在典型的第一人称射击游戏中 , 当主角接触到大门时 , 大门便自动打开 ,并不是产生了碰撞性 , 而是产生了触发性 。 这种情况下 , 主角作为刚体和碰撞体 , 大门只需要被设置为触发体(是不是刚体都无所谓,根据具体情况即可) 。 大门打开的效果尤其脚本中的触发函数处理 ,而不是物理引擎 ; -在打飞机游戏中 ,我方发射的子弹 , 是被设置为触发体和刚体的 , 敌机都是被设置为碰撞体的 。 这也满足了触发性产生的条件 , 于是 , 触发被检测到那一刻 , 子弹的OnTriggerEnrter(...)函数便被执行 , Destroy了子弹 。 与此同时 , 敌机的OnTriggerEnter(...)函数也被执行 ,减少了生命值 。