本篇内容介绍Unity中的碰撞器与触发器。 这些分为2D和3D,本篇以3D举例,2D类似。效果图见四.3.2
一、碰撞器与触发器的区别
1.是否发生物理碰撞:
碰撞器顾名思义会导致物理之前的物理碰撞,但触发器不会,不引起物理碰撞,只检测物体进入或离开触发区域。
碰撞器由于发生物理碰撞所以会阻止物体穿过进而发生相互作用,但触发器可以自由进出触发区域。
2.使用场景:
所以一般情况下当物体之间实际碰撞时使用碰撞器,只需要判断进出某个区域则用触发器
二、碰撞器/触发器功能
1.碰撞器功能:
碰撞器用于物理交互,他的主要功能包括:
1.1实现物体之间的真实物理交互效果,如碰撞,反弹等物理现象
1.2防止物体穿墙等类似效果
1.3检测是否与其他对象碰撞,在需要时执行相应的逻辑,如播放音乐等。一般这样情况使用触发器。
2.触发器功能:
1.检测到物体进入/离开/停留在触发区域时可以执行相应事件,见上面1.3。
三、碰撞器/触发器种类
碰撞器与触发器种类相同就是把Is Trigger勾选就好了。
1.Box Collider:
2.Sphere Collider:
3.Capsule Collider:
4.Mesh Collider:
5.还有Wheel Collider/Terrain Collider/Edge Collider:
由于我暂时没有项目用到,这里不做解释,等后续使用会补充。
6.Character Controller:
如果你使用Character Controller自带的碰撞器,使用方法看第四点。
四、碰撞器与触发器的使用方法
1.添加刚体组件:
添加刚体组件以满足你需要碰撞或触发的两个物体至少有一个具有刚体组件。
如果你仅需检测碰撞后执行某功能或方法,可以设置为运动学刚体避免影响你物体的正常运动。
如果你使用Character Controller则不需要添加刚体组件。
2.碰撞器使用方法:
2.1创建脚本:
创建脚本挂载到合适位置,这里我演示放到了碰撞物体上。
2.2方法:
private void OnCollisionEnter(Collision collision)
{
}
private void OnCollisionStay(Collision collision)
{
}
private void OnCollisionExit(Collision collision)
{
}
方法有三种,进入,停留,离开,这里具体使用方法举例放到触发器里。
3.触发器使用方法:
3.1使用条件:
有一方有触发器即可,与刚体类似。
3.2方法:
public GameObject ColliderSphere;
public GameObject CollidedCube;
private Color colorSphere;
private Color colorCube;
private void Start()
{
colorSphere = ColliderSphere.gameObject.GetComponent<MeshRenderer>().material.color;
colorCube = CollidedCube. gameObject.GetComponent<MeshRenderer>().material.color;
}
private void OnTriggerEnter(Collider other)
{
if (other.gameObject.name == "Cube")
{
ColliderSphere.gameObject.GetComponent<MeshRenderer>().materials[0].color = Color.red;
}
}
private void OnTriggerStay(Collider other)
{
if (other.gameObject.name == "Cube")
{
Debug.Log("物体停留");
}
}
private void OnTriggerExit(Collider other)
{
if (other.gameObject.name == "Cube")
{
ColliderSphere.gameObject.GetComponent<MeshRenderer>().materials[0].color = colorSphere;
CollidedCube.gameObject.GetComponent<MeshRenderer>().materials[0].color = colorCube;
}
}
具体看触发进入方法中,判断触发检测到的物体名字是否与你想要的一样,如果一样则实现某种功能,这里我实现变色,没进入前是这样的:
进入后圆球变红色:
这个窗口的打开位于:Window->General->Console
4.Character Controller碰撞器使用方法:
private void OnControllerColliderHit(ControllerColliderHit hit)
{
}