关于Unity中的刚体和碰撞器的相关用法(二)

在关于Unity中的刚体和碰撞器的相关用法(一)的基础上

有一个plane平面,一个ball球体,都挂了碰撞器,ball挂了刚体Rigidbody,写了一个脚本ball挂载在球体上,球体从空中落下装机plane

 

碰撞检测

一、当两个物体发生碰撞时,也就是两个节点的碰撞器相互碰撞的时候,就会去调用节点上所关联的所有脚本对象的固定的函数

  1: OnCollisionEnter: 开始碰撞;
  2: OnCollisionExit: 碰撞离开;
  3: OnCollisionStay 碰撞持续;

ball脚本里面的内容:

using UnityEngine;
using System.Collections;

public class ball : MonoBehaviour {
    Rigidbody body;
    // Use this for initialization
    void Start () {
        this.body = this.GetComponent<Rigidbody>();
    }

    // 碰撞开始
    void OnCollisionEnter(Collision c) {
        Debug.Log("OnCollisionEnter " + c.gameObject.name);//打印出的名字是plane,不是ball,指的是撞到的对方是谁,参数是Collision类型的
    }

    // 碰撞持续
    void OnCollisionStay(Collision c) {
        Debug.Log("OnCollisionStay " + c.gameObject.name);
    }
    // 碰撞结束
    void OnCollisionExit(Collision c) {
        Debug.Log("OnCollisionExit " + c.gameObject.name);
    }

    // Update is called once per frame
    void Update () {
    
    }
}

 

二、触发器的碰撞类型

  在Collider组件里面勾选is trigger就是开启触发器模式,这时候这个挂载Collider的节点的形状就变成透明的了,不会阻碍其他节点穿过它,但是依然在接触的时候调用触发函数。

  触发器的碰撞检测是不一样的,两个物体之间没有任何物理碰撞效果,但是只要有接触,就会调用触发器函数。

  我们给ball和plane之间创建一个trigger空节点,添加一个Box Collider的碰撞器,勾选is trigger,再写一个脚本trigger挂载在trigger下面,球的材质弹性设置为Maxinum类型

  这样每次ball穿过trigger节点掉到Plane上,再弹起来又穿过trigger都会去调用相关的触发器函数。

  1: OnTriggerEnter: 开始碰撞到触发器;
  2: OnTriggerExit: 与触发器结束碰撞;
  3: OnTriggerStay; 与触发器碰撞持续;

 

trigger脚本里面的内容:

using UnityEngine;
using System.Collections;

public class trigger : MonoBehaviour {

    // Use this for initialization
    void Start () {
    
    }

    // 开始和触发器碰撞
    void OnTriggerEnter(Collider c) {
        Debug.Log("OnTriggerEnter " + c.gameObject.name);//打印出的是ball的名字,不是plane,指的是撞到的对方是谁,参数是Collider类型的
    }

    // 结束和触发器碰撞
    void OnTriggerExit(Collider c) {
        Debug.Log("OnTriggerExit " + c.gameObject.name);
    }

    // 持续和触发器碰撞
    void OnTriggerStay(Collider c) {
        Debug.Log("OnTriggerStay " + c.gameObject.name);
    }

    // Update is called once per frame
    void Update () {
    
    }
}

 

三、配置物理管理器的碰撞关系

Edit-->Project Settings-->Physics

面板里面的参数都可以在代码中通过一个Physics类型的对象来调用,Physics这个类型非常重要,就是通过它可以在代码中设置Edit-->Project Settings-->Physics面板里面的内容:

1: Physics.gravity: 物理世界重力加速度;
2: bounceThreshold: 是否反弹的阈值
3: sleepThreshold: 低于这个能量,物体休眠
4: queriesHitTriggers: 射线碰撞检测是否检测trigger;
5: solverIterationCount / solverVelocityIterationCount;
6: defaultContactOffset 默认接触的偏差;
5: IgnoreCollision(Collider collider1, Collider collider2, bool ignore)配置忽略两个指定的碰撞器碰撞;
6: IgnoreLayerCollision(int layer1, int layer2, bool ignore) 配置两个层的物体是否碰撞;参数里面的Int类型的变量指的就是在右上角Add layer的时候,每个层前面对应的数值

 

创建一个game_root节点,下面挂载一个game_scene脚本

game_scene脚本的内容如下:

using UnityEngine;
using System.Collections;

public class game_scene : MonoBehaviour {
    public Collider ball;
    public Collider trigger;
    // Use this for initialization
    void Start () {
        Debug.Log(Physics.gravity);
        Debug.Log(Physics.bounceThreshold);

        // Physics.IgnoreLayerCollision(8, 9);
        Physics.IgnoreCollision(this.ball, this.trigger);//ball和trigger不发生碰撞检测,什么都不发生
    }
    
    // Update is called once per frame
    void Update () {
    
    }
}

 

posted @ 2017-07-20 10:31  杭者  阅读(1570)  评论(0编辑  收藏  举报