碰撞器和触发器更新

来源:互联网 发布:玩游戏防闪退软件 编辑:程序博客网 时间:2024/05/15 17:12
  
     1、碰撞器和触发器

      在unity3d中,能检测碰撞发生的方式有两种,一种是利用碰撞器,另一种则是利用触发器。这两种方式的应用非常广泛。为了完整的了解这两种方式,我们必须理解以下概念:


    (1)碰撞器是一群组件,它包含了很多种类,比如: Box ColliderCapsule Collider等,这些碰撞器应用的场合不同,但都必须加到GameObjecet身上。


    (2)所谓触发器,只需要在检视面板中的碰撞器组件中勾选IsTrigger属性选择框。


    (3)在第一部分已经提到,刚体可以计算物体将怎样响应碰撞,因此向实现碰撞检测功能需要给主角添加刚体(Rigidbody)组件,并且取消刚体组件的使用引力(UseGravity)选项。


      2、实现碰撞检测的两种方法


      触发器

      一个触发器不会碰撞刚体。当一个刚体进入或退出触发器,将发送OnTriggerEnter, OnTriggerExit  OnTriggerStay消息。


      void  OnTriggerEnter(Collider   other) {  }  两个GameObject接触


     (1)当碰撞器other进入触发器时OnTriggerEnter被调用。


     (2)这个消息是发送给触动触发器的碰撞器和刚体(或如果没有刚体的碰撞器)。注意:假如一个碰撞物体同时带有一个刚体属性那么只发送这个触发事件。


     void  OnTriggerStay(Collider   col){  } : 两个GameObject接触并黏住


     (1)每个碰撞器从进入触发器那一刻到退出触发器之前,几乎每帧都会调用OnTriggerStay+(同上注意:OnTriggerStay函数是基于物理计时器,因此它未必每帧都运行


    (2)解释注意:OnTriggerStay是在每一个Time.fixedDeltaTime的时间节点上运行,不是Time.deltaTime的时间节点上运行


     void  OnTriggerExit(Collider   col){  } : 两个GameObject分离


     (1)当碰撞器离开触发器时,调用OnTriggerExit+(同上)

 

    碰撞器:

     要查找全部被碰撞的碰撞器详情,你需要迭代接触点(contacts属性)。


     Collision.collider我们碰撞的碰撞器(只读)。


     Collision.rigibody我们碰撞的刚体(只读)。如果我们碰撞的物体是一个没有附加刚体的碰撞器,返回null


      void  OnCollisionEnter(Collision    col){   }  两个GameObject接触


      (1)collider/rigidbody开始触动另一个rigidbody/colliderOnCollisionEnter被调用。


      (2)相比OnTriggerEnterOnCollisionEnter传递Collision类而不是ColliderCollision类包含接触点,碰撞速度等信息。在这个函数如果你不使用collisionInfo,删去collisionInfo参数以避免不必要的计算。注意,如果碰撞器附加一个非动力学刚体,也仅发送碰撞事件。


      void  OnCollisionStay(Collision    col){   } :两个GameObject接触并黏住


      (1) 一个碰撞器刚体触动另一个刚体碰撞器,在每帧都会调用OnCollisionStay,直到它们之间离开不接触。+(同上)


      void  OnCollisionExit( Collision   col){   } : 两个GameObject分离


      (1) collider/rigidbody停止触动另一个 rigidbody/collider时,OnCollisionExit被调用。+(同上)。


    接触点:


      Collider.contacts: 每一个接触(contact)包含一个接触点、法线和两个碰撞的碰撞器(看ContactPoint)。在OnCollisionStayOnCollisionEnter里你确保contacts至少有一个元素。


      ContactPoint[]:接触点列表


      ContactPoint 接触点:描述碰撞发生那里的一个接触点;接触点被储存在Collision碰撞结构。


      point 接触点;normal 接触点的法线;thisCollider 第一个接触的碰撞器;otherCollider 接触的其他碰撞器,如下代码:


void OnCollisionEnter(Collision other) {

      print("Points colliding: " + other.contacts.Length);

      print("First normal of the point that collide: " + other.contacts[0].normal);

}

void OnCollisionEnter(Collision other) {

      print("This collider collided with: " + other.contacts[0].otherCollider.name);

      }


     3、忽略碰撞

     Public Transform/GameObject    cube忽略对象

     void Start(){Physics.IgnorCollision(cube.collider,this.collider );}

  

0 0