Unity3d--碰撞检测

发生碰撞检测有两个必要条件:
1.发生碰撞的物体都要有碰撞器
2.有一个物体要有刚体(一般是运动的一方具有刚体组件)

碰撞器常用类:

3D碰撞器下对应的是2D碰撞器,在做游戏时,应填加相应的碰撞器

  1. Box Collider
    盒子碰撞器,外形是方体

  2. Capsule Collider
    胶囊体碰撞器,外形是胶囊

  3. Mesh Collider
    网格碰撞器,以网格的形状覆盖在物体上,运算量大

  4. Sphere Collider
    球体碰撞器,形状为球体

*碰撞器的选择与游戏物体的大致形状有关 *
Unity3d--碰撞检测_第1张图片

刚体组件

Unity3d--碰撞检测_第2张图片

碰撞检测

碰撞分为三个阶段:

  • OnCollisionEnter
    两个物体刚接触时,有点像物理中的时刻,只触发一次
    OnCollisionEnter传送门
  • OnCollisionStay
    两个物体接触一段时间,可以触发多次
    OnCollisionStay 传送门
  • OnCollisionExit
    两个物体刚离开的时刻,只触发一次
    OnCollisionExit传送门

演示一下吧:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CollisionText : MonoBehaviour {

	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
		
	}
//三种碰撞对比
    void OnCollisionEnter(Collision collision)
    {
        Debug.Log("碰撞时。");
    }
    void OnCollisionStay(Collision collision)
    {
        Debug.Log("碰撞中。。。");
    }
    void OnCollisionExit(Collision collision)
    {
        Debug.Log("碰撞结束。");
    }
}


Unity3d--碰撞检测_第3张图片
可以看见,Console面板中的输出,碰撞时和碰撞结束分别只调用一次,而碰撞中,每帧调用多次。

碰撞器的一些应用
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player1 : MonoBehaviour {

    private Rigidbody rd;      //创建一个刚体类型的对象
    public float force=5.0f;   //定义成public类型,就可以在Inspector面板上直接更改值
	// Use this for initialization
	void Start () {
        rd = GetComponent<Rigidbody>();     //得到当前物体的刚体组件属性,并赋值给rd
	}
	
	// Update is called once per frame
	void Update () {
        //用来得到水平的按键   a返回-1   d返回1
        float h = Input.GetAxis("Horizontal");
        //用来得到水平的按键   s返回-1   w返回1
        float v = Input.GetAxis("Vertical");
        rd.AddForce(new Vector3(h, 0, v)*force);   
	}
    //碰撞检测   会有实际的物理效果
    void OnCollisionEnter(Collision collision)
    {
        // collision.collider 获取碰撞物体上的collider组件
        //string name = collision.collider.name;     //得到碰撞物体的名字为字符串类型
        //print(name);    在Console面板中输出名字
        if(collision.collider.tag=="pickup")    
        {
            //如果碰撞物体的标签是pickup就销毁
            Destroy(collision.collider.gameObject);    
        }
    }
}

你可能感兴趣的:(Unity,3D)