UNITY 游戏对象的碰撞检测方法

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

触发信息检测:
1.MonoBehaviour.OnTriggerEnter( Collider other )当进入触发器
2.MonoBehaviour.OnTriggerExit( Collider other )当退出触发器
3.MonoBehaviour.OnTriggerStay( Collider other )当逗留触发器

碰撞信息检测:
1.MonoBehaviour.OnCollisionEnter( Collision collisionInfo ) 当进入碰撞器
2.MonoBehaviour.OnCollisionExit( Collision collisionInfo ) 当退出碰撞器
3.MonoBehaviour.OnCollisionStay( Collision collisionInfo )  当逗留碰撞器
————————————————
版权声明:本文为CSDN博主「qq_30454411」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_30454411/article/details/79810922

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

Physics.IgnoreCollision(newBullet.GetComponent(),transform.root.GetComponent(),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))

扫描二维码关注公众号,回复: 10304322 查看本文章
    {
        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();

//将游戏物体的运动情况存在变量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");
    }

}

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

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

void OnTriggerEnter2D(Collider2D other)

{

    Debug.Log("Collider");

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

}

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

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

作者:JamieHs
来源:CSDN
原文:https://blog.csdn.net/weixin_39591280/article/details/80787894
版权声明:本文为博主原创文章,转载请附上博文链接!

发布了49 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_23158477/article/details/94391307