Unity中OnTriggerEnter2D 和OnCollisionEnter2D 的使用情形及容易掉的坑

OnTriggerEnter2D :触发器 和 OnCollisionEnter2D:碰撞器
①触发器是碰撞器的一个功能
②在想要做碰撞检测时使用碰撞器
③碰撞器生效的必要条件,碰撞的双方A,B都必须都Collider,其中有一方要带有rigidbody。
④当想要做碰撞检测却又不想产生碰撞效果时,就可以用isTrigger,在这个状态下触发检测生效,碰撞检测失效。

例子 一个物体与多个其他物体做碰撞检测应怎样写。
当两类物体需要相互碰撞,应尽可能的用某一方来检测,以避免 两者碰撞触发时机不确定,谁先谁后不确定的问题。
我在做一个弹跳的主角(A)碰到元素(B,有很多),时 需要给主角触发一个反弹效果,还需要将元素隐藏。 起初,我把A的触发效果写在A的碰撞检测里面 ,B的隐藏方法写在B的碰撞检测里面。 这样的话 就会发现 A 碰到B的时候,A有时候能触发反弹效果,有时候却不能,但是B都是隐藏了。 究其原因是,A和B相互碰撞时,两者的碰撞检测谁先谁后是不确定的,有可能A先检测到,也有可能B先检测到。
如果是A先检测到,那好没问题,效果可以触发,然后B检测到,B消失。
可如果是B先检测到,那B就消失了,这时候A是检测不到B的,因为B已经消失,所以A的效果也就没触发。 就会有上面描述的很奇怪的现象了。
避免这类情况发生,应将碰撞检测时想要触发的效果和方法都写在一边! 一开始我全部写在A里面,又出现问题了,A的反弹效果和B消失都能执行,但每次只能执行一次,A一次碰到多个B的时候,按照逻辑,应该将碰到的多个B都消失,可这样的写法,只能将检测到的第一个B消失,然后执行反弹效果,脱离了与其他未消失B的检测范,导致B不能执行消失方法。 这样不好。
最佳办法是,将检测写在B里面,当A接触到B时,B每一个都自己来检测A,A能执行效果,B也能正常消失。

贴上部分代码

 public override void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.tag == "Player" && BisonController.Instance.bisonState == BisonState.down)
        {
            BisonController.Instance.Rebound();
            BisonController.Instance.VandH(new Vector2(0,-3));

            BisonController.Instance.bisonState = BisonState.up;
            Debug.Log("NPC1的反弹效果");
        }

        base.OnTriggerEnter2D(collision);
    }

你可能感兴趣的:(unity,碰撞器)