碰撞器和触发器

碰撞器由来

1.系统默认会给每个对象(GameObject)添加一个碰撞组件(ColliderComponent),一些背景对象则可以取消该组件。

2.在Unity3D中,能检测碰撞发生的方式有两种,一种是利用碰撞器,另一种则是利用触发器。这两种方式的应用非常广泛。为了完整的了解这两种方式,我们必须理解以下概念:
(一)碰撞器是一群组件,它包含了很多种类,比如:Box Collider,Capsule Collider等,这些碰撞器应用的场合不同,但都必须加到GameObjecet身上。
(二)所谓触发器,只需要在检视面板中的碰撞器组件中勾选IsTrigger属性选择框
(三)在Unity3d中,主要有以下接口函数来处理这两种碰撞检测:

触发信息检测:
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 )  当逗留碰撞器


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

public class bullet : MonoBehaviour {
    void OnCollisionEnter(Collision col)
    {
        if (col.gameObject.tag.Equals("Player"))
        {
            Debug.Log("OnCollisionEnter");
        }
    }
    void OnCollisionStay(Collision col)
    {
        if (col.gameObject.tag.Equals("Player"))
        {
            Debug.Log("OnCollisionStay");
        }
    }
    void OnCollisionExit(Collision col)
    {
        if (col.gameObject.tag.Equals("Player"))
        {
            Debug.Log("OnCollisionExit");
        }
    }
    void OnTriggerEnter(Collision col)
    {
        if (col.gameObject.tag.Equals("Player"))
        {
            Debug.Log("..OnTriggerEnter");
        }
    }
    void OnTriggerStay(Collision col)
    {
        if (col.gameObject.tag.Equals("Player"))
        {
            Debug.Log("..OnTriggerStay");
        }
    }
    void OnTriggerExit(Collision col)
    {
        if (col.gameObject.tag.Equals("Player"))
        {
            Debug.Log("..OnTriggerExit");
        }
    }
}


触发器:



主角碰到一些物体后会有一系列反应。举例,完雷电游戏时,飞机可以获取一些 加速球能量球,碰到这些球体,飞机自身属性会有所提高
下图:蓝色球为“ 加速球”,红色球为 能量球,的当飞机接触球体时,属性就会增加


代码如下:

using UnityEngine;  
using System.Collections;  
  
public class Hero : MonoBehaviour {  
  
    private float move_v = 0;//纵向移动距离  
    private float move_h = 0;//横向移动距离  
    public float m_speed = 1.5f;//移动速度  
    public float m_power = 1.0f;//飞机的威力能量  
    private Transform m_transform;  
  
    void Start () {  
        m_transform = this.transform;  
    }  
      
      
    void Update () {  
        Move();  
    }  
  
     
   //飞机与物体发生碰撞,需要判断碰撞体是什么类型  
    void OnTriggerEnter(Collider e)  
    {  
        if (e.gameObject.tag.CompareTo("tagSpeedBall")==0)  
        {   
            Debug.Log("捡到加速球");  
            m_speed += 5;//速度+2  
            Destroy(e.gameObject);//销毁加速球  
        }  
  
        if (e.gameObject.tag.CompareTo("tagPowerBall") == 0)  
        {  
            Debug.Log("捡到能量球");  
            m_power += 2;//威力+2  
            Destroy(e.gameObject);//销毁能量球  
        }  
    }  
    //移动方法  
    void Move()  
    {  
        //向上  
        if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow))  
        {  
            //移动距离  
            m_transform.Translate(-Vector3.forward * Time.deltaTime * m_speed);  
  
        }  
        //向下  
        if (Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow))  
        {  
  
            m_transform.Translate(Vector3.forward * Time.deltaTime * m_speed);  
  
        }  
  
        //向左  
        if (Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow))  
        {  
  
            m_transform.Translate(Vector3.right * Time.deltaTime * m_speed);  
        }  
  
        //向右  
        if (Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow))  
        {  
  
            m_transform.Translate(Vector3.left * Time.deltaTime * m_speed);  
        }  
  
    }  
  
}  

unity3d中的碰撞器和触发器的区别?
 
碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性
当Is Trigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter/Stay/Exit函数;
当Is Trigger=true时,碰撞器被物理引擎所忽略,没有碰撞效果,可以调用OnTriggerEnter/Stay/Exit函数。
 
如果既要检测到物体的接触又不想让碰撞检测影响物体移动或要检测一个物件是否经过空间中的某个区域这时就可以用到触发器
 
例子:
碰撞器:汽车被撞飞、皮球掉在地上又弹起效果
触发器:人站在靠近门的位置门自动打开效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值