Unity2D碰撞检测

     很简单的一个判断:打飞机游戏中检测飞机与敌方子弹是否碰撞。写起来却废了我这个菜鸟不少功夫

     最开始, 我想到的是用OnTriggerEnter检测飞机与子弹相撞,但是无论怎么调试,都无法触发,只能作罢。这一点以后要了解一下,为什么无法触发。或许是自己一直没有写对?

  private void OnTriggerEnter2D(Collider2D coll)
   {
        if(coll.tag == "Player")
        {
            Debug.Log("碰撞发生");
            GameObject.Destroy(this.gameObject);
        }
    }

        然后就想到用OnColliderEnter检测碰撞。这里要注意OnColliderEnter中的参数Collision与OnTriggerEnter中的参数Collider的区别。Collision.gameObject是与当前物体碰撞的物体的引用,而Collider.gameObject是进入触发器范围内的目标物体的引用。也就是说:Collision.gameObject指向的是与OnColliderEnter方法所在脚本所挂载的游戏物体碰撞的游戏物体(对方);Collider.gameObject指向的是OnTriggerEnter方法所在脚本所挂载的游戏物体自身(因为触发器包裹的一般就是游戏物体自身)。

    private void OnCollisionEnter2D(Collision2D coll)
    {
        if (coll.gameObject.tag == "EnemyBullet")
        {
            Debug.Log("碰撞发生(角色脚本)");
            GameObject.Destroy(this.gameObject);
            Debug.Log("玩家角色被销毁");
        }
    }
    private void OnCollisionEnter2D(Collision2D coll)
    {
        if (coll.gameObject.tag == "Player")
        {
            Debug.Log("碰撞发生(子弹脚本)");
            GameObject.Destroy(this.gameObject);
            Debug.Log("敌方子弹被销毁");
        }
    }


        以上是两个脚本中的代码,前者挂载在飞机上,后者挂载在敌方子弹上。另外,如果不销毁游戏物体,仅做输出调试的话,会发现飞机与子弹相撞时子弹把飞机“推走了”。这显然不符合需求,特别是如果后期需要给飞机添加无敌功能的时候。这时我们可以把飞机的Rigidbody 2D组件下的Body Type 这个属性修改为“Kinematic(运动学的)”。至于Body Type的三个选项的详细介绍,可以参考这篇博客:https://blog.csdn.net/SerenaHaven/article/details/78851089

你可能感兴趣的:(Unity2D碰撞检测)