关于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 () { }
}
上一篇:C# winform窗体在桌面右下角显示(任务栏上方)


下一篇:VMware无法识别USB设备