Unity3D总结记录(五) Unity中关于碰撞检测的几种方法总结

Unity中,对于游戏对象的碰撞检测有多种方法,今后在开发的过程中,可视情况而定,选用哪一种检测方法.

首先,忽略两个物体碰撞可采用如下语句:

Physics.IgnoreCollision(newBullet.GetComponent<Collider>(),transform.root.GetComponent<CharacterController>(),true);

1.1 在需要检测碰撞的物体上添加碰撞器,如:Box Collider、capsule Collider、Sphere Collider等.然后编写脚本,使用如下方法检测碰撞状态,此方法的好处是,只需要将脚本挂在检测物体对象上即可,无需将检测脚本挂在游戏角色身上,减轻角色挂载脚本的负荷.

  private void OnTriggerEnter(Collider other)   //检测函数,并将检测的结果放入other变量中.
    {
        if (other.gameObject.tag=="player")    //将检测结果的碰撞对象标签与player标签对比.判断是否相等
        {

            theDoor.GetComponent<Animation>().Play("Default Take");

            Debug.Log("Collide the door");

        }

    }

1.2 相对应的,离开碰撞区域的函数如下:

   private void OnTriggerExit(Collider other1)
    {
        if (other1.gameObject.tag=="player")
        {
            Debug.Log("exit the mat");
        }
        


    }



2.1光线投射方法,此方法无论射线碰到什么物体都会有反应,且没有存储射线碰到物体的信息,代码如下:

       //光线发射起点Vector3,方向Vector3,发射距离float.直接返回bool类型.对应if语句内的操作

 if (Physics.Raycast(transform.position, transform.forward, 3))

        {
            GameObject.Find("outPost").GetComponent<Animation>().Play("Default Take");

        }

2.2       //创建一条从游戏物体发射至前面3米的射线 

        Ray myRay = new Ray(transform.position, (transform.position + transform.forward * 3));

        RaycastHit hit;   //创建RaycastHit型变量,用于存放射线碰撞信息

       //发设一条射线,myRay距离3长,碰撞到的物体信息存放在hit中,放在下面进行判断。        

        if (Physics.Raycast(myRay,out hit,3))   
        {
            if (hit.collider.gameObject.tag=="tagDoor")
            {
                GameObject.Find("outPost").GetComponent<Animation>().Play("Default Take");
            }
        }
    }


3.取得游戏对象上 CharacterController组件的控制权,再利用碰撞语句检测是否发生碰撞.代码如下:

bool grounded=false;

void Upda(){

CharacterController controller = GetComponent<CharacterController>();

//将游戏物体的运动情况存在变量flags中,以便下面对游戏物体进行检测

CollisionFlags flags= controller.Move(moveDirection * Time.deltaTime);

        //检测游戏角色碰撞信息flags与CollisionFlags.CollidedSides中存放的信息进行二进制与运算.并将结果返回

        /*
         CollisionFlags.CollidedBelow   底部发生了碰撞"flags & CollisionFlags.CollidedBelow"返回1;
         CollisionFlags.CollidedNone    没发生碰撞"flags & CollisonFlags.CollidedNone"返回1;
         CollisionFlags.CollidedSides   四周发生碰撞"flags & CollisionFlags.CollidedSides"返回1;
         CollisionFlags.CollidedAbove   顶端发生了碰撞"flags & CollisionFlags.CollidedAbove"返回1;
         */

        //grounded = (CollisionFlags.CollidedSides & flags) != 0;  //  检测游戏物体四周是否发生碰撞,如发生碰撞,返回true执行下面if语句中的内容;
       //grounded = (CollisionFlags.CollidedBelow & flags) != 0;  //  检测游戏物体四周是否发生碰撞,如发生碰撞,返回true执行下面if语句中的内容;
      grounded = (CollisionFlags.CollidedAbove & flags) != 0;  //  检测游戏物体四周是否发生碰撞,如发生碰撞,返回true执行下面if语句中的内容;

        if (grounded)
        {
            player.GetComponent<Animation>().Play("Default Take");
        }

}

4. 关于2D物体碰撞的检测,具体检测函数可参考API编程手册,以下是其中碰撞检测的一个函数应用举例:

首先需要给检测的两个物体都添加Rigidbody2D及Box Collider碰撞检测组件。函数如下:

    void OnTriggerEnter2D(Collider2D other)

    {

        Debug.Log("Collider");

        if (other.tag == "Player")
        {
            Destroy(other.gameObject);
        }

    }

其他关于2D碰撞的检测函数参考API编程手册中搜索Collider。


如上三种碰撞检测方法,都可在游戏开发中使用,可根据实际情况选择.

猜你喜欢

转载自blog.csdn.net/weixin_39591280/article/details/80787894