在关于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 () { } }